aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/line-styles/setLineDash.html.ini8
-rw-r--r--tests/wpt/metadata/FileAPI/FileReaderSync.worker.js.ini2
-rw-r--r--tests/wpt/metadata/FileAPI/idlharness.worker.js.ini49
-rw-r--r--tests/wpt/metadata/MANIFEST.json3351
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_bits.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_keys.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/hkdf.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/pbkdf2.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/digest/digest.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_cbc.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_ctr.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_gcm.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/rsa.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/generateKey/failures.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/generateKey/failures_AES-CBC.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/generateKey/failures_AES-CTR.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/generateKey/failures_AES-GCM.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/generateKey/failures_AES-KW.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/generateKey/failures_ECDH.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/generateKey/failures_ECDSA.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/generateKey/failures_HMAC.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/generateKey/failures_RSA-OAEP.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/generateKey/failures_RSA-PSS.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/generateKey/failures_RSASSA-PKCS1-v1_5.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/generateKey/successes.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/generateKey/successes_AES-CBC.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/generateKey/successes_AES-CTR.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/generateKey/successes_AES-GCM.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/generateKey/successes_AES-KW.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/generateKey/successes_ECDH.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/generateKey/successes_ECDSA.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/generateKey/successes_HMAC.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/generateKey/successes_RSA-OAEP.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/generateKey/successes_RSA-PSS.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/generateKey/successes_RSASSA-PKCS1-v1_5.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/idlharness.worker.js.ini8
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/import_export/ec_importKey.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/import_export/rsa_importKey.worker.js.ini3
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/import_export/symmetric_importKey.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/sign_verify/ecdsa.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/sign_verify/hmac.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pkcs.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pss.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker.js.ini2
-rw-r--r--tests/wpt/metadata/WebIDL/current-realm.html.ini95
-rw-r--r--tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js.ini2
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/abort-during-open.htm.ini5
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/abort-during-open.worker.js.ini5
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/abort-event-abort.htm.ini5
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/responsexml-basic.htm.ini3
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/send-after-setting-document-domain.htm.ini3
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/send-data-unexpected-tostring.htm.ini5
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/send-usp.worker.js.ini3
-rw-r--r--tests/wpt/metadata/dom/collections/HTMLCollection-supported-property-indices.html.ini9
-rw-r--r--tests/wpt/metadata/dom/collections/HTMLCollection-supported-property-names.html.ini5
-rw-r--r--tests/wpt/metadata/dom/events/Event-dispatch-click.html.ini24
-rw-r--r--tests/wpt/metadata/dom/nodes/DOMImplementation-createDocument.html.ini14
-rw-r--r--tests/wpt/metadata/dom/nodes/Document-createElement.html.ini251
-rw-r--r--tests/wpt/metadata/dom/nodes/Document-createElementNS.html.ini596
-rw-r--r--tests/wpt/metadata/dom/nodes/Element-matches.html.ini66
-rw-r--r--tests/wpt/metadata/dom/nodes/ParentNode-querySelector-All-xht.xht.ini156
-rw-r--r--tests/wpt/metadata/dom/nodes/ParentNode-querySelector-All.html.ini156
-rw-r--r--tests/wpt/metadata/dom/ranges/Range-mutations-appendChild.html.ini107
-rw-r--r--tests/wpt/metadata/dom/ranges/Range-mutations-appendData.html.ini578
-rw-r--r--tests/wpt/metadata/dom/ranges/Range-mutations-dataChange.html.ini (renamed from tests/wpt/metadata/dom/ranges/Range-mutations.html.ini)4229
-rw-r--r--tests/wpt/metadata/dom/ranges/Range-mutations-deleteData.html.ini848
-rw-r--r--tests/wpt/metadata/dom/ranges/Range-mutations-insertBefore.html.ini116
-rw-r--r--tests/wpt/metadata/dom/ranges/Range-mutations-insertData.html.ini575
-rw-r--r--tests/wpt/metadata/dom/ranges/Range-mutations-removeChild.html.ini32
-rw-r--r--tests/wpt/metadata/dom/ranges/Range-mutations-replaceChild.html.ini92
-rw-r--r--tests/wpt/metadata/dom/ranges/Range-mutations-replaceData.html.ini1721
-rw-r--r--tests/wpt/metadata/dom/ranges/Range-mutations-splitText.html.ini176
-rw-r--r--tests/wpt/metadata/domparsing/createContextualFragment.html.ini3
-rw-r--r--tests/wpt/metadata/domparsing/innerhtml-02.html.ini5
-rw-r--r--tests/wpt/metadata/encoding/textdecoder-fatal-single-byte.html.ini5
-rw-r--r--tests/wpt/metadata/eventsource/eventsource-onmessage-realm.htm.ini5
-rw-r--r--tests/wpt/metadata/eventsource/interfaces.html.ini1
-rw-r--r--tests/wpt/metadata/eventsource/request-cache-control.htm.ini1
-rw-r--r--tests/wpt/metadata/fetch/api/basic/conditional-get.html.ini5
-rw-r--r--tests/wpt/metadata/fetch/api/basic/error-after-response.html.ini8
-rw-r--r--tests/wpt/metadata/fetch/api/basic/integrity-sharedworker.html.ini3
-rw-r--r--tests/wpt/metadata/fetch/api/basic/request-headers-worker.html.ini3
-rw-r--r--tests/wpt/metadata/fetch/api/basic/request-headers.html.ini3
-rw-r--r--tests/wpt/metadata/fetch/api/basic/request-upload-worker.html.ini20
-rw-r--r--tests/wpt/metadata/fetch/api/basic/request-upload.html.ini20
-rw-r--r--tests/wpt/metadata/fetch/api/basic/scheme-data-worker.html.ini6
-rw-r--r--tests/wpt/metadata/fetch/api/basic/scheme-data.html.ini6
-rw-r--r--tests/wpt/metadata/fetch/api/basic/text-utf8.html.ini30
-rw-r--r--tests/wpt/metadata/fetch/api/cors/cors-cookies-worker.html.ini1
-rw-r--r--tests/wpt/metadata/fetch/api/cors/cors-cookies.html.ini1
-rw-r--r--tests/wpt/metadata/fetch/api/cors/cors-preflight-redirect-worker.html.ini32
-rw-r--r--tests/wpt/metadata/fetch/api/cors/cors-preflight-redirect.html.ini32
-rw-r--r--tests/wpt/metadata/fetch/api/cors/cors-preflight-status-worker.html.ini83
-rw-r--r--tests/wpt/metadata/fetch/api/cors/cors-preflight-status.html.ini83
-rw-r--r--tests/wpt/metadata/fetch/api/cors/cors-redirect-worker.html.ini4
-rw-r--r--tests/wpt/metadata/fetch/api/cors/cors-redirect.html.ini4
-rw-r--r--tests/wpt/metadata/fetch/api/redirect/redirect-count-worker.html.ini4
-rw-r--r--tests/wpt/metadata/fetch/api/redirect/redirect-count.html.ini4
-rw-r--r--tests/wpt/metadata/fetch/api/redirect/redirect-origin-worker.html.ini45
-rw-r--r--tests/wpt/metadata/fetch/api/redirect/redirect-origin.html.ini45
-rw-r--r--tests/wpt/metadata/fetch/api/request/multi-globals/url-parsing.html.ini5
-rw-r--r--tests/wpt/metadata/fetch/api/request/request-cache-default-conditional.html.ini4
-rw-r--r--tests/wpt/metadata/fetch/api/request/request-cache-default.html.ini8
-rw-r--r--tests/wpt/metadata/fetch/api/request/request-cache-force-cache.html.ini20
-rw-r--r--tests/wpt/metadata/fetch/api/request/request-cache-only-if-cached.html.ini44
-rw-r--r--tests/wpt/metadata/fetch/api/request/request-cache-reload.html.ini14
-rw-r--r--tests/wpt/metadata/fetch/api/request/request-cache.html.ini4
-rw-r--r--tests/wpt/metadata/fetch/api/request/request-consume-empty.html.ini6
-rw-r--r--tests/wpt/metadata/fetch/api/response/multi-globals/url-parsing.html.ini5
-rw-r--r--tests/wpt/metadata/fetch/api/response/response-clone.html.ini33
-rw-r--r--tests/wpt/metadata/fetch/api/response/response-consume-empty.html.ini9
-rw-r--r--tests/wpt/metadata/fetch/api/response/response-consume-stream.html.ini3
-rw-r--r--tests/wpt/metadata/fetch/api/response/response-consume.html.ini57
-rw-r--r--tests/wpt/metadata/hr-time/basic.worker.js.ini2
-rw-r--r--tests/wpt/metadata/hr-time/idlharness.html.ini14
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/history_go_to_uri.html.ini5
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/non-automated/traverse_the_session_history_unload_prompt_1.html.ini5
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-location-interface/location-prototype-setting.html.ini5
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-location-interface/location_hash.html.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-location-interface/security_location_0.htm.ini (renamed from tests/wpt/metadata/html/browsers/history/the-location-interface/security_location_0.sub.htm.ini)2
-rw-r--r--tests/wpt/metadata/html/browsers/sandboxing/sandbox-allow-same-origin.html.ini6
-rw-r--r--tests/wpt/metadata/html/browsers/sandboxing/sandbox-allow-scripts.html.ini6
-rw-r--r--tests/wpt/metadata/html/browsers/sandboxing/sandbox-disallow-same-origin.html.ini6
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/named-access-on-the-window-object/named-objects.html.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/security-window/window-security.html.ini (renamed from tests/wpt/metadata/html/browsers/the-window-object/security-window/window-security.sub.html.ini)2
-rw-r--r--tests/wpt/metadata/html/browsers/the-window-object/window-open-noopener.html.ini6
-rw-r--r--tests/wpt/metadata/html/browsers/windows/nested-browsing-contexts/frameElement.html.ini (renamed from tests/wpt/metadata/html/browsers/windows/nested-browsing-contexts/frameElement.sub.html.ini)5
-rw-r--r--tests/wpt/metadata/html/browsers/windows/targeting-cross-origin-nested-browsing-contexts.html.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/windows/targeting-cross-origin-nested-browsing-contexts.sub.html.ini6
-rw-r--r--tests/wpt/metadata/html/dom/documents/dom-tree-accessors/Document.currentScript.html.ini (renamed from tests/wpt/metadata/html/dom/documents/dom-tree-accessors/Document.currentScript.sub.html.ini)8
-rw-r--r--tests/wpt/metadata/html/dom/documents/dom-tree-accessors/document.forms.html.ini5
-rw-r--r--tests/wpt/metadata/html/dom/interfaces.html.ini121
-rw-r--r--tests/wpt/metadata/html/dom/reflection-embedded.html.ini11118
-rw-r--r--tests/wpt/metadata/html/dom/reflection-forms.html.ini7611
-rw-r--r--tests/wpt/metadata/html/dom/reflection-grouping.html.ini6102
-rw-r--r--tests/wpt/metadata/html/dom/reflection-metadata.html.ini2634
-rw-r--r--tests/wpt/metadata/html/dom/reflection-misc.html.ini5283
-rw-r--r--tests/wpt/metadata/html/dom/reflection-obsolete.html.ini5436
-rw-r--r--tests/wpt/metadata/html/dom/reflection-sections.html.ini6345
-rw-r--r--tests/wpt/metadata/html/dom/reflection-tabular.html.ini9012
-rw-r--r--tests/wpt/metadata/html/dom/reflection-text.html.ini10659
-rw-r--r--tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/htmlallcollection.html.ini93
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe-append-to-child-document.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini (renamed from tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping.html.ini)2
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini (renamed from tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping.html.ini)2
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-img-element/data-url.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-img-element/usemap-casing.html.ini11
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-object-element/usemap-casing.html.ini8
-rw-r--r--tests/wpt/metadata/html/semantics/forms/constraints/form-validation-checkValidity.html.ini30
-rw-r--r--tests/wpt/metadata/html/semantics/forms/constraints/form-validation-reportValidity.html.ini36
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-form-element/form-indexed-element.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-form-element/form-nameditem.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-input-element/radio-groupname-case.html.ini21
-rw-r--r--tests/wpt/metadata/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/grouping-content/the-ol-element/grouping-ol.html.ini15
-rw-r--r--tests/wpt/metadata/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-1.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-2.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/script-onload-insertion-point.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/tabular-data/the-table-element/remove-row.html.ini5
-rw-r--r--tests/wpt/metadata/html/webappapis/idle-callbacks/callback-exception.html.ini5
-rw-r--r--tests/wpt/metadata/html/webappapis/idle-callbacks/callback-iframe.html.ini5
-rw-r--r--tests/wpt/metadata/html/webappapis/idle-callbacks/callback-invoked.html.ini5
-rw-r--r--tests/wpt/metadata/html/webappapis/idle-callbacks/callback-multiple-calls.html.ini8
-rw-r--r--tests/wpt/metadata/html/webappapis/idle-callbacks/callback-timeout.html.ini5
-rw-r--r--tests/wpt/metadata/html/webappapis/idle-callbacks/cancel-invoked.html.ini8
-rw-r--r--tests/wpt/metadata/html/webappapis/idle-callbacks/idlharness.html.ini20
-rw-r--r--tests/wpt/metadata/html/webappapis/scripting/events/messageevent-constructor.https.html.ini3
-rw-r--r--tests/wpt/metadata/mozilla-sync2
-rw-r--r--tests/wpt/metadata/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini6
-rw-r--r--tests/wpt/metadata/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini6
-rw-r--r--tests/wpt/metadata/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini6
-rw-r--r--tests/wpt/metadata/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini6
-rw-r--r--tests/wpt/metadata/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini6
-rw-r--r--tests/wpt/metadata/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini6
-rw-r--r--tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini3
-rw-r--r--tests/wpt/metadata/url/a-element-xhtml.xhtml.ini8
-rw-r--r--tests/wpt/metadata/url/a-element.html.ini8
-rw-r--r--tests/wpt/metadata/url/url-constructor.html.ini8
-rw-r--r--tests/wpt/metadata/url/url-setters.html.ini381
-rw-r--r--tests/wpt/metadata/websockets/multi-globals/message-received.html.ini8
-rw-r--r--tests/wpt/metadata/workers/constructors/Worker/DedicatedWorkerGlobalScope-members.worker.js.ini2
-rw-r--r--tests/wpt/metadata/workers/constructors/Worker/expected-self-properties.worker.js.ini3
-rw-r--r--tests/wpt/metadata/workers/data-url-shared.html.ini5
-rw-r--r--tests/wpt/metadata/workers/interfaces.worker.js.ini72
-rw-r--r--tests/wpt/metadata/workers/interfaces/WorkerUtils/navigator/window-only.worker.js.ini11
-rw-r--r--tests/wpt/metadata/workers/semantics/interface-objects/001.worker.js.ini15
-rw-r--r--tests/wpt/metadata/workers/semantics/interface-objects/002.worker.js.ini2
-rw-r--r--tests/wpt/mozilla/meta/MANIFEST.json2
-rw-r--r--tests/wpt/mozilla/meta/css/matchMedia.html.ini1
-rw-r--r--tests/wpt/web-platform-tests/.gitignore1
-rw-r--r--tests/wpt/web-platform-tests/.travis.yml50
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/compositing/2d.composite.globalAlpha.canvascopy.html40
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.pngbin0 -> 205 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.pngbin0 -> 221 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.pngbin0 -> 221 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.pngbin0 -> 221 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.pngbin0 -> 221 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.pngbin0 -> 205 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.pngbin0 -> 205 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.pngbin0 -> 205 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.pngbin0 -> 205 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.pngbin0 -> 205 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.pngbin0 -> 221 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.pngbin0 -> 221 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.pngbin0 -> 221 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.pngbin0 -> 221 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.pngbin0 -> 205 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.pngbin0 -> 205 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.pngbin0 -> 205 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.pngbin0 -> 205 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.pngbin0 -> 205 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.pngbin0 -> 221 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.pngbin0 -> 221 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.pngbin0 -> 205 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.pngbin0 -> 221 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.pngbin0 -> 221 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.pngbin0 -> 205 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-2.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-2.pngbin0 -> 221 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.pngbin0 -> 221 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.pngbin0 -> 205 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.pngbin0 -> 221 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.pngbin0 -> 221 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-1.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-2.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-3.html (renamed from tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-7.html)6
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-4.html (renamed from tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-7.html)6
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-5.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-1.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-2.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-3.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-1.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-2.html (renamed from tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-4.html)6
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-3.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-4.html (renamed from tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-5.html)6
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-5.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-1.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-2.html (renamed from tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-6.html)6
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-3.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-5.html2
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-6.html2
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-3.html (renamed from tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-6.html)6
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-1.html2
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-2.html2
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-3.html2
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-1.html2
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-2.html2
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-3.html2
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-4.html2
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-5.html2
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/line-styles/setLineDash.html104
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/path-objects/2d.path.lineTo.nonfinite.details.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/tools/tests2d.yaml112
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/idbcursor-continuePrimaryKey-exception-order.htm382
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/idbindex-rename-abort.html110
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/idbindex-rename-errors.html130
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/idbindex-rename.html298
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/idbobjectstore-rename-abort.html120
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/idbobjectstore-rename-errors.html118
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/idbobjectstore-rename-store.html366
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/interfaces.html4
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/interfaces.idl13
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/interfaces.worker.js6
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/support-promises.js200
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/transaction-abort-generator-revert.html108
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/transaction-abort-index-metadata-revert.html276
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/transaction-abort-multiple-metadata-revert.html291
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/transaction-abort-object-store-metadata-revert.html233
-rw-r--r--tests/wpt/web-platform-tests/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker.js1
-rw-r--r--tests/wpt/web-platform-tests/WebIDL/current-realm.html145
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/abort-after-send.htm39
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/abort-during-open.js4
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/abort-during-upload.htm2
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/abort-event-abort.htm5
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/abort-event-order.htm2
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/event-timeout-order.htm2
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/event-upload-progress-crossorigin.htm (renamed from tests/wpt/web-platform-tests/XMLHttpRequest/event-upload-progress-crossorigin.sub.htm)0
-rwxr-xr-xtests/wpt/web-platform-tests/XMLHttpRequest/open-during-abort.htm1
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/progress-events-response-data-gzip.htm28
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/send-after-setting-document-domain-window-1.htm23
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/send-after-setting-document-domain-window-2.htm20
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/send-after-setting-document-domain-window-helper.js29
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-event-order.js59
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/responsexml-basic.htm2
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/responsexml-document-properties.htm4
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/send-after-setting-document-domain.htm47
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/send-blob-with-no-mime-type.html24
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/send-data-unexpected-tostring.htm5
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/send-non-same-origin.htm (renamed from tests/wpt/web-platform-tests/XMLHttpRequest/send-non-same-origin.sub.htm)0
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/send-response-event-order.htm37
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/CONTRIBUTING.md4
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/annotations/annotationMusts-manual.html5
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/annotations/annotationOptionals-manual.html5
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/annotations/annotationOptionals.test1
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/annotations/annotationsAgentOptionals-manual.html5
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/annotations/annotationsAgentOptionals.test1
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.4-targNoTypeTextualBody.json8
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/3.3.1-collectionCreatedImplemented.json17
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/3.3.1-collectionCreatedValidated.json14
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/3.3.1-collectionCreatorImplemented.json16
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/3.3.1-collectionModifiedImplemented.json16
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/3.3.1-collectionModifiedValidated.json14
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentEmailImplemented.json24
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentEmail_sha1Implemented.json24
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentHomepageImplemented.json24
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentIdImplemented.json24
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentNameImplemented.json24
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentNicknameImplemented.json24
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentTypeImplemented.json24
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/3.3.6-collectionRightsImplemented.json16
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/3.3.6-collectionRightsValidated.json14
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionContextValidated.json20
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionFirstImplemented.json10
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionFirstValidated.json10
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionIdValidated.json11
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionLabelImplemented.json10
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionLabelValidated.json10
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionLastImplemented.json10
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionLastValidated.json10
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionTotalImplemented.json10
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionTotalValidated.json10
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionTypeValidated.json10
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/collectionMusts-manual.html49
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/collectionMusts.test19
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/collectionOptionals-manual.html49
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/collectionOptionals.test24
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatedImplemented.json37
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatedValidated.json24
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatorImplemented.json36
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageModifiedImplemented.json36
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageModifiedValidated.json24
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentEmailImplemented.json42
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentEmail_sha1Implemented.json42
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentHomepageImplemented.json42
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentIdImplemented.json43
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentNameImplemented.json42
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentNicknameImplemented.json45
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentTypeImplemented.json42
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.6-pageRightsImplemented.json31
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.6-pageRightsValidated.json24
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageContextValidated.json20
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageFirstImplemented.json25
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageFirstValidated.json23
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageIdValidated.json24
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageItemsValidated.json19
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLabelImplemented.json23
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLabelValidated.json23
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLastImplemented.json23
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLastValidated.json27
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageNextImplemented.json19
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageNextValidated.json23
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pagePartOfImplemented.json19
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pagePartOfValidated.json23
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pagePrevImplemented.json19
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pagePrevValidated.json23
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageStartIndexImplemented.json19
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageStartIndexValidated.json23
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageTotalImplemented.json23
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageTotalValidated.json23
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageTypeValidated.json19
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/pageMusts-manual.html49
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/pageMusts.test24
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/pageOptionals-manual.html49
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/collections/pages/pageOptionals.test28
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/definitions/bodyTarget.json512
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/definitions/choiceSet.json70
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/definitions/collections.json428
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/definitions/otherProperties.json480
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/definitions/specificResource.json883
-rw-r--r--tests/wpt/web-platform-tests/annotation-model/scripts/JSONtest.js64
-rwxr-xr-xtests/wpt/web-platform-tests/annotation-protocol/files/annotations/annotation.options.headers1
-rwxr-xr-xtests/wpt/web-platform-tests/annotation-protocol/files/annotations/collection.options.headers1
-rw-r--r--tests/wpt/web-platform-tests/annotation-protocol/server/server-manual.html27
-rwxr-xr-xtests/wpt/web-platform-tests/annotation-protocol/tools/protocol-server.py8
-rw-r--r--tests/wpt/web-platform-tests/bluetooth/bluetooth-helpers.js147
-rw-r--r--tests/wpt/web-platform-tests/check_stability.py599
-rw-r--r--tests/wpt/web-platform-tests/ci_lint.sh5
-rw-r--r--tests/wpt/web-platform-tests/ci_stability.sh33
-rw-r--r--tests/wpt/web-platform-tests/common/dummy.xhtml2
-rw-r--r--tests/wpt/web-platform-tests/common/dummy.xml1
-rw-r--r--tests/wpt/web-platform-tests/common/get-host-info.sub.js10
-rw-r--r--tests/wpt/web-platform-tests/compat/webkit-text-fill-color-currentColor.html19
-rw-r--r--tests/wpt/web-platform-tests/config.default.json3
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-dom-01-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-dom-01-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-dom-02-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-dom-02-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-elem-40-t-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-elem-40-t-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-script-elem-01-b-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-script-elem-01-b-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-struct-dom-01-b-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-struct-dom-01-b-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/conform-viewers-02-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/conform-viewers-02-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/coords-dom-03-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/coords-dom-03-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-events-02-b-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-events-02-b-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-01-b-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-01-b-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-03-b-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-03-b-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-05-b-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-05-b-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-07-t-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-07-t-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-08-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-08-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-09-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-09-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pointer-01-t-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pointer-01-t-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pointer-03-t-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pointer-03-t-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/masking-path-09-b-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/masking-path-09-b-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/paths-dom-01-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/paths-dom-01-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/paths-dom-02-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/paths-dom-02-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-cond-02-t-haswarn.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-cond-02-t-isvalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-07-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-07-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-08-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-08-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-11-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-11-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-13-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-13-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-14-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-14-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-15-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-15-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-20-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-20-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-use-13-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-use-13-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-dom-02-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-dom-02-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-dom-05-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-dom-05-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-tselect-02-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-tselect-02-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-tselect-03-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-tselect-03-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-02-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-02-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-03-b-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-03-b-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-05-b-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-05-b-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-07-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-07-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-08-f-isvalid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-08-f-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dd/dd-hgroup-isvalid.html5
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/article-in-dt-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/aside-in-dt-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dd-in-template-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-contains-dl-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-contains-text-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-multiple-groups-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-splitting-groups-2-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-splitting-groups-3-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-splitting-groups-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dl-contains-dl-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dl-contains-text-2-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dl-contains-text-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dl-in-p-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dl-isvalid.html34
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dt-in-template-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/empty-div-2-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/empty-div-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/first-dd-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/footer-in-dt-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h1-in-dt-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h2-in-dt-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h3-in-dt-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h4-in-dt-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h5-in-dt-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h6-in-dt-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/header-in-dt-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/hgroup-in-dt-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/last-dt-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/mixed-div-dt-dd-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/mixed-dt-dd-div-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/model-isvalid.html55
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/model-novalid.html75
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/nav-in-dt-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/nested-divs-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/only-dd-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/only-dt-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/section-in-dt-novalid.html4
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/messages.json75
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/tools/build-svg-tests.py137
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/tools/dl.py99
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/tools/index-isvalid.html451
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/tools/ins-del-datetime.py1
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/tools/url.py4
-rw-r--r--tests/wpt/web-platform-tests/console/OWNERS2
-rw-r--r--tests/wpt/web-platform-tests/console/console-is-a-namespace.any.js27
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/font-src/font-blacklisted-ref.html6
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/font-src/font-blacklisted.html9
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/font-src/font-whitelisted-ref.html6
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/font-src/font-whitelisted.html9
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/font-src/fonts.css8
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/navigation/to-javascript-url.html57
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_and_unsafe_eval_eval.html31
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_and_unsafe_eval_eval.html.headers5
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_and_unsafe_eval_new_function.html31
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_and_unsafe_eval_new_function.html.headers5
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_discard_whitelist.html32
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_discard_whitelist.html.headers5
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_different_nonce.html68
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_different_nonce.html.headers6
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_honor_whitelist.sub.html61
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_honor_whitelist.sub.html.headers6
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_report_only.html44
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_report_only.html.headers6
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_eval.html37
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_eval.html.headers5
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_hashes.html52
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_hashes.html.headers5
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_in_img-src.html32
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_in_img-src.html.headers5
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_meta_tag.html76
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_meta_tag.html.headers4
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_new_function.html37
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_new_function.html.headers5
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted.html76
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted.html.headers5
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted_incorrect_nonce.html29
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted_incorrect_nonce.html.headers5
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_parser_inserted.html205
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_parser_inserted.html.headers5
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_parser_inserted_correct_nonce.html110
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_parser_inserted_correct_nonce.html.headers5
-rwxr-xr-xtests/wpt/web-platform-tests/content-security-policy/script-src/simpleSourcedScript.js1
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/blockeduri-eval.html19
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/blockeduri-inline.html18
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/idl.html49
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/targeting.html159
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/support/echo-policy.py3
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/support/ping.js12
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/support/testharness-helper.js131
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/worker-src/dedicated-child.sub.html13
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/worker-src/dedicated-fallback.sub.html13
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/worker-src/dedicated-list.sub.html13
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/worker-src/dedicated-none.sub.html13
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/worker-src/dedicated-self.sub.html9
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/worker-src/service-child.https.sub.html10
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/worker-src/service-fallback.https.sub.html9
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/worker-src/service-list.https.sub.html9
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/worker-src/service-none.https.sub.html9
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/worker-src/service-self.https.sub.html9
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/worker-src/shared-child.sub.html13
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/worker-src/shared-fallback.sub.html13
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/worker-src/shared-list.sub.html13
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/worker-src/shared-none.sub.html13
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/worker-src/shared-self.sub.html10
-rw-r--r--tests/wpt/web-platform-tests/cors/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/cssom/serialize-values.html596
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/CustomElementRegistry.html580
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/Document-createElement.html332
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/adopted-callback.html135
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/attribute-changed-callback.html223
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/connected-callbacks.html88
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/custom-element-reaction-queue.html157
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/disconnected-callbacks.html93
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/htmlconstructor/newtarget.html118
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/parser/parser-constructs-custom-element-in-document-write.html32
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/parser/parser-constructs-custom-element-synchronously.html51
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/parser/parser-constructs-custom-elements.html48
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/parser/parser-fallsback-to-unknown-element.html91
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/parser/parser-sets-attributes-and-children.html59
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/parser/parser-uses-constructed-element.html75
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/parser/parser-uses-registry-of-owner-document.html126
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reaction-timing.html88
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/Attr.html23
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/CSSStyleDeclaration.html85
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/ChildNode.html35
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/DOMStringMap.html96
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/DOMTokenList.html219
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/Document.html154
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/Element.html82
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/ElementContentEditable.html21
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/HTMLAnchorElement.html32
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/HTMLElement.html42
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/HTMLOptionElement.html35
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/HTMLOptionsCollection.html122
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/HTMLOutputElement.html45
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/HTMLSelectElement.html122
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/HTMLTableElement.html173
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/HTMLTableRowElement.html34
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/HTMLTableSectionElement.html45
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/HTMLTitleElement.html35
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/NamedNodeMap.html39
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/Node.html49
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/ParentNode.html27
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/Range.html54
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/Selection.html32
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/ShadowRoot.html52
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/resources/reactions.js361
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/resources/custom-elements-helpers.js210
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/resources/empty-html-document.html5
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/upgrading.html190
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/upgrading/Node-cloneNode.html185
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/upgrading/upgrading-enqueue-reactions.html158
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/upgrading/upgrading-parser-created-element.html97
-rw-r--r--tests/wpt/web-platform-tests/dom/collections/HTMLCollection-supported-property-indices.html79
-rw-r--r--tests/wpt/web-platform-tests/dom/collections/HTMLCollection-supported-property-names.html81
-rw-r--r--tests/wpt/web-platform-tests/dom/events/Event-dispatch-click.html204
-rw-r--r--tests/wpt/web-platform-tests/dom/events/Event-dispatch-other-document.html22
-rw-r--r--tests/wpt/web-platform-tests/dom/events/ProgressEvent.html5
-rw-r--r--tests/wpt/web-platform-tests/dom/lists/DOMTokenList-iteration.html4
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/DOMImplementation-createDocument.html4
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/Document-createElement.html186
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/Document-createElementNS.html122
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/Document-createElementNS.js27
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/Document-createEvent.html4
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/Document-createEvent.js2
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/Node-childNodes.html4
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/Node-contains.html2
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/selectors.js19
-rw-r--r--tests/wpt/web-platform-tests/dom/ranges/Range-mutations-appendChild.html14
-rw-r--r--tests/wpt/web-platform-tests/dom/ranges/Range-mutations-appendData.html14
-rw-r--r--tests/wpt/web-platform-tests/dom/ranges/Range-mutations-dataChange.html14
-rw-r--r--tests/wpt/web-platform-tests/dom/ranges/Range-mutations-deleteData.html14
-rw-r--r--tests/wpt/web-platform-tests/dom/ranges/Range-mutations-insertBefore.html14
-rw-r--r--tests/wpt/web-platform-tests/dom/ranges/Range-mutations-insertData.html14
-rw-r--r--tests/wpt/web-platform-tests/dom/ranges/Range-mutations-removeChild.html14
-rw-r--r--tests/wpt/web-platform-tests/dom/ranges/Range-mutations-replaceChild.html14
-rw-r--r--tests/wpt/web-platform-tests/dom/ranges/Range-mutations-replaceData.html14
-rw-r--r--tests/wpt/web-platform-tests/dom/ranges/Range-mutations-splitText.html14
-rw-r--r--tests/wpt/web-platform-tests/dom/ranges/Range-mutations.js (renamed from tests/wpt/web-platform-tests/dom/ranges/Range-mutations.html)29
-rw-r--r--tests/wpt/web-platform-tests/domparsing/OWNERS2
-rw-r--r--tests/wpt/web-platform-tests/domparsing/createContextualFragment.html12
-rw-r--r--tests/wpt/web-platform-tests/domparsing/innerhtml-02.html126
-rw-r--r--tests/wpt/web-platform-tests/dpub-aam/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/dpub-aam/README.md64
-rw-r--r--tests/wpt/web-platform-tests/dpub-aria/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/dpub-aria/README.md64
-rw-r--r--tests/wpt/web-platform-tests/editing/other/restoration.html90
-rw-r--r--tests/wpt/web-platform-tests/encoding/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/encoding/single-byte-decoder.html2
-rw-r--r--tests/wpt/web-platform-tests/encoding/textdecoder-fatal-single-byte.html2
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-clear-key-invalid-license.html (renamed from tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-clear-key-invalid-license.html)3
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-clearkey-update-non-ascii-input.html (renamed from tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-clearkey-update-non-ascii-input.html)3
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses-multiple-sessions.html3
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses-multiple-updates.html3
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-onencrypted.html (renamed from tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-onencrypted.html)3
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-encrypted-and-clear-sources.html (renamed from tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-playback-encrypted-and-clear-sources.html)3
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-multiple-sessions.html3
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-requestmediakeysystemaccess.html (renamed from tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-requestmediakeysystemaccess.html)3
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-reset-src-after-setmediakeys.html (renamed from tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-reset-src-after-setmediakeys.html)3
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-session-closed-event.html (renamed from tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-session-closed-event.html)3
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-again-after-playback.html (renamed from tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-setmediakeys-again-after-playback.html)3
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-again-after-resetting-src.html (renamed from tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-setmediakeys-again-after-resetting-src.html)3
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-at-same-time.html (renamed from tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-setmediakeys-at-same-time.html)3
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-multiple-times-with-different-mediakeys.html (renamed from tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-setmediakeys-multiple-times-with-different-mediakeys.html)3
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-multiple-times-with-the-same-mediakeys.html (renamed from tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-setmediakeys-multiple-times-with-the-same-mediakeys.html)3
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-to-multiple-video-elements.html (renamed from tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-setmediakeys-to-multiple-video-elements.html)3
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys.html (renamed from tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-setmediakeys.html)3
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-syntax.html (renamed from tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-syntax.html)6
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-unique-origin.html (renamed from tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-unique-origin.html)3
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-update-disallowed-input.html (renamed from tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-update-disallowed-input.html)3
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-utils.js (renamed from tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-utils.js)0
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-waiting-for-a-key.html (renamed from tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-waiting-for-a-key.html)3
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-events-session-closed-event.html40
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-events.html5
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-invalid-license.html31
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-keystatuses-multiple-sessions.html2
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-keystatuses.html2
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-clear-encrypted.html53
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-encrypted-clear-sources.html59
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-encrypted-clear.html53
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-multikey-sequential-readyState.html55
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-multikey-sequential.html54
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-requestmediakeysystemaccess.html40
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-reset-src-after-setmediakeys.html47
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-again-after-playback.html53
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-again-after-resetting-src.html53
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-at-same-time.html43
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-multiple-times-with-different-mediakeys.html49
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-multiple-times-with-the-same-mediakeys.html49
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-to-multiple-video-elements.html47
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys.html43
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-syntax-mediakeys.html42
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-syntax-mediakeysession.html42
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-syntax-mediakeysystemaccess.html42
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-unique-origin.html43
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-update-disallowed-input.html28
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-waiting-for-a-key.html52
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/clearkey-update-non-ascii-input.html36
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/content/content-metadata.js93
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_clear_dashinit.mp4bin0 -> 238401 bytes
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_clear_enc_dashinit.mp4bin0 -> 241564 bytes
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_enc_clear_dashinit.mp4bin0 -> 241049 bytes
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_multikey_dashinit.mp4bin0 -> 246574 bytes
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_multikey_key1_dashinit.mp4 (renamed from tests/wpt/web-platform-tests/html/semantics/grouping-content/.gitkeep)0
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_multikey_key2_dashinit.mp4bin0 -> 241870 bytes
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-events-session-closed-event.html39
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-events.html2
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-expiration.html67
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-invalid-license.html32
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-keystatuses-multiple-sessions.html6
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-keystatuses.html2
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-onencrypted.html47
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-retrieve-destroy-persistent-license.html5
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-clear-encrypted.html53
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-encrypted-clear-sources.html59
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-encrypted-clear.html53
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-expired.html53
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-multikey-sequential-readyState.html58
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-multikey-sequential.html57
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-multisession.html4
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-two-videos.html4
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-requestmediakeysystemaccess.html41
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-reset-src-after-setmediakeys.html46
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-again-after-playback.html52
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-again-after-resetting-src.html52
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-at-same-time.html44
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-multiple-times-with-different-mediakeys.html50
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-multiple-times-with-the-same-mediakeys.html50
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-to-multiple-video-elements.html48
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys.html44
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-syntax-mediakeys.html43
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-syntax-mediakeysession.html43
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-syntax-mediakeysystemaccess.html43
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-unique-origin.html44
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-mp4-waiting-for-a-key.html52
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-not-callable-after-createsession.html6
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/drm-temporary-license-type.html71
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/polyfill/chrome-polyfill.js3
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/polyfill/edge-keystatuses.js144
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/polyfill/edge-persistent-usage-record.js (renamed from tests/wpt/web-platform-tests/encrypted-media/polyfill/edge-polyfill.js)0
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/polyfill/firefox-polyfill.js2
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/polyfill/make-polyfill-tests.py3
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/resources/drm-retrieve-destroy-persistent-license.html56
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/clearkey-update-non-ascii-input.js48
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/events-session-closed-event.js52
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/events.js32
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/expiration.js43
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/generate-request-disallowed-input.js145
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/invalid-license.js33
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/keystatuses-multiple-sessions.js62
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/keystatuses.js56
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/onencrypted.js48
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/playback-destroy-persistent-license.js30
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/playback-persistent-license-events.js70
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/playback-persistent-license.js20
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/playback-persistent-usage-record-events.js96
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/playback-persistent-usage-record.js51
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/playback-retrieve-persistent-license.js42
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/playback-retrieve-persistent-usage-record.js47
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-encrypted-clear-sources.js109
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-events.js94
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-expired.js92
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-multikey-multisession.js89
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-multikey-sequential.js122
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-multisession.js38
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-setMediaKeys.js49
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-two-videos.js39
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-waitingforkey.js31
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary.js32
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/requestmediakeysystemaccess.js320
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/reset-src-after-setmediakeys.js61
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-again-after-playback.js79
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-again-after-resetting-src.js79
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-at-same-time.js59
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-multiple-times-with-different-mediakeys.js98
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-multiple-times-with-the-same-mediakeys.js46
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-to-multiple-video-elements.js54
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys.js49
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/syntax-mediakeys.js184
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/syntax-mediakeysession.js445
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/syntax-mediakeysystemaccess.js147
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/temporary-license-type.js61
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/unique-origin.js64
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/update-disallowed-input.js45
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/scripts/waiting-for-a-key.js166
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/util/clearkey-messagehandler.js20
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/util/drm-messagehandler.js375
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/util/testmediasource.js50
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/util/utils.js115
-rw-r--r--tests/wpt/web-platform-tests/eventsource/OWNERS2
-rw-r--r--tests/wpt/web-platform-tests/eventsource/eventsource-onmessage-realm-support.htm2
-rw-r--r--tests/wpt/web-platform-tests/eventsource/eventsource-onmessage-realm.htm25
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/basic/conditional-get.html51
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/basic/error-after-response.html34
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/basic/integrity-sharedworker.html15
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/basic/request-headers.js3
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/basic/request-upload-worker.html14
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/basic/request-upload.html13
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/basic/request-upload.js35
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/basic/scheme-data.js10
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/basic/text-utf8.html13
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/cors/cors-redirect.js2
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/headers/headers-basic.html2
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/headers/headers-normalize.html4
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/redirect/redirect-count.js7
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/request/multi-globals/current/current.html2
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/request/multi-globals/incumbent/incumbent.html15
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/request/multi-globals/url-parsing.html27
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/request/request-cache-default-conditional.html180
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/request/request-cache-default.html50
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/request/request-cache-force-cache.html78
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/request/request-cache-no-cache.html36
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/request/request-cache-no-store.html48
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/request/request-cache-only-if-cached.html76
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/request/request-cache-reload.html62
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/request/request-cache.html626
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/request/request-cache.js223
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/request/request-consume-empty.html4
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/resources/bad-chunk-encoding.py13
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/resources/cache.py18
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/resources/echo-content.py9
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/resources/utils.js7
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/response/multi-globals/current/current.html2
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/response/multi-globals/incumbent/incumbent.html17
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/response/multi-globals/relevant/relevant.html2
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/response/multi-globals/url-parsing.html27
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/response/response-clone.html38
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/response/response-consume-empty.html4
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/response/response-consume-stream.html7
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/response/response-consume.html193
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/axisheight5000-verticalarrow14000.woffbin0 -> 1336 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/fraction-axisheight7000-rulethickness1000.woffbin0 -> 1204 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/fraction-denominatordisplaystylegapmin5000-rulethickness1000.woffbin0 -> 1264 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/fraction-denominatordisplaystyleshiftdown6000-rulethickness1000.woffbin0 -> 1276 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/fraction-denominatorgapmin4000-rulethickness1000.woffbin0 -> 1224 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/fraction-denominatorshiftdown3000-rulethickness1000.woffbin0 -> 1236 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/fraction-numeratordisplaystylegapmin8000-rulethickness1000.woffbin0 -> 1256 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/fraction-numeratordisplaystyleshiftup2000-rulethickness1000.woffbin0 -> 1260 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/fraction-numeratorgapmin9000-rulethickness1000.woffbin0 -> 1216 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/fraction-numeratorshiftup11000-rulethickness1000.woffbin0 -> 1224 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/fraction-rulethickness10000.woffbin0 -> 1160 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/largeop-displayoperatorminheight5000.woffbin0 -> 1296 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/limits-lowerlimitbaselinedropmin3000.woffbin0 -> 1256 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/limits-lowerlimitgapmin11000.woffbin0 -> 1228 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/limits-upperlimitbaselinerisemin5000.woffbin0 -> 1256 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/limits-upperlimitgapmin7000.woffbin0 -> 1224 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/lineheight5000-typolineheight2300.woffbin0 -> 1108 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/mathvariant-bold-fraktur.woffbin0 -> 2776 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/mathvariant-bold-italic.woffbin0 -> 4648 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/mathvariant-bold-sans-serif.woffbin0 -> 4892 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/mathvariant-bold-script.woffbin0 -> 2736 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/mathvariant-bold.woffbin0 -> 5004 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/mathvariant-double-struck.woffbin0 -> 3988 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/mathvariant-fraktur.woffbin0 -> 2844 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/mathvariant-initial.woffbin0 -> 2100 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/mathvariant-italic.woffbin0 -> 4756 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/mathvariant-looped.woffbin0 -> 2292 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/mathvariant-monospace.woffbin0 -> 3048 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/mathvariant-sans-serif-bold-italic.woffbin0 -> 4668 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/mathvariant-sans-serif-italic.woffbin0 -> 2748 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/mathvariant-sans-serif.woffbin0 -> 3060 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/mathvariant-script.woffbin0 -> 2964 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/mathvariant-stretched.woffbin0 -> 2256 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/mathvariant-tailed.woffbin0 -> 2024 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/radical-degreebottomraisepercent25-rulethickness1000.woffbin0 -> 1400 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/radical-displaystyleverticalgap7000-rulethickness1000.woffbin0 -> 1392 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/radical-extraascender3000-rulethickness1000.woffbin0 -> 1372 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/radical-kernafterdegreeminus5000-rulethickness1000.woffbin0 -> 1388 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/radical-kernbeforedegree4000-rulethickness1000.woffbin0 -> 1376 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/radical-rulethickness8000.woffbin0 -> 1316 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/radical-verticalgap6000-rulethickness1000.woffbin0 -> 1360 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/scripts-spaceafterscript3000.woffbin0 -> 1164 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/scripts-subscriptbaselinedropmin9000.woffbin0 -> 1192 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/scripts-subscriptshiftdown6000.woffbin0 -> 1172 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/scripts-subscripttopmax4000.woffbin0 -> 1160 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/scripts-subsuperscriptgapmin11000-superscriptbottommaxwithsubscript3000.woffbin0 -> 1252 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/scripts-subsuperscriptgapmin11000.woffbin0 -> 1180 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/scripts-superscriptbaselinedropmax10000.woffbin0 -> 1196 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/scripts-superscriptbottommin8000.woffbin0 -> 1176 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/scripts-superscriptshiftup7000.woffbin0 -> 1164 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/scripts-superscriptshiftupcramped5000.woffbin0 -> 1188 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/stack-axisheight7000.woffbin0 -> 1144 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/stack-bottomdisplaystyleshiftdown5000.woffbin0 -> 1204 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/stack-bottomshiftdown6000.woffbin0 -> 1168 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/stack-displaystylegapmin4000.woffbin0 -> 1176 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/stack-gapmin8000.woffbin0 -> 1132 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/stack-topdisplaystyleshiftup3000.woffbin0 -> 1184 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/stack-topshiftup9000.woffbin0 -> 1152 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/stretchstack-bottomshiftdown3000.woffbin0 -> 1252 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/stretchstack-gapabovemin7000.woffbin0 -> 1236 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/stretchstack-gapbelowmin11000.woffbin0 -> 1236 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/stretchstack-topshiftup5000.woffbin0 -> 1232 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/underover-accentbaseheight4000-overbarextraascender3000.woffbin0 -> 1300 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/underover-accentbaseheight4000-overbarverticalgap11000.woffbin0 -> 1300 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/underover-accentbaseheight4000-underbarextradescender5000.woffbin0 -> 1300 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/underover-accentbaseheight4000-underbarverticalgap7000.woffbin0 -> 1300 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/math/xheight500.woffbin0 -> 1048 bytes
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-manual.html24
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/document-fullscreen-element-manual.html32
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/document-onfullscreenchange-manual.html15
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-containing-iframe-manual.html21
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-enabled-flag-not-set-manual.html19
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-fullscreen-element-sibling-manual.html23
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-fullscreen-iframe-child-manual.html28
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-iframe-child-manual.html17
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-not-in-document-manual.html15
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-manual.html22
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-non-top-manual.html28
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-svg-rect-manual.html17
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-svg-svg-manual.html17
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-top-manual.html30
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/model/remove-child-manual.html28
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/model/remove-first-manual.html32
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/model/remove-last-manual.html32
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/model/remove-parent-manual.html26
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/model/remove-single-manual.html24
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/trusted-click.js24
-rw-r--r--tests/wpt/web-platform-tests/hr-time/idlharness.html23
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/014.html2
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling.html4
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/history/the-history-interface/history_go_to_uri-1.html23
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/history/the-history-interface/history_go_to_uri.html32
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/history/the-history-interface/non-automated/traverse_the_session_history_unload_prompt_1-manual.html (renamed from tests/wpt/web-platform-tests/html/browsers/history/the-history-interface/non-automated/traverse_the_session_history_unload_prompt_1.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/history/the-location-interface/location-prototype-setting.html18
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/history/the-location-interface/location_hash.html13
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/history/the-location-interface/security_location_0.htm (renamed from tests/wpt/web-platform-tests/html/browsers/history/the-location-interface/security_location_0.sub.htm)0
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/cross-origin-objects.html2
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/win-documentdomain.sub.html6
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/sandboxing/inner-iframe.html13
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/sandboxing/sandbox-allow-same-origin.html30
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/sandboxing/sandbox-allow-scripts.html29
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/sandboxing/sandbox-disallow-same-origin.html30
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/sandboxing/sandbox-disallow-scripts.html29
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/the-window-object/named-access-on-the-window-object/named-objects.html20
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/the-window-object/security-window/window-security.html (renamed from tests/wpt/web-platform-tests/html/browsers/the-window-object/security-window/window-security.sub.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/the-window-object/support/noopener-target.html8
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/the-window-object/window-open-noopener.html105
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/windows/nested-browsing-contexts/frameElement.html (renamed from tests/wpt/web-platform-tests/html/browsers/windows/nested-browsing-contexts/frameElement.sub.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/windows/support-open-cross-origin.sub.html3
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/windows/targeting-cross-origin-nested-browsing-contexts.html (renamed from tests/wpt/web-platform-tests/html/browsers/windows/targeting-cross-origin-nested-browsing-contexts.sub.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/windows/targeting-multiple-cross-origin-manual.sub.html9
-rw-r--r--tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/Document.currentScript.html (renamed from tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/Document.currentScript.sub.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/document.forms.html4
-rw-r--r--tests/wpt/web-platform-tests/html/dom/interfaces.html23
-rw-r--r--tests/wpt/web-platform-tests/html/dom/new-harness.js21
-rw-r--r--tests/wpt/web-platform-tests/html/dom/original-harness.js72
-rw-r--r--tests/wpt/web-platform-tests/html/dom/reflection.js73
-rw-r--r--tests/wpt/web-platform-tests/html/editing/activation/click-manual.html5
-rwxr-xr-xtests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/dndTransferCases-manual.html24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/focus/processing-model/focus-fixup-rule-one-no-dialogs.html71
-rw-r--r--tests/wpt/web-platform-tests/html/infrastructure/common-dom-interfaces/collections/historical.html25
-rw-r--r--tests/wpt/web-platform-tests/html/infrastructure/common-dom-interfaces/collections/htmlallcollection.html246
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/document-metadata/the-base-element/base_href_specified.html (renamed from tests/wpt/web-platform-tests/html/semantics/document-metadata/the-base-element/base_href_specified.sub.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/interfaces/TrackEvent/constructor.html9
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-embed-element/historical.html15
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe-append-to-child-document.html17
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_script.html11
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html (renamed from tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping.html)2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html31
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html25
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_helper-1.html (renamed from tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_helper.html)1
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_helper-2.html27
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_helper-3.html17
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html (renamed from tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping.html)2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html18
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html15
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/data-url.html22
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/invalid-src.html27
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/usemap-casing.html93
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-object-element/historical.html15
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-object-element/usemap-casing.html93
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-checkValidity.html6
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-reportValidity.html6
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-stepMismatch.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valid.html3
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-indexed-element.html25
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-nameditem.html91
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/radio-groupname-case.html58
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-meter-element/meter.html10
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-001-ref.html4
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-001.html4
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-002-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-002.html2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-display-list-item-ref.html40
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-display-list-item.html44
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu-ref.html46
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu.html58
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-mixed-ref.html52
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-mixed.html64
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-not-dir-ref.html52
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-not-dir.html58
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ol-ref.html46
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ol.html52
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-parent-ref.html40
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-parent.html45
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes-ref.html42
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes.html52
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ul-ref.html46
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ul.html58
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-no-list-owner-ref.html29
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-no-list-owner.html31
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-not-being-rendered-ref.html24
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-not-being-rendered.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/.gitkeep0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-rev-reftest-001-ref.html3
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-rev-reftest-001.html3
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-001-ref.html4
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-001.html4
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-002-ref.html4
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-002.html4
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-001-ref.html3
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-001.html3
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-002-ref.html3
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-002.html3
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-003-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-003.html2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol.html55
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/ol.start-reflection-2.html2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1a.html4
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1b.html4
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1c.html4
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1d.html12
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1e.html11
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html78
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/links/links-created-by-a-and-area-elements/support/noopener-popup.html19
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/links/links-created-by-a-and-area-elements/support/noopener-target-1.html4
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/links/links-created-by-a-and-area-elements/support/noopener-target-2.html8
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/data-url.html24
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-1.html12
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-2.html13
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-onload-insertion-point.html12
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/support/script-onerror-insertion-point-1-helper.html2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/support/script-onerror-insertion-point-2-helper.html2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/support/script-onload-insertion-point-helper.html2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/support/script-onload-insertion-point-helper.js1
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-template-element/template-element/node-document-changes.html7
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/indeterminate.html2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/tabular-data/the-table-element/remove-row.html20
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/tabular-data/the-tbody-element/deleteRow.html7
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/tabular-data/the-tr-element/deleteCell.html7
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-exception.html22
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-iframe.html17
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-invoked.html12
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-multiple-calls.html41
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-timeout.html28
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/cancel-invoked.html26
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/idlharness.html34
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/scripting/events/event-handler-attributes-body-window.html10
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/scripting/events/messageevent-constructor.https.html96
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/NavigatorID.js77
-rw-r--r--tests/wpt/web-platform-tests/imagebitmap-renderingcontext/bitmaprenderer-as-imagesource.html90
-rw-r--r--tests/wpt/web-platform-tests/imagebitmap-renderingcontext/context-creation-with-alpha.html75
-rw-r--r--tests/wpt/web-platform-tests/imagebitmap-renderingcontext/context-creation.html19
-rw-r--r--tests/wpt/web-platform-tests/imagebitmap-renderingcontext/context-preserves-canvas.html21
-rw-r--r--tests/wpt/web-platform-tests/imagebitmap-renderingcontext/tranferFromImageBitmap-null.html75
-rw-r--r--tests/wpt/web-platform-tests/imagebitmap-renderingcontext/transferFromImageBitmap-detached.html34
-rw-r--r--tests/wpt/web-platform-tests/innerText/getter-tests.js22
-rw-r--r--tests/wpt/web-platform-tests/innerText/getter.html14
-rw-r--r--tests/wpt/web-platform-tests/lint.whitelist3
-rw-r--r--tests/wpt/web-platform-tests/mathml/README.md18
-rw-r--r--tests/wpt/web-platform-tests/mathml/presentation-markup/fractions/frac-1.html129
-rw-r--r--tests/wpt/web-platform-tests/mathml/presentation-markup/fractions/frac-parameters-1.html241
-rw-r--r--tests/wpt/web-platform-tests/mathml/presentation-markup/fractions/frac-parameters-2.html173
-rw-r--r--tests/wpt/web-platform-tests/mathml/presentation-markup/operators/mo-axis-height-1.html76
-rw-r--r--tests/wpt/web-platform-tests/mathml/presentation-markup/radicals/root-parameters-1.html208
-rw-r--r--tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-1.html104
-rw-r--r--tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-2.html163
-rw-r--r--tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-3.html180
-rw-r--r--tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-4.html124
-rw-r--r--tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-5.html90
-rw-r--r--tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-parameters-1.html334
-rw-r--r--tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/underover-1.html161
-rw-r--r--tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/underover-parameters-1.html143
-rw-r--r--tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/underover-parameters-2.html143
-rw-r--r--tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/underover-parameters-3.html322
-rw-r--r--tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/underover-parameters-4.html322
-rw-r--r--tests/wpt/web-platform-tests/mathml/presentation-markup/spaces/space-1.html91
-rw-r--r--tests/wpt/web-platform-tests/mathml/presentation-markup/spaces/space-2-ref.html15
-rw-r--r--tests/wpt/web-platform-tests/mathml/presentation-markup/spaces/space-2.html42
-rw-r--r--tests/wpt/web-platform-tests/mathml/presentation-markup/tables/table-axis-height.html52
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/color-1-ref.html12
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/color-1.html37
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/display-1-ref.html12
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/display-1.html16
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-1.html114
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-1-ref.html17
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-1.html119
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-2-ref.html14
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-2.html122
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-3.html158
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-fraktur-ref.html79
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-fraktur.html82
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-italic-ref.html137
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-italic.html140
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-ref.html149
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-sans-serif-ref.html147
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-sans-serif.html150
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-script-ref.html79
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-script.html82
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold.html152
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-double-struck-ref.html114
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-double-struck.html117
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-fraktur-ref.html79
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-fraktur.html82
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-initial-ref.html47
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-initial.html50
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-italic-ref.html139
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-italic.html142
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-looped-ref.html54
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-looped.html57
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-monospace-ref.html89
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-monospace.html92
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif-bold-italic-ref.html137
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif-bold-italic.html140
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif-italic-ref.html79
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif-italic.html82
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif-ref.html89
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif.html92
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-script-ref.html79
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-script.html82
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-stretched-ref.html50
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-stretched.html53
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-tailed-ref.html42
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-tailed.html45
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/visibility-1-ref.html12
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/css-styling/visibility-1.html37
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/class-1-ref.html15
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/class-1.html23
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/class-2.html40
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/color-attributes-1-ref.html26
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/color-attributes-1.html37
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/display-1.html83
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/dynamic-1-ref.html16
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/dynamic-1.html30
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/href-click-1-ref.html15
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/href-click-1.html34
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/href-click-2-ref.html15
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/href-click-2.html38
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/href-manual.html28
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-1-ref.html13
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-1.html25
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-2-ref.html15
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-2.html72
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-3-ref.html17
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-3.html63
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/required-extensions-1.html12
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/required-extensions-2-ref.html13
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/required-extensions-2.html23
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-1-iframe.html18
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-1-ref-iframe.html15
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-1-ref.html16
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-1.html19
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-2.html28
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-3-ref.html15
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-3.html23
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/text-and-math/use-typo-metrics-1-ref.html19
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/text-and-math/use-typo-metrics-1.html51
-rw-r--r--tests/wpt/web-platform-tests/mathml/tools/axisheight.py23
-rw-r--r--tests/wpt/web-platform-tests/mathml/tools/fractions.py153
-rw-r--r--tests/wpt/web-platform-tests/mathml/tools/largeop.py14
-rw-r--r--tests/wpt/web-platform-tests/mathml/tools/limits.py74
-rw-r--r--tests/wpt/web-platform-tests/mathml/tools/mathvariant-transforms.py127
-rw-r--r--tests/wpt/web-platform-tests/mathml/tools/radicals.py109
-rw-r--r--tests/wpt/web-platform-tests/mathml/tools/scripts.py145
-rw-r--r--tests/wpt/web-platform-tests/mathml/tools/stacks.py81
-rw-r--r--tests/wpt/web-platform-tests/mathml/tools/stretchstacks.py74
-rw-r--r--tests/wpt/web-platform-tests/mathml/tools/underover.py84
-rw-r--r--tests/wpt/web-platform-tests/mathml/tools/use-typo-lineheight.py54
-rw-r--r--tests/wpt/web-platform-tests/mathml/tools/utils/__init__.py (renamed from tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/.gitkeep)0
-rw-r--r--tests/wpt/web-platform-tests/mathml/tools/utils/mathfont.py190
-rw-r--r--tests/wpt/web-platform-tests/mathml/tools/utils/misc.py33
-rw-r--r--tests/wpt/web-platform-tests/mathml/tools/xHeight.py11
-rw-r--r--tests/wpt/web-platform-tests/media-source/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/media-source/mediasource-remove.html10
-rw-r--r--tests/wpt/web-platform-tests/media-source/mediasource-sequencemode-append-buffer.html2
-rw-r--r--tests/wpt/web-platform-tests/media-source/mediasource-util.js72
-rw-r--r--tests/wpt/web-platform-tests/media-source/mp4/test.mp4bin198320 -> 187227 bytes
-rw-r--r--tests/wpt/web-platform-tests/media-source/webm/test.webmbin219448 -> 190970 bytes
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-record/BlobEvent-constructor.html38
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-record/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/page-visibility/idlharness.html11
-rw-r--r--tests/wpt/web-platform-tests/performance-timeline/case-sensitivity.html39
-rw-r--r--tests/wpt/web-platform-tests/pointerevents/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/pointerevents/pointerevent_capture_suppressing_mouse-manual.html43
-rw-r--r--tests/wpt/web-platform-tests/pointerevents/pointerevent_constructor.html6
-rw-r--r--tests/wpt/web-platform-tests/pointerevents/pointerevent_element_haspointercapture-manual.html24
-rw-r--r--tests/wpt/web-platform-tests/pointerevents/pointerevent_element_haspointercapture_release_pending_capture-manual.html73
-rw-r--r--tests/wpt/web-platform-tests/pointerevents/pointerevent_lostpointercapture_is_first-manual.html24
-rw-r--r--tests/wpt/web-platform-tests/pointerevents/pointerevent_pointermove_on_chorded_mouse_button-manual.html (renamed from tests/wpt/web-platform-tests/pointerevents/pointerevent_pointermove-on-chorded-mouse-button.html)0
-rw-r--r--tests/wpt/web-platform-tests/pointerevents/pointerevent_releasepointercapture_events_to_original_target-manual.html41
-rw-r--r--tests/wpt/web-platform-tests/pointerevents/pointerevent_releasepointercapture_release_right_after_capture-manual.html61
-rw-r--r--tests/wpt/web-platform-tests/pointerevents/pointerevent_setpointercapture_override_pending_capture_element-manual.html63
-rw-r--r--tests/wpt/web-platform-tests/pointerevents/pointerevent_setpointercapture_relatedtarget-manual.html15
-rw-r--r--tests/wpt/web-platform-tests/pointerevents/pointerevent_setpointercapture_to_same_element_twice-manual.html62
-rw-r--r--tests/wpt/web-platform-tests/pointerevents/pointerevent_support.js3
-rw-r--r--tests/wpt/web-platform-tests/pointerevents/resources/pointerevent_pointerId_scope-iframe.html2
-rw-r--r--tests/wpt/web-platform-tests/pointerlock/pointerlock_shadow-manual.html84
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onclosed-manual.html8
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onconnected-manual.html8
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onterminated-manual.html13
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationRequest_error.html12
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationRequest_onconnectionavailable-manual.html60
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/controlling-ua/common.js16
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/controlling-ua/defaultRequest_success-manual.html68
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/controlling-ua/getAvailability.html18
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/controlling-ua/idlharness.html2
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/controlling-ua/reconnectToPresentation_error-manual.html36
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/controlling-ua/reconnectToPresentation_notfound_error.html16
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/controlling-ua/reconnectToPresentation_success-manual.html5
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_displaynotallowed-manual.html34
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_displaynotfound-manual.html34
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_error-manual.html50
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_error.html18
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_success-manual.html105
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_unsettledpromise-manual.html34
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/controlling-ua/support/iframe.html13
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/receiving-ua/idlharness.html6
-rw-r--r--tests/wpt/web-platform-tests/referrer-policy/generic/common.js47
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resources/gzip_xml.py17
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/test_resource_timing.js47
-rw-r--r--tests/wpt/web-platform-tests/resources/idlharness.js8
-rw-r--r--tests/wpt/web-platform-tests/resources/testharness.js12
-rw-r--r--tests/wpt/web-platform-tests/secure-contexts/basic-dedicated-worker.html83
-rw-r--r--tests/wpt/web-platform-tests/secure-contexts/basic-dedicated-worker.https.html83
-rw-r--r--tests/wpt/web-platform-tests/secure-contexts/basic-shared-worker.html69
-rw-r--r--tests/wpt/web-platform-tests/secure-contexts/basic-shared-worker.https.html67
-rw-r--r--tests/wpt/web-platform-tests/secure-contexts/server-locations.sub.js11
-rw-r--r--tests/wpt/web-platform-tests/secure-contexts/shared-worker-insecure-first.https.html111
-rw-r--r--tests/wpt/web-platform-tests/secure-contexts/shared-worker-secure-first.https.html111
-rw-r--r--tests/wpt/web-platform-tests/secure-contexts/support/dedicated-worker-script.js1
-rw-r--r--tests/wpt/web-platform-tests/secure-contexts/support/https-subframe-dedicated.html21
-rw-r--r--tests/wpt/web-platform-tests/secure-contexts/support/https-subframe-shared.html32
-rw-r--r--tests/wpt/web-platform-tests/secure-contexts/support/parent-dedicated-worker-script.js4
-rw-r--r--tests/wpt/web-platform-tests/secure-contexts/support/parent-shared-worker-script.js8
-rw-r--r--tests/wpt/web-platform-tests/secure-contexts/support/shared-worker-insecure-popup.html15
-rw-r--r--tests/wpt/web-platform-tests/secure-contexts/support/shared-worker-script.js5
-rw-r--r--tests/wpt/web-platform-tests/selectors/child-indexed-pseudo-class.html42
-rw-r--r--tests/wpt/web-platform-tests/serve.py10
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event.https.html39
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/fetch-request-resources.https.html65
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/postmessage-to-client.https.html11
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-event-test-worker.js5
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-request-resources-iframe.https.html16
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-request-resources-worker.js3
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/serviceworker-message-event-historical.https.html44
-rw-r--r--tests/wpt/web-platform-tests/service-workers/stub-3.1-service-worker-obj.html4
-rw-r--r--tests/wpt/web-platform-tests/service-workers/stub-3.2-navigator-service-worker.html2
-rw-r--r--tests/wpt/web-platform-tests/service-workers/stub-4.1-service-worker-global-scope.html4
-rw-r--r--tests/wpt/web-platform-tests/service-workers/stub-4.2-client.html4
-rw-r--r--tests/wpt/web-platform-tests/service-workers/stub-4.3-service-worker-clients.html4
-rw-r--r--tests/wpt/web-platform-tests/service-workers/stub-4.4-request-objects.html2
-rw-r--r--tests/wpt/web-platform-tests/service-workers/stub-4.5-response-objects.html4
-rw-r--r--tests/wpt/web-platform-tests/service-workers/stub-4.6.2-cache.html4
-rw-r--r--tests/wpt/web-platform-tests/service-workers/stub-4.6.3-cache-storage.html4
-rw-r--r--tests/wpt/web-platform-tests/service-workers/stub-4.7.1-install-phase-event.html4
-rw-r--r--tests/wpt/web-platform-tests/service-workers/stub-4.7.2.1-install-event-section.html4
-rw-r--r--tests/wpt/web-platform-tests/service-workers/stub-4.7.4.1-fetch-event-section.html4
-rw-r--r--tests/wpt/web-platform-tests/shadow-dom/OWNERS3
-rw-r--r--tests/wpt/web-platform-tests/shadow-dom/event-composed-path-with-related-target.html12
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-streams/count-queuing-strategy-integration.js2
-rw-r--r--tests/wpt/web-platform-tests/svg/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/svg/historical.html3
-rw-r--r--tests/wpt/web-platform-tests/svg/import/shapes-rect-01-t-manual.svg73
-rw-r--r--tests/wpt/web-platform-tests/svg/interfaces.html9
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/reftests/href-a-element-attr-change.html29
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/reftests/href-a-element-ref.html8
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/reftests/href-feImage-element-ref.html15
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/reftests/href-feImage-element.html18
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/reftests/href-filter-element-ref.html12
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/reftests/href-filter-element.html24
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/reftests/href-gradient-element-ref.html21
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/reftests/href-gradient-element.html31
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/reftests/href-image-element-ref.html9
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/reftests/href-image-element.html12
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/reftests/href-pattern-element-ref.html14
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/reftests/href-pattern-element.html21
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/reftests/href-textPath-element-ref.html20
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/reftests/href-textPath-element.html23
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/reftests/href-use-element-ref.html12
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/reftests/href-use-element.html15
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/scripted/href-animate-element.html138
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/scripted/href-mpath-element.html103
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/scripted/href-script-element-markup.html27
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/scripted/href-script-element.html112
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/scripted/testScripts/dummyScript.js3
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/scripted/testScripts/externalScript1.js3
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/scripted/testScripts/externalScript2.js3
-rw-r--r--tests/wpt/web-platform-tests/svg/linking/scripted/testcommon.js42
-rw-r--r--tests/wpt/web-platform-tests/svg/shapes/rect-01-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/svg/shapes/rect-01.svg9
-rw-r--r--tests/wpt/web-platform-tests/svg/shapes/rect-02-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/svg/shapes/rect-02.svg9
-rw-r--r--tests/wpt/web-platform-tests/svg/shapes/rect-03-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/svg/shapes/rect-03.svg9
-rw-r--r--tests/wpt/web-platform-tests/svg/shapes/rect-04-ref.html7
-rw-r--r--tests/wpt/web-platform-tests/svg/shapes/rect-04.svg9
-rw-r--r--tests/wpt/web-platform-tests/tools/appveyor.yml24
-rw-r--r--tests/wpt/web-platform-tests/tools/lint/fnmatch.py32
-rw-r--r--tests/wpt/web-platform-tests/tools/lint/lint.py9
-rw-r--r--tests/wpt/web-platform-tests/tools/lint/tests/base.py11
-rw-r--r--tests/wpt/web-platform-tests/tools/lint/tests/test_file_lints.py36
-rw-r--r--tests/wpt/web-platform-tests/tools/lint/tests/test_lint.py3
-rw-r--r--tests/wpt/web-platform-tests/tools/lint/tests/test_path_lints.py5
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/sourcefile.py9
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/tests/test_sourcefile.py6
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/tests/test_utils.py28
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/utils.py13
-rw-r--r--tests/wpt/web-platform-tests/tools/serve/serve.py36
-rw-r--r--tests/wpt/web-platform-tests/tools/tox.ini5
-rw-r--r--tests/wpt/web-platform-tests/tools/webdriver/COPYING373
-rw-r--r--tests/wpt/web-platform-tests/tools/webdriver/README.md41
-rw-r--r--tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py86
-rw-r--r--tests/wpt/web-platform-tests/tools/webdriver/webdriver/transport.py52
-rw-r--r--tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/with_headers.txt.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_handlers.py1
-rw-r--r--tests/wpt/web-platform-tests/touch-events/touch-touchevent-constructor.html35
-rw-r--r--tests/wpt/web-platform-tests/uievents/keyboard/key-101en-us-manual.html4
-rw-r--r--tests/wpt/web-platform-tests/uievents/keyboard/key-102fr-fr-manual.html4
-rw-r--r--tests/wpt/web-platform-tests/uievents/order-of-events/focus-events/focus-contained-manual.html76
-rw-r--r--tests/wpt/web-platform-tests/uievents/order-of-events/focus-events/focus-manual.html117
-rw-r--r--tests/wpt/web-platform-tests/uievents/order-of-events/mouse-events/click-cancel-manual.html38
-rw-r--r--tests/wpt/web-platform-tests/uievents/order-of-events/mouse-events/click-order-manual.html72
-rw-r--r--tests/wpt/web-platform-tests/uievents/order-of-events/mouse-events/mousemove-across-manual.html134
-rw-r--r--tests/wpt/web-platform-tests/uievents/order-of-events/mouse-events/mousemove-between-manual.html106
-rw-r--r--tests/wpt/web-platform-tests/uievents/resources/eventrecorder.js34
-rw-r--r--tests/wpt/web-platform-tests/url/setters_tests.json19
-rw-r--r--tests/wpt/web-platform-tests/url/url-setters.html18
-rw-r--r--tests/wpt/web-platform-tests/url/urltestdata.json30
-rw-r--r--tests/wpt/web-platform-tests/web-animations/animation-model/keyframe-effects/spacing-keyframes.html65
-rw-r--r--tests/wpt/web-platform-tests/web-animations/interfaces/Animation/effect.html23
-rw-r--r--tests/wpt/web-platform-tests/web-animations/interfaces/Animation/id.html11
-rw-r--r--tests/wpt/web-platform-tests/web-animations/interfaces/AnimationEffectTiming/getComputedStyle.html6
-rw-r--r--tests/wpt/web-platform-tests/web-animations/interfaces/AnimationTimeline/idlharness.html5
-rw-r--r--tests/wpt/web-platform-tests/web-animations/interfaces/DocumentTimeline/constructor.html20
-rw-r--r--tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/getComputedTiming.html4
-rw-r--r--tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/iterationComposite.html693
-rw-r--r--tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/spacing.html60
-rw-r--r--tests/wpt/web-platform-tests/web-animations/testcommon.js16
-rw-r--r--tests/wpt/web-platform-tests/web-animations/timing-model/animation-effects/active-time.html2
-rw-r--r--tests/wpt/web-platform-tests/web-animations/timing-model/animation-effects/phases-and-states.html20
-rw-r--r--tests/wpt/web-platform-tests/web-animations/timing-model/animations/set-the-target-effect-of-an-animation.html95
-rw-r--r--tests/wpt/web-platform-tests/web-animations/timing-model/animations/updating-the-finished-state.html125
-rw-r--r--tests/wpt/web-platform-tests/webaudio/the-audio-api/the-constantsourcenode-interface/test-constantsourcenode.html135
-rw-r--r--tests/wpt/web-platform-tests/webauthn/interfaces.https.html104
-rw-r--r--tests/wpt/web-platform-tests/webauthn/interfaces.idl14
-rw-r--r--tests/wpt/web-platform-tests/webdriver/README.md92
-rw-r--r--tests/wpt/web-platform-tests/webdriver/contexts.py66
-rw-r--r--tests/wpt/web-platform-tests/webdriver/navigation.py28
-rw-r--r--tests/wpt/web-platform-tests/webmessaging/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/webrtc/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/webrtc/rtcpeerconnection/rtcpeerconnection-constructor.html156
-rw-r--r--tests/wpt/web-platform-tests/webrtc/simplecall.html15
-rw-r--r--tests/wpt/web-platform-tests/websockets/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/websockets/multi-globals/message-received.html34
-rw-r--r--tests/wpt/web-platform-tests/websockets/multi-globals/support/incumbent.sub.html24
-rw-r--r--tests/wpt/web-platform-tests/websockets/multi-globals/support/relevant.html2
-rw-r--r--tests/wpt/web-platform-tests/workers/Worker_ErrorEvent_error.htm29
-rw-r--r--tests/wpt/web-platform-tests/workers/constructors/SharedWorker/URLMismatchError.htm29
-rw-r--r--tests/wpt/web-platform-tests/workers/data-url-shared.html13
-rw-r--r--tests/wpt/web-platform-tests/workers/data-url.html13
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/window-only.worker.js22
-rw-r--r--tests/wpt/web-platform-tests/workers/support/ErrorEvent-error.js9
1428 files changed, 117813 insertions, 9856 deletions
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.html.ini
new file mode 100644
index 00000000000..0a475462eca
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-hsl-1.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-hsl-1]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.html.ini
new file mode 100644
index 00000000000..315f1b77815
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-hsl-2.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-hsl-2]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.html.ini
new file mode 100644
index 00000000000..6d0c4fe4879
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-hsl-3.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-hsl-3]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.html.ini
new file mode 100644
index 00000000000..f13a1878cb0
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-hsl-4.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-hsl-4]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.html.ini
new file mode 100644
index 00000000000..b3b4fa258ea
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-hsl-5.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-hsl-5]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.html.ini
new file mode 100644
index 00000000000..979b13418d2
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-hsl-6.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-hsl-6]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.html.ini
new file mode 100644
index 00000000000..346881a91d3
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-hsl-7.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-hsl-7]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.html.ini
new file mode 100644
index 00000000000..77331fbc02a
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-hsl-8.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-hsl-8]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.html.ini
new file mode 100644
index 00000000000..f06dce0fa82
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-hsl-9.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-hsl-9]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.html.ini
new file mode 100644
index 00000000000..07eff7c118c
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-hsla-1.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-hsla-1]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.html.ini
new file mode 100644
index 00000000000..2074d83d9c5
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-hsla-2.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-hsla-2]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.html.ini
new file mode 100644
index 00000000000..629b598de19
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-hsla-3.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-hsla-3]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.html.ini
new file mode 100644
index 00000000000..5ecb867f752
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-hsla-4.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-hsla-4]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.html.ini
new file mode 100644
index 00000000000..73ec9374c24
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-hsla-5.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-hsla-5]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.html.ini
new file mode 100644
index 00000000000..2a9e01d706c
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-hsla-6.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-hsla-6]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.html.ini
new file mode 100644
index 00000000000..84cb1a69296
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-hsla-7.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-hsla-7]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.html.ini
new file mode 100644
index 00000000000..5736436b063
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-hsla-8.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-hsla-8]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.html.ini
new file mode 100644
index 00000000000..684d29b06c4
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-hsla-9.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-hsla-9]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.html.ini
new file mode 100644
index 00000000000..ccef8774341
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-rgb-1.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-rgb-1]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.html.ini
new file mode 100644
index 00000000000..01bb5fd598c
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-rgb-2.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-rgb-2]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.html.ini
new file mode 100644
index 00000000000..4f27a04d6ec
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-rgb-3.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-rgb-3]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.html.ini
new file mode 100644
index 00000000000..25e2f86c36e
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-rgb-4.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-rgb-4]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.html.ini
new file mode 100644
index 00000000000..0c9af172107
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-rgb-5.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-rgb-5]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.html.ini
new file mode 100644
index 00000000000..2e9d183a6ee
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-rgb-6.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-rgb-6]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.html.ini
new file mode 100644
index 00000000000..774515ed0f0
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-rgba-1.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-rgba-1]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.html.ini
new file mode 100644
index 00000000000..2059cb3cdc8
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-rgba-3.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-rgba-3]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.html.ini
new file mode 100644
index 00000000000..66054fea435
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-rgba-4.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-rgba-4]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.html.ini
new file mode 100644
index 00000000000..f1886f1771a
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-rgba-5.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-rgba-5]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.html.ini
new file mode 100644
index 00000000000..a45a7f41e47
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.html.ini
@@ -0,0 +1,5 @@
+[2d.fillStyle.parse.css-color-4-rgba-6.html]
+ type: testharness
+ [Canvas test: 2d.fillStyle.parse.css-color-4-rgba-6]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/line-styles/setLineDash.html.ini b/tests/wpt/metadata/2dcontext/line-styles/setLineDash.html.ini
new file mode 100644
index 00000000000..8ed6b0a36ab
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/line-styles/setLineDash.html.ini
@@ -0,0 +1,8 @@
+[setLineDash.html]
+ type: testharness
+ [Invalid arguments to setLineDash()]
+ expected: FAIL
+
+ [setLineDash]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/FileAPI/FileReaderSync.worker.js.ini b/tests/wpt/metadata/FileAPI/FileReaderSync.worker.js.ini
index 249873f6547..4643890d804 100644
--- a/tests/wpt/metadata/FileAPI/FileReaderSync.worker.js.ini
+++ b/tests/wpt/metadata/FileAPI/FileReaderSync.worker.js.ini
@@ -1,4 +1,4 @@
-[FileReaderSync.worker]
+[FileReaderSync.worker.html]
type: testharness
[readAsText]
expected: FAIL
diff --git a/tests/wpt/metadata/FileAPI/idlharness.worker.js.ini b/tests/wpt/metadata/FileAPI/idlharness.worker.js.ini
index 8e58f76bca3..fc33de592fa 100644
--- a/tests/wpt/metadata/FileAPI/idlharness.worker.js.ini
+++ b/tests/wpt/metadata/FileAPI/idlharness.worker.js.ini
@@ -1,57 +1,42 @@
-[idlharness.worker]
+[idlharness.worker.html]
type: testharness
- [URL interface: operation createFor(Blob)]
- expected: FAIL
-
- [FileReaderSync interface: operation readAsArrayBuffer(Blob)]
- expected: FAIL
-
- [FileReaderSync interface: operation readAsText(Blob,DOMString)]
- expected: FAIL
-
- [FileReaderSync interface: operation readAsDataURL(Blob)]
- expected: FAIL
-
- [FileReaderSync interface: new FileReaderSync() must inherit property "readAsArrayBuffer" with the proper type (0)]
- expected: FAIL
-
- [FileReaderSync interface: calling readAsArrayBuffer(Blob) on new FileReaderSync() with too few arguments must throw TypeError]
+ [ArrayBuffer interface: existence and properties of interface object]
expected: FAIL
- [FileReaderSync interface: new FileReaderSync() must inherit property "readAsText" with the proper type (1)]
+ [URL interface: operation createFor(Blob)]
expected: FAIL
- [FileReaderSync interface: calling readAsText(Blob,DOMString) on new FileReaderSync() with too few arguments must throw TypeError]
+ [EventTarget interface: existence and properties of interface object]
expected: FAIL
- [FileReaderSync interface: new FileReaderSync() must inherit property "readAsDataURL" with the proper type (2)]
+ [Event interface: existence and properties of interface object]
expected: FAIL
- [FileReaderSync interface: calling readAsDataURL(Blob) on new FileReaderSync() with too few arguments must throw TypeError]
+ [FileReader interface: operation readAsBinaryString(Blob)]
expected: FAIL
- [ArrayBuffer interface: existence and properties of interface object]
+ [FileReader interface: new FileReader() must inherit property "readAsBinaryString" with the proper type (1)]
expected: FAIL
- [URL interface: existence and properties of interface object]
+ [FileReader interface: calling readAsBinaryString(Blob) on new FileReader() with too few arguments must throw TypeError]
expected: FAIL
- [EventTarget interface: existence and properties of interface object]
+ [FileReaderSync interface: operation readAsArrayBuffer(Blob)]
expected: FAIL
- [Event interface: existence and properties of interface object]
+ [FileReaderSync interface: operation readAsBinaryString(Blob)]
expected: FAIL
- [FileReader interface: operation readAsBinaryString(Blob)]
+ [FileReaderSync interface: operation readAsText(Blob,DOMString)]
expected: FAIL
- [FileReader interface: new FileReader() must inherit property "readAsBinaryString" with the proper type (1)]
+ [FileReaderSync interface: operation readAsDataURL(Blob)]
expected: FAIL
- [FileReader interface: calling readAsBinaryString(Blob) on new FileReader() with too few arguments must throw TypeError]
+ [FileReaderSync interface: new FileReaderSync() must inherit property "readAsArrayBuffer" with the proper type (0)]
expected: FAIL
- [FileReaderSync interface: operation readAsBinaryString(Blob)]
+ [FileReaderSync interface: calling readAsArrayBuffer(Blob) on new FileReaderSync() with too few arguments must throw TypeError]
expected: FAIL
[FileReaderSync interface: new FileReaderSync() must inherit property "readAsBinaryString" with the proper type (1)]
@@ -63,6 +48,12 @@
[FileReaderSync interface: new FileReaderSync() must inherit property "readAsText" with the proper type (2)]
expected: FAIL
+ [FileReaderSync interface: calling readAsText(Blob,DOMString) on new FileReaderSync() with too few arguments must throw TypeError]
+ expected: FAIL
+
[FileReaderSync interface: new FileReaderSync() must inherit property "readAsDataURL" with the proper type (3)]
expected: FAIL
+ [FileReaderSync interface: calling readAsDataURL(Blob) on new FileReaderSync() with too few arguments must throw TypeError]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index fe62fb8536a..ec8882320d8 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -114,6 +114,22 @@
"url": "/annotation-model/annotations/annotationsAgentOptionals-manual.html"
},
{
+ "path": "annotation-model/collections/collectionMusts-manual.html",
+ "url": "/annotation-model/collections/collectionMusts-manual.html"
+ },
+ {
+ "path": "annotation-model/collections/collectionOptionals-manual.html",
+ "url": "/annotation-model/collections/collectionOptionals-manual.html"
+ },
+ {
+ "path": "annotation-model/collections/pages/pageMusts-manual.html",
+ "url": "/annotation-model/collections/pages/pageMusts-manual.html"
+ },
+ {
+ "path": "annotation-model/collections/pages/pageOptionals-manual.html",
+ "url": "/annotation-model/collections/pages/pageOptionals-manual.html"
+ },
+ {
"path": "annotation-protocol/server/server-manual.html",
"url": "/annotation-protocol/server/server-manual.html"
},
@@ -138,6 +154,82 @@
"url": "/battery-status/battery-unplugging-manual.html"
},
{
+ "path": "fullscreen/api/document-exit-fullscreen-manual.html",
+ "url": "/fullscreen/api/document-exit-fullscreen-manual.html"
+ },
+ {
+ "path": "fullscreen/api/document-fullscreen-element-manual.html",
+ "url": "/fullscreen/api/document-fullscreen-element-manual.html"
+ },
+ {
+ "path": "fullscreen/api/document-onfullscreenchange-manual.html",
+ "url": "/fullscreen/api/document-onfullscreenchange-manual.html"
+ },
+ {
+ "path": "fullscreen/api/element-ready-check-containing-iframe-manual.html",
+ "url": "/fullscreen/api/element-ready-check-containing-iframe-manual.html"
+ },
+ {
+ "path": "fullscreen/api/element-ready-check-enabled-flag-not-set-manual.html",
+ "url": "/fullscreen/api/element-ready-check-enabled-flag-not-set-manual.html"
+ },
+ {
+ "path": "fullscreen/api/element-ready-check-fullscreen-element-sibling-manual.html",
+ "url": "/fullscreen/api/element-ready-check-fullscreen-element-sibling-manual.html"
+ },
+ {
+ "path": "fullscreen/api/element-ready-check-fullscreen-iframe-child-manual.html",
+ "url": "/fullscreen/api/element-ready-check-fullscreen-iframe-child-manual.html"
+ },
+ {
+ "path": "fullscreen/api/element-ready-check-iframe-child-manual.html",
+ "url": "/fullscreen/api/element-ready-check-iframe-child-manual.html"
+ },
+ {
+ "path": "fullscreen/api/element-ready-check-not-in-document-manual.html",
+ "url": "/fullscreen/api/element-ready-check-not-in-document-manual.html"
+ },
+ {
+ "path": "fullscreen/api/element-request-fullscreen-manual.html",
+ "url": "/fullscreen/api/element-request-fullscreen-manual.html"
+ },
+ {
+ "path": "fullscreen/api/element-request-fullscreen-non-top-manual.html",
+ "url": "/fullscreen/api/element-request-fullscreen-non-top-manual.html"
+ },
+ {
+ "path": "fullscreen/api/element-request-fullscreen-svg-rect-manual.html",
+ "url": "/fullscreen/api/element-request-fullscreen-svg-rect-manual.html"
+ },
+ {
+ "path": "fullscreen/api/element-request-fullscreen-svg-svg-manual.html",
+ "url": "/fullscreen/api/element-request-fullscreen-svg-svg-manual.html"
+ },
+ {
+ "path": "fullscreen/api/element-request-fullscreen-top-manual.html",
+ "url": "/fullscreen/api/element-request-fullscreen-top-manual.html"
+ },
+ {
+ "path": "fullscreen/model/remove-child-manual.html",
+ "url": "/fullscreen/model/remove-child-manual.html"
+ },
+ {
+ "path": "fullscreen/model/remove-first-manual.html",
+ "url": "/fullscreen/model/remove-first-manual.html"
+ },
+ {
+ "path": "fullscreen/model/remove-last-manual.html",
+ "url": "/fullscreen/model/remove-last-manual.html"
+ },
+ {
+ "path": "fullscreen/model/remove-parent-manual.html",
+ "url": "/fullscreen/model/remove-parent-manual.html"
+ },
+ {
+ "path": "fullscreen/model/remove-single-manual.html",
+ "url": "/fullscreen/model/remove-single-manual.html"
+ },
+ {
"path": "gamepad/events-manual.html",
"url": "/gamepad/events-manual.html"
},
@@ -294,6 +386,10 @@
"url": "/html/browsers/history/the-history-interface/non-automated/traverse_the_history_unload_prompt_2-manual.html"
},
{
+ "path": "html/browsers/history/the-history-interface/non-automated/traverse_the_session_history_unload_prompt_1-manual.html",
+ "url": "/html/browsers/history/the-history-interface/non-automated/traverse_the_session_history_unload_prompt_1-manual.html"
+ },
+ {
"path": "html/browsers/history/the-location-interface/non-automated/manual_click_assign_during_load-manual.html",
"url": "/html/browsers/history/the-location-interface/non-automated/manual_click_assign_during_load-manual.html"
},
@@ -414,10 +510,22 @@
"url": "/html/browsers/the-window-object/the-windowproxy-object/test-window-proxy-toolbar-manual.html"
},
{
+ "path": "html/browsers/windows/noreferrer-cross-origin-close-manual.sub.html",
+ "url": "/html/browsers/windows/noreferrer-cross-origin-close-manual.sub.html"
+ },
+ {
"path": "html/browsers/windows/noreferrer-cross-origin-manual.html",
"url": "/html/browsers/windows/noreferrer-cross-origin-manual.html"
},
{
+ "path": "html/browsers/windows/targeting-multiple-cross-origin-manual.sub.html",
+ "url": "/html/browsers/windows/targeting-multiple-cross-origin-manual.sub.html"
+ },
+ {
+ "path": "html/editing/activation/click-manual.html",
+ "url": "/html/editing/activation/click-manual.html"
+ },
+ {
"path": "html/editing/dnd/datastore/015-manual.html",
"url": "/html/editing/dnd/datastore/015-manual.html"
},
@@ -834,6 +942,14 @@
"url": "/html/webappapis/system-state-and-capabilities/the-navigator-object/get-navigatorlanguage-manual.html"
},
{
+ "path": "mathml/relations/html5-tree/href-manual.html",
+ "url": "/mathml/relations/html5-tree/href-manual.html"
+ },
+ {
+ "path": "mediacapture-streams/MediaStream-id-manual.https.html",
+ "url": "/mediacapture-streams/MediaStream-id-manual.https.html"
+ },
+ {
"path": "notifications/body-basic-manual.html",
"url": "/notifications/body-basic-manual.html"
},
@@ -1082,6 +1198,10 @@
"url": "/pointerevents/pointerevent_element_haspointercapture-manual.html"
},
{
+ "path": "pointerevents/pointerevent_element_haspointercapture_release_pending_capture-manual.html",
+ "url": "/pointerevents/pointerevent_element_haspointercapture_release_pending_capture-manual.html"
+ },
+ {
"path": "pointerevents/pointerevent_gotpointercapture_before_first_pointerevent-manual.html",
"url": "/pointerevents/pointerevent_gotpointercapture_before_first_pointerevent-manual.html"
},
@@ -1138,6 +1258,10 @@
"url": "/pointerevents/pointerevent_pointermove_isprimary_same_as_pointerdown-manual.html"
},
{
+ "path": "pointerevents/pointerevent_pointermove_on_chorded_mouse_button-manual.html",
+ "url": "/pointerevents/pointerevent_pointermove_on_chorded_mouse_button-manual.html"
+ },
+ {
"path": "pointerevents/pointerevent_pointerout_after_pointercancel_touch-manual.html",
"url": "/pointerevents/pointerevent_pointerout_after_pointercancel_touch-manual.html"
},
@@ -1166,6 +1290,10 @@
"url": "/pointerevents/pointerevent_releasepointercapture_onpointerup_mouse-manual.html"
},
{
+ "path": "pointerevents/pointerevent_releasepointercapture_release_right_after_capture-manual.html",
+ "url": "/pointerevents/pointerevent_releasepointercapture_release_right_after_capture-manual.html"
+ },
+ {
"path": "pointerevents/pointerevent_setpointercapture_disconnected-manual.html",
"url": "/pointerevents/pointerevent_setpointercapture_disconnected-manual.html"
},
@@ -1178,10 +1306,18 @@
"url": "/pointerevents/pointerevent_setpointercapture_invalid_pointerid-manual.html"
},
{
+ "path": "pointerevents/pointerevent_setpointercapture_override_pending_capture_element-manual.html",
+ "url": "/pointerevents/pointerevent_setpointercapture_override_pending_capture_element-manual.html"
+ },
+ {
"path": "pointerevents/pointerevent_setpointercapture_relatedtarget-manual.html",
"url": "/pointerevents/pointerevent_setpointercapture_relatedtarget-manual.html"
},
{
+ "path": "pointerevents/pointerevent_setpointercapture_to_same_element_twice-manual.html",
+ "url": "/pointerevents/pointerevent_setpointercapture_to_same_element_twice-manual.html"
+ },
+ {
"path": "pointerevents/pointerevent_suppress_compat_events_on_click-manual.html",
"url": "/pointerevents/pointerevent_suppress_compat_events_on_click-manual.html"
},
@@ -1310,6 +1446,10 @@
"url": "/pointerlock/pointerlock_remove_target-manual.html"
},
{
+ "path": "pointerlock/pointerlock_shadow-manual.html",
+ "url": "/pointerlock/pointerlock_shadow-manual.html"
+ },
+ {
"path": "presentation-api/controlling-ua/PresentationConnection_onclosed-manual.html",
"url": "/presentation-api/controlling-ua/PresentationConnection_onclosed-manual.html"
},
@@ -1322,20 +1462,32 @@
"url": "/presentation-api/controlling-ua/PresentationConnection_onterminated-manual.html"
},
{
- "path": "presentation-api/controlling-ua/defaultRequest_success-manual.html",
- "url": "/presentation-api/controlling-ua/defaultRequest_success-manual.html"
+ "path": "presentation-api/controlling-ua/PresentationRequest_onconnectionavailable-manual.html",
+ "url": "/presentation-api/controlling-ua/PresentationRequest_onconnectionavailable-manual.html"
},
{
- "path": "presentation-api/controlling-ua/reconnectToPresentation_error-manual.html",
- "url": "/presentation-api/controlling-ua/reconnectToPresentation_error-manual.html"
+ "path": "presentation-api/controlling-ua/defaultRequest_success-manual.html",
+ "url": "/presentation-api/controlling-ua/defaultRequest_success-manual.html"
},
{
"path": "presentation-api/controlling-ua/reconnectToPresentation_success-manual.html",
"url": "/presentation-api/controlling-ua/reconnectToPresentation_success-manual.html"
},
{
- "path": "presentation-api/controlling-ua/startNewPresentation_error-manual.html",
- "url": "/presentation-api/controlling-ua/startNewPresentation_error-manual.html"
+ "path": "presentation-api/controlling-ua/startNewPresentation_displaynotallowed-manual.html",
+ "url": "/presentation-api/controlling-ua/startNewPresentation_displaynotallowed-manual.html"
+ },
+ {
+ "path": "presentation-api/controlling-ua/startNewPresentation_displaynotfound-manual.html",
+ "url": "/presentation-api/controlling-ua/startNewPresentation_displaynotfound-manual.html"
+ },
+ {
+ "path": "presentation-api/controlling-ua/startNewPresentation_mixedcontent-manual.https.html",
+ "url": "/presentation-api/controlling-ua/startNewPresentation_mixedcontent-manual.https.html"
+ },
+ {
+ "path": "presentation-api/controlling-ua/startNewPresentation_mixedcontent_multiple-manual.https.html",
+ "url": "/presentation-api/controlling-ua/startNewPresentation_mixedcontent_multiple-manual.https.html"
},
{
"path": "presentation-api/controlling-ua/startNewPresentation_sandboxing_error-manual.html",
@@ -1350,6 +1502,10 @@
"url": "/presentation-api/controlling-ua/startNewPresentation_success-manual.html"
},
{
+ "path": "presentation-api/controlling-ua/startNewPresentation_unsettledpromise-manual.html",
+ "url": "/presentation-api/controlling-ua/startNewPresentation_unsettledpromise-manual.html"
+ },
+ {
"path": "quirks-mode/active-and-hover-manual.html",
"url": "/quirks-mode/active-and-hover-manual.html"
},
@@ -2762,10 +2918,6 @@
"url": "/svg/import/shapes-polyline-02-t-manual.svg"
},
{
- "path": "svg/import/shapes-rect-01-t-manual.svg",
- "url": "/svg/import/shapes-rect-01-t-manual.svg"
- },
- {
"path": "svg/import/shapes-rect-02-t-manual.svg",
"url": "/svg/import/shapes-rect-02-t-manual.svg"
},
@@ -3478,6 +3630,10 @@
"url": "/uievents/keyboard/key-manual.js"
},
{
+ "path": "uievents/order-of-events/focus-events/focus-contained-manual.html",
+ "url": "/uievents/order-of-events/focus-events/focus-contained-manual.html"
+ },
+ {
"path": "uievents/order-of-events/focus-events/focus-manual.html",
"url": "/uievents/order-of-events/focus-events/focus-manual.html"
},
@@ -3486,6 +3642,10 @@
"url": "/uievents/order-of-events/focus-events/legacy-manual.html"
},
{
+ "path": "uievents/order-of-events/mouse-events/click-cancel-manual.html",
+ "url": "/uievents/order-of-events/mouse-events/click-cancel-manual.html"
+ },
+ {
"path": "uievents/order-of-events/mouse-events/click-on-body-manual.html",
"url": "/uievents/order-of-events/mouse-events/click-on-body-manual.html"
},
@@ -3498,10 +3658,22 @@
"url": "/uievents/order-of-events/mouse-events/click-on-html-manual.html"
},
{
+ "path": "uievents/order-of-events/mouse-events/click-order-manual.html",
+ "url": "/uievents/order-of-events/mouse-events/click-order-manual.html"
+ },
+ {
"path": "uievents/order-of-events/mouse-events/mouseevents-mousemove-manual.htm",
"url": "/uievents/order-of-events/mouse-events/mouseevents-mousemove-manual.htm"
},
{
+ "path": "uievents/order-of-events/mouse-events/mousemove-across-manual.html",
+ "url": "/uievents/order-of-events/mouse-events/mousemove-across-manual.html"
+ },
+ {
+ "path": "uievents/order-of-events/mouse-events/mousemove-between-manual.html",
+ "url": "/uievents/order-of-events/mouse-events/mousemove-between-manual.html"
+ },
+ {
"path": "uievents/order-of-events/mouse-events/mouseover-out-manual.html",
"url": "/uievents/order-of-events/mouse-events/mouseover-out-manual.html"
},
@@ -4016,6 +4188,26 @@
"url": "/compat/webkit-text-fill-color-property-006.html"
},
{
+ "path": "content-security-policy/font-src/font-blacklisted.html",
+ "references": [
+ [
+ "/content-security-policy/font-src/font-blacklisted-ref.html",
+ "!="
+ ]
+ ],
+ "url": "/content-security-policy/font-src/font-blacklisted.html"
+ },
+ {
+ "path": "content-security-policy/font-src/font-whitelisted.html",
+ "references": [
+ [
+ "/content-security-policy/font-src/font-whitelisted-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/content-security-policy/font-src/font-whitelisted.html"
+ },
+ {
"path": "custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-custom-tag.html",
"references": [
[
@@ -5536,6 +5728,26 @@
"url": "/html/rendering/replaced-elements/images/space.html"
},
{
+ "path": "html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html",
+ "references": [
+ [
+ "/html/semantics/document-metadata/the-link-element/stylesheet-empty-href-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html"
+ },
+ {
+ "path": "html/semantics/document-metadata/the-link-element/stylesheet-media.html",
+ "references": [
+ [
+ "/html/semantics/document-metadata/the-link-element/stylesheet-media-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/document-metadata/the-link-element/stylesheet-media.html"
+ },
+ {
"path": "html/semantics/document-metadata/the-link-element/stylesheet-with-base.html",
"references": [
[
@@ -5746,6 +5958,106 @@
"url": "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-002.html"
},
{
+ "path": "html/semantics/grouping-content/the-li-element/grouping-li-reftest-display-list-item.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-display-list-item-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-display-list-item.html"
+ },
+ {
+ "path": "html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu.html"
+ },
+ {
+ "path": "html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-mixed.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-mixed-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-mixed.html"
+ },
+ {
+ "path": "html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-not-dir.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-not-dir-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-not-dir.html"
+ },
+ {
+ "path": "html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ol.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ol-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ol.html"
+ },
+ {
+ "path": "html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-parent.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-parent-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-parent.html"
+ },
+ {
+ "path": "html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes.html"
+ },
+ {
+ "path": "html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ul.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ul-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ul.html"
+ },
+ {
+ "path": "html/semantics/grouping-content/the-li-element/grouping-li-reftest-no-list-owner.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-no-list-owner-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-no-list-owner.html"
+ },
+ {
+ "path": "html/semantics/grouping-content/the-li-element/grouping-li-reftest-not-being-rendered.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-not-being-rendered-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-not-being-rendered.html"
+ },
+ {
"path": "html/semantics/grouping-content/the-ol-element/grouping-ol-rev-reftest-001.html",
"references": [
[
@@ -5806,6 +6118,56 @@
"url": "/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-003.html"
},
{
+ "path": "html/semantics/grouping-content/the-ol-element/reversed-1a.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-ol-element/reversed-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-ol-element/reversed-1a.html"
+ },
+ {
+ "path": "html/semantics/grouping-content/the-ol-element/reversed-1b.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-ol-element/reversed-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-ol-element/reversed-1b.html"
+ },
+ {
+ "path": "html/semantics/grouping-content/the-ol-element/reversed-1c.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-ol-element/reversed-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-ol-element/reversed-1c.html"
+ },
+ {
+ "path": "html/semantics/grouping-content/the-ol-element/reversed-1d.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-ol-element/reversed-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-ol-element/reversed-1d.html"
+ },
+ {
+ "path": "html/semantics/grouping-content/the-ol-element/reversed-1e.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-ol-element/reversed-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-ol-element/reversed-1e.html"
+ },
+ {
"path": "html/semantics/grouping-content/the-ol-element/reversed-2.html",
"references": [
[
@@ -6116,6 +6478,356 @@
"url": "/http/basic-auth-cache-test.html"
},
{
+ "path": "mathml/presentation-markup/spaces/space-2.html",
+ "references": [
+ [
+ "/mathml/presentation-markup/spaces/space-2-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/presentation-markup/spaces/space-2.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/color-1.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/color-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/color-1.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/display-1.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/display-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/display-1.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/lengths-1.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/lengths-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/lengths-1.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/lengths-2.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/lengths-2-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/lengths-2.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/mathvariant-bold-fraktur.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-bold-fraktur-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-bold-fraktur.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/mathvariant-bold-italic.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-bold-italic-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-bold-italic.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/mathvariant-bold-sans-serif.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-bold-sans-serif-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-bold-sans-serif.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/mathvariant-bold-script.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-bold-script-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-bold-script.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/mathvariant-bold.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-bold-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-bold.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/mathvariant-double-struck.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-double-struck-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-double-struck.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/mathvariant-fraktur.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-fraktur-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-fraktur.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/mathvariant-initial.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-initial-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-initial.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/mathvariant-italic.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-italic-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-italic.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/mathvariant-looped.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-looped-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-looped.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/mathvariant-monospace.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-monospace-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-monospace.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/mathvariant-sans-serif-bold-italic.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-sans-serif-bold-italic-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-sans-serif-bold-italic.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/mathvariant-sans-serif-italic.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-sans-serif-italic-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-sans-serif-italic.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/mathvariant-sans-serif.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-sans-serif-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-sans-serif.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/mathvariant-script.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-script-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-script.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/mathvariant-stretched.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-stretched-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-stretched.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/mathvariant-tailed.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-tailed-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-tailed.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/visibility-1.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/visibility-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/visibility-1.html"
+ },
+ {
+ "path": "mathml/relations/html5-tree/class-1.html",
+ "references": [
+ [
+ "/mathml/relations/html5-tree/class-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/html5-tree/class-1.html"
+ },
+ {
+ "path": "mathml/relations/html5-tree/color-attributes-1.html",
+ "references": [
+ [
+ "/mathml/relations/html5-tree/color-attributes-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/html5-tree/color-attributes-1.html"
+ },
+ {
+ "path": "mathml/relations/html5-tree/dynamic-1.html",
+ "references": [
+ [
+ "/mathml/relations/html5-tree/dynamic-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/html5-tree/dynamic-1.html"
+ },
+ {
+ "path": "mathml/relations/html5-tree/href-click-1.html",
+ "references": [
+ [
+ "/mathml/relations/html5-tree/href-click-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/html5-tree/href-click-1.html"
+ },
+ {
+ "path": "mathml/relations/html5-tree/href-click-2.html",
+ "references": [
+ [
+ "/mathml/relations/html5-tree/href-click-2-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/html5-tree/href-click-2.html"
+ },
+ {
+ "path": "mathml/relations/html5-tree/integration-point-1.html",
+ "references": [
+ [
+ "/mathml/relations/html5-tree/integration-point-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/html5-tree/integration-point-1.html"
+ },
+ {
+ "path": "mathml/relations/html5-tree/integration-point-2.html",
+ "references": [
+ [
+ "/mathml/relations/html5-tree/integration-point-2-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/html5-tree/integration-point-2.html"
+ },
+ {
+ "path": "mathml/relations/html5-tree/integration-point-3.html",
+ "references": [
+ [
+ "/mathml/relations/html5-tree/integration-point-3-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/html5-tree/integration-point-3.html"
+ },
+ {
+ "path": "mathml/relations/html5-tree/required-extensions-2.html",
+ "references": [
+ [
+ "/mathml/relations/html5-tree/required-extensions-2-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/html5-tree/required-extensions-2.html"
+ },
+ {
+ "path": "mathml/relations/html5-tree/unique-identifier-1.html",
+ "references": [
+ [
+ "/mathml/relations/html5-tree/unique-identifier-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/html5-tree/unique-identifier-1.html"
+ },
+ {
+ "path": "mathml/relations/html5-tree/unique-identifier-3.html",
+ "references": [
+ [
+ "/mathml/relations/html5-tree/unique-identifier-3-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/html5-tree/unique-identifier-3.html"
+ },
+ {
+ "path": "mathml/relations/text-and-math/use-typo-metrics-1.html",
+ "references": [
+ [
+ "/mathml/relations/text-and-math/use-typo-metrics-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/text-and-math/use-typo-metrics-1.html"
+ },
+ {
"path": "quirks-mode/historical/list-item-bullet-size.html",
"references": [
[
@@ -6186,6 +6898,126 @@
"url": "/shadow-dom/untriaged/styles/not-apply-in-shadow-root-001.html"
},
{
+ "path": "svg/linking/reftests/href-a-element-attr-change.html",
+ "references": [
+ [
+ "/svg/linking/reftests/href-a-element-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/linking/reftests/href-a-element-attr-change.html"
+ },
+ {
+ "path": "svg/linking/reftests/href-feImage-element.html",
+ "references": [
+ [
+ "/svg/linking/reftests/href-feImage-element-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/linking/reftests/href-feImage-element.html"
+ },
+ {
+ "path": "svg/linking/reftests/href-filter-element.html",
+ "references": [
+ [
+ "/svg/linking/reftests/href-filter-element-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/linking/reftests/href-filter-element.html"
+ },
+ {
+ "path": "svg/linking/reftests/href-gradient-element.html",
+ "references": [
+ [
+ "/svg/linking/reftests/href-gradient-element-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/linking/reftests/href-gradient-element.html"
+ },
+ {
+ "path": "svg/linking/reftests/href-image-element.html",
+ "references": [
+ [
+ "/svg/linking/reftests/href-image-element-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/linking/reftests/href-image-element.html"
+ },
+ {
+ "path": "svg/linking/reftests/href-pattern-element.html",
+ "references": [
+ [
+ "/svg/linking/reftests/href-pattern-element-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/linking/reftests/href-pattern-element.html"
+ },
+ {
+ "path": "svg/linking/reftests/href-textPath-element.html",
+ "references": [
+ [
+ "/svg/linking/reftests/href-textPath-element-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/linking/reftests/href-textPath-element.html"
+ },
+ {
+ "path": "svg/linking/reftests/href-use-element.html",
+ "references": [
+ [
+ "/svg/linking/reftests/href-use-element-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/linking/reftests/href-use-element.html"
+ },
+ {
+ "path": "svg/shapes/rect-01.svg",
+ "references": [
+ [
+ "/svg/shapes/rect-01-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/shapes/rect-01.svg"
+ },
+ {
+ "path": "svg/shapes/rect-02.svg",
+ "references": [
+ [
+ "/svg/shapes/rect-02-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/shapes/rect-02.svg"
+ },
+ {
+ "path": "svg/shapes/rect-03.svg",
+ "references": [
+ [
+ "/svg/shapes/rect-03-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/shapes/rect-03.svg"
+ },
+ {
+ "path": "svg/shapes/rect-04.svg",
+ "references": [
+ [
+ "/svg/shapes/rect-04-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/shapes/rect-04.svg"
+ },
+ {
"path": "webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_completely_move_up.html",
"references": [
[
@@ -8692,6 +9524,10 @@
"url": "/2dcontext/compositing/2d.composite.globalAlpha.canvas.html"
},
{
+ "path": "2dcontext/compositing/2d.composite.globalAlpha.canvascopy.html",
+ "url": "/2dcontext/compositing/2d.composite.globalAlpha.canvascopy.html"
+ },
+ {
"path": "2dcontext/compositing/2d.composite.globalAlpha.canvaspattern.html",
"url": "/2dcontext/compositing/2d.composite.globalAlpha.canvaspattern.html"
},
@@ -9396,6 +10232,126 @@
"url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.invalidtype.html"
},
{
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-2.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-2.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.html"
+ },
+ {
"path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.current.basic.html",
"url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.current.basic.html"
},
@@ -9504,6 +10460,70 @@
"url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.html4.html"
},
{
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-1.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-1.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-2.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-2.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-3.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-3.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-4.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-4.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-5.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-5.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-1.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-1.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-2.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-2.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-3.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-3.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-1.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-1.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-2.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-2.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-3.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-3.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-4.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-4.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-5.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-5.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-1.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-1.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-2.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-2.html"
+ },
+ {
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-3.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-3.html"
+ },
+ {
"path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex1.html",
"url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hex1.html"
},
@@ -9568,6 +10588,10 @@
"url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-2.html"
},
{
+ "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-3.html",
+ "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-3.html"
+ },
+ {
"path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-1.html",
"url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.name-1.html"
},
@@ -9600,22 +10624,6 @@
"url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-3.html"
},
{
- "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-4.html",
- "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-4.html"
- },
- {
- "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-5.html",
- "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-5.html"
- },
- {
- "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-6.html",
- "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-6.html"
- },
- {
- "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-7.html",
- "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-7.html"
- },
- {
"path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-1.html",
"url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-1.html"
},
@@ -9636,14 +10644,6 @@
"url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-5.html"
},
{
- "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-6.html",
- "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-6.html"
- },
- {
- "path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-7.html",
- "url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-7.html"
- },
- {
"path": "2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-1.html",
"url": "/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.rgb-clamp-1.html"
},
@@ -10264,6 +11264,10 @@
"url": "/2dcontext/line-styles/2d.line.width.valid.html"
},
{
+ "path": "2dcontext/line-styles/setLineDash.html",
+ "url": "/2dcontext/line-styles/setLineDash.html"
+ },
+ {
"path": "2dcontext/path-objects/2d.path.arc.angle.1.html",
"url": "/2dcontext/path-objects/2d.path.arc.angle.1.html"
},
@@ -10624,6 +11628,10 @@
"url": "/2dcontext/path-objects/2d.path.lineTo.nextpoint.html"
},
{
+ "path": "2dcontext/path-objects/2d.path.lineTo.nonfinite.details.html",
+ "url": "/2dcontext/path-objects/2d.path.lineTo.nonfinite.details.html"
+ },
+ {
"path": "2dcontext/path-objects/2d.path.lineTo.nonfinite.html",
"url": "/2dcontext/path-objects/2d.path.lineTo.nonfinite.html"
},
@@ -11529,7 +12537,7 @@
},
{
"path": "FileAPI/FileReaderSync.worker.js",
- "url": "/FileAPI/FileReaderSync.worker"
+ "url": "/FileAPI/FileReaderSync.worker.html"
},
{
"path": "FileAPI/blob/Blob-XHR-revoke.html",
@@ -11545,7 +12553,7 @@
},
{
"path": "FileAPI/blob/Blob-in-worker.worker.js",
- "url": "/FileAPI/blob/Blob-in-worker.worker"
+ "url": "/FileAPI/blob/Blob-in-worker.worker.html"
},
{
"path": "FileAPI/blob/Blob-slice-overflow.html",
@@ -11561,7 +12569,7 @@
},
{
"path": "FileAPI/file/Worker-read-file-constructor.worker.js",
- "url": "/FileAPI/file/Worker-read-file-constructor.worker"
+ "url": "/FileAPI/file/Worker-read-file-constructor.worker.html"
},
{
"path": "FileAPI/fileReader.html",
@@ -11581,7 +12589,7 @@
},
{
"path": "FileAPI/idlharness.worker.js",
- "url": "/FileAPI/idlharness.worker"
+ "url": "/FileAPI/idlharness.worker.html"
},
{
"path": "FileAPI/reading-data-section/Determining-Encoding.html",
@@ -12124,6 +13132,18 @@
"url": "/IndexedDB/idbindex-multientry.htm"
},
{
+ "path": "IndexedDB/idbindex-rename-abort.html",
+ "url": "/IndexedDB/idbindex-rename-abort.html"
+ },
+ {
+ "path": "IndexedDB/idbindex-rename-errors.html",
+ "url": "/IndexedDB/idbindex-rename-errors.html"
+ },
+ {
+ "path": "IndexedDB/idbindex-rename.html",
+ "url": "/IndexedDB/idbindex-rename.html"
+ },
+ {
"path": "IndexedDB/idbindex_count.htm",
"url": "/IndexedDB/idbindex_count.htm"
},
@@ -12256,6 +13276,18 @@
"url": "/IndexedDB/idbkeyrange_incorrect.htm"
},
{
+ "path": "IndexedDB/idbobjectstore-rename-abort.html",
+ "url": "/IndexedDB/idbobjectstore-rename-abort.html"
+ },
+ {
+ "path": "IndexedDB/idbobjectstore-rename-errors.html",
+ "url": "/IndexedDB/idbobjectstore-rename-errors.html"
+ },
+ {
+ "path": "IndexedDB/idbobjectstore-rename-store.html",
+ "url": "/IndexedDB/idbobjectstore-rename-store.html"
+ },
+ {
"path": "IndexedDB/idbobjectstore_add.htm",
"url": "/IndexedDB/idbobjectstore_add.htm"
},
@@ -12581,7 +13613,7 @@
},
{
"path": "IndexedDB/interfaces.worker.js",
- "url": "/IndexedDB/interfaces.worker"
+ "url": "/IndexedDB/interfaces.worker.html"
},
{
"path": "IndexedDB/key_invalid.htm",
@@ -12628,6 +13660,22 @@
"url": "/IndexedDB/string-list-ordering.htm"
},
{
+ "path": "IndexedDB/transaction-abort-generator-revert.html",
+ "url": "/IndexedDB/transaction-abort-generator-revert.html"
+ },
+ {
+ "path": "IndexedDB/transaction-abort-index-metadata-revert.html",
+ "url": "/IndexedDB/transaction-abort-index-metadata-revert.html"
+ },
+ {
+ "path": "IndexedDB/transaction-abort-multiple-metadata-revert.html",
+ "url": "/IndexedDB/transaction-abort-multiple-metadata-revert.html"
+ },
+ {
+ "path": "IndexedDB/transaction-abort-object-store-metadata-revert.html",
+ "url": "/IndexedDB/transaction-abort-object-store-metadata-revert.html"
+ },
+ {
"path": "IndexedDB/transaction-create_in_versionchange.htm",
"url": "/IndexedDB/transaction-create_in_versionchange.htm"
},
@@ -12661,131 +13709,131 @@
},
{
"path": "WebCryptoAPI/derive_bits_keys/ecdh_bits.worker.js",
- "url": "/WebCryptoAPI/derive_bits_keys/ecdh_bits.worker"
+ "url": "/WebCryptoAPI/derive_bits_keys/ecdh_bits.worker.html"
},
{
"path": "WebCryptoAPI/derive_bits_keys/ecdh_keys.worker.js",
- "url": "/WebCryptoAPI/derive_bits_keys/ecdh_keys.worker"
+ "url": "/WebCryptoAPI/derive_bits_keys/ecdh_keys.worker.html"
},
{
"path": "WebCryptoAPI/derive_bits_keys/hkdf.worker.js",
- "url": "/WebCryptoAPI/derive_bits_keys/hkdf.worker"
+ "url": "/WebCryptoAPI/derive_bits_keys/hkdf.worker.html"
},
{
"path": "WebCryptoAPI/derive_bits_keys/pbkdf2.worker.js",
- "url": "/WebCryptoAPI/derive_bits_keys/pbkdf2.worker"
+ "url": "/WebCryptoAPI/derive_bits_keys/pbkdf2.worker.html"
},
{
"path": "WebCryptoAPI/digest/digest.worker.js",
- "url": "/WebCryptoAPI/digest/digest.worker"
+ "url": "/WebCryptoAPI/digest/digest.worker.html"
},
{
"path": "WebCryptoAPI/encrypt_decrypt/aes_cbc.worker.js",
- "url": "/WebCryptoAPI/encrypt_decrypt/aes_cbc.worker"
+ "url": "/WebCryptoAPI/encrypt_decrypt/aes_cbc.worker.html"
},
{
"path": "WebCryptoAPI/encrypt_decrypt/aes_ctr.worker.js",
- "url": "/WebCryptoAPI/encrypt_decrypt/aes_ctr.worker"
+ "url": "/WebCryptoAPI/encrypt_decrypt/aes_ctr.worker.html"
},
{
"path": "WebCryptoAPI/encrypt_decrypt/aes_gcm.worker.js",
- "url": "/WebCryptoAPI/encrypt_decrypt/aes_gcm.worker"
+ "url": "/WebCryptoAPI/encrypt_decrypt/aes_gcm.worker.html"
},
{
"path": "WebCryptoAPI/encrypt_decrypt/rsa.worker.js",
- "url": "/WebCryptoAPI/encrypt_decrypt/rsa.worker"
+ "url": "/WebCryptoAPI/encrypt_decrypt/rsa.worker.html"
},
{
"path": "WebCryptoAPI/generateKey/failures.worker.js",
- "url": "/WebCryptoAPI/generateKey/failures.worker"
+ "url": "/WebCryptoAPI/generateKey/failures.worker.html"
},
{
"path": "WebCryptoAPI/generateKey/failures_AES-CBC.worker.js",
- "url": "/WebCryptoAPI/generateKey/failures_AES-CBC.worker"
+ "url": "/WebCryptoAPI/generateKey/failures_AES-CBC.worker.html"
},
{
"path": "WebCryptoAPI/generateKey/failures_AES-CTR.worker.js",
- "url": "/WebCryptoAPI/generateKey/failures_AES-CTR.worker"
+ "url": "/WebCryptoAPI/generateKey/failures_AES-CTR.worker.html"
},
{
"path": "WebCryptoAPI/generateKey/failures_AES-GCM.worker.js",
- "url": "/WebCryptoAPI/generateKey/failures_AES-GCM.worker"
+ "url": "/WebCryptoAPI/generateKey/failures_AES-GCM.worker.html"
},
{
"path": "WebCryptoAPI/generateKey/failures_AES-KW.worker.js",
- "url": "/WebCryptoAPI/generateKey/failures_AES-KW.worker"
+ "url": "/WebCryptoAPI/generateKey/failures_AES-KW.worker.html"
},
{
"path": "WebCryptoAPI/generateKey/failures_ECDH.worker.js",
- "url": "/WebCryptoAPI/generateKey/failures_ECDH.worker"
+ "url": "/WebCryptoAPI/generateKey/failures_ECDH.worker.html"
},
{
"path": "WebCryptoAPI/generateKey/failures_ECDSA.worker.js",
- "url": "/WebCryptoAPI/generateKey/failures_ECDSA.worker"
+ "url": "/WebCryptoAPI/generateKey/failures_ECDSA.worker.html"
},
{
"path": "WebCryptoAPI/generateKey/failures_HMAC.worker.js",
- "url": "/WebCryptoAPI/generateKey/failures_HMAC.worker"
+ "url": "/WebCryptoAPI/generateKey/failures_HMAC.worker.html"
},
{
"path": "WebCryptoAPI/generateKey/failures_RSA-OAEP.worker.js",
- "url": "/WebCryptoAPI/generateKey/failures_RSA-OAEP.worker"
+ "url": "/WebCryptoAPI/generateKey/failures_RSA-OAEP.worker.html"
},
{
"path": "WebCryptoAPI/generateKey/failures_RSA-PSS.worker.js",
- "url": "/WebCryptoAPI/generateKey/failures_RSA-PSS.worker"
+ "url": "/WebCryptoAPI/generateKey/failures_RSA-PSS.worker.html"
},
{
"path": "WebCryptoAPI/generateKey/failures_RSASSA-PKCS1-v1_5.worker.js",
- "url": "/WebCryptoAPI/generateKey/failures_RSASSA-PKCS1-v1_5.worker"
+ "url": "/WebCryptoAPI/generateKey/failures_RSASSA-PKCS1-v1_5.worker.html"
},
{
"path": "WebCryptoAPI/generateKey/successes.worker.js",
- "url": "/WebCryptoAPI/generateKey/successes.worker"
+ "url": "/WebCryptoAPI/generateKey/successes.worker.html"
},
{
"path": "WebCryptoAPI/generateKey/successes_AES-CBC.worker.js",
- "url": "/WebCryptoAPI/generateKey/successes_AES-CBC.worker"
+ "url": "/WebCryptoAPI/generateKey/successes_AES-CBC.worker.html"
},
{
"path": "WebCryptoAPI/generateKey/successes_AES-CTR.worker.js",
- "url": "/WebCryptoAPI/generateKey/successes_AES-CTR.worker"
+ "url": "/WebCryptoAPI/generateKey/successes_AES-CTR.worker.html"
},
{
"path": "WebCryptoAPI/generateKey/successes_AES-GCM.worker.js",
- "url": "/WebCryptoAPI/generateKey/successes_AES-GCM.worker"
+ "url": "/WebCryptoAPI/generateKey/successes_AES-GCM.worker.html"
},
{
"path": "WebCryptoAPI/generateKey/successes_AES-KW.worker.js",
- "url": "/WebCryptoAPI/generateKey/successes_AES-KW.worker"
+ "url": "/WebCryptoAPI/generateKey/successes_AES-KW.worker.html"
},
{
"path": "WebCryptoAPI/generateKey/successes_ECDH.worker.js",
- "url": "/WebCryptoAPI/generateKey/successes_ECDH.worker"
+ "url": "/WebCryptoAPI/generateKey/successes_ECDH.worker.html"
},
{
"path": "WebCryptoAPI/generateKey/successes_ECDSA.worker.js",
- "url": "/WebCryptoAPI/generateKey/successes_ECDSA.worker"
+ "url": "/WebCryptoAPI/generateKey/successes_ECDSA.worker.html"
},
{
"path": "WebCryptoAPI/generateKey/successes_HMAC.worker.js",
- "url": "/WebCryptoAPI/generateKey/successes_HMAC.worker"
+ "url": "/WebCryptoAPI/generateKey/successes_HMAC.worker.html"
},
{
"path": "WebCryptoAPI/generateKey/successes_RSA-OAEP.worker.js",
- "url": "/WebCryptoAPI/generateKey/successes_RSA-OAEP.worker"
+ "url": "/WebCryptoAPI/generateKey/successes_RSA-OAEP.worker.html"
},
{
"path": "WebCryptoAPI/generateKey/successes_RSA-PSS.worker.js",
- "url": "/WebCryptoAPI/generateKey/successes_RSA-PSS.worker"
+ "url": "/WebCryptoAPI/generateKey/successes_RSA-PSS.worker.html"
},
{
"path": "WebCryptoAPI/generateKey/successes_RSASSA-PKCS1-v1_5.worker.js",
- "url": "/WebCryptoAPI/generateKey/successes_RSASSA-PKCS1-v1_5.worker"
+ "url": "/WebCryptoAPI/generateKey/successes_RSASSA-PKCS1-v1_5.worker.html"
},
{
"path": "WebCryptoAPI/getRandomValues.worker.js",
- "url": "/WebCryptoAPI/getRandomValues.worker"
+ "url": "/WebCryptoAPI/getRandomValues.worker.html"
},
{
"path": "WebCryptoAPI/idlharness.html",
@@ -12793,19 +13841,19 @@
},
{
"path": "WebCryptoAPI/idlharness.worker.js",
- "url": "/WebCryptoAPI/idlharness.worker"
+ "url": "/WebCryptoAPI/idlharness.worker.html"
},
{
"path": "WebCryptoAPI/import_export/ec_importKey.worker.js",
- "url": "/WebCryptoAPI/import_export/ec_importKey.worker"
+ "url": "/WebCryptoAPI/import_export/ec_importKey.worker.html"
},
{
"path": "WebCryptoAPI/import_export/rsa_importKey.worker.js",
- "url": "/WebCryptoAPI/import_export/rsa_importKey.worker"
+ "url": "/WebCryptoAPI/import_export/rsa_importKey.worker.html"
},
{
"path": "WebCryptoAPI/import_export/symmetric_importKey.worker.js",
- "url": "/WebCryptoAPI/import_export/symmetric_importKey.worker"
+ "url": "/WebCryptoAPI/import_export/symmetric_importKey.worker.html"
},
{
"path": "WebCryptoAPI/import_export/test_ec_importKey.html",
@@ -12821,19 +13869,19 @@
},
{
"path": "WebCryptoAPI/sign_verify/ecdsa.worker.js",
- "url": "/WebCryptoAPI/sign_verify/ecdsa.worker"
+ "url": "/WebCryptoAPI/sign_verify/ecdsa.worker.html"
},
{
"path": "WebCryptoAPI/sign_verify/hmac.worker.js",
- "url": "/WebCryptoAPI/sign_verify/hmac.worker"
+ "url": "/WebCryptoAPI/sign_verify/hmac.worker.html"
},
{
"path": "WebCryptoAPI/sign_verify/rsa_pkcs.worker.js",
- "url": "/WebCryptoAPI/sign_verify/rsa_pkcs.worker"
+ "url": "/WebCryptoAPI/sign_verify/rsa_pkcs.worker.html"
},
{
"path": "WebCryptoAPI/sign_verify/rsa_pss.worker.js",
- "url": "/WebCryptoAPI/sign_verify/rsa_pss.worker"
+ "url": "/WebCryptoAPI/sign_verify/rsa_pss.worker.html"
},
{
"path": "WebCryptoAPI/test_getRandomValues.html",
@@ -12841,7 +13889,11 @@
},
{
"path": "WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker.js",
- "url": "/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker"
+ "url": "/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker.html"
+ },
+ {
+ "path": "WebIDL/current-realm.html",
+ "url": "/WebIDL/current-realm.html"
},
{
"path": "WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.html",
@@ -12857,7 +13909,7 @@
},
{
"path": "WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js",
- "url": "/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker"
+ "url": "/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.html"
},
{
"path": "WebIDL/ecmascript-binding/es-exceptions/exceptions.html",
@@ -12881,7 +13933,7 @@
},
{
"path": "XMLHttpRequest/XMLHttpRequest-withCredentials.any.js",
- "url": "/XMLHttpRequest/XMLHttpRequest-withCredentials.any.worker"
+ "url": "/XMLHttpRequest/XMLHttpRequest-withCredentials.any.worker.html"
},
{
"path": "XMLHttpRequest/abort-after-receive.htm",
@@ -12909,7 +13961,7 @@
},
{
"path": "XMLHttpRequest/abort-during-open.worker.js",
- "url": "/XMLHttpRequest/abort-during-open.worker"
+ "url": "/XMLHttpRequest/abort-during-open.worker.html"
},
{
"path": "XMLHttpRequest/abort-during-unsent.htm",
@@ -12996,8 +14048,8 @@
"url": "/XMLHttpRequest/event-timeout.htm"
},
{
- "path": "XMLHttpRequest/event-upload-progress-crossorigin.sub.htm",
- "url": "/XMLHttpRequest/event-upload-progress-crossorigin.sub.htm"
+ "path": "XMLHttpRequest/event-upload-progress-crossorigin.htm",
+ "url": "/XMLHttpRequest/event-upload-progress-crossorigin.htm"
},
{
"path": "XMLHttpRequest/event-upload-progress.htm",
@@ -13444,8 +14496,8 @@
"url": "/XMLHttpRequest/send-no-response-event-order.htm"
},
{
- "path": "XMLHttpRequest/send-non-same-origin.sub.htm",
- "url": "/XMLHttpRequest/send-non-same-origin.sub.htm"
+ "path": "XMLHttpRequest/send-non-same-origin.htm",
+ "url": "/XMLHttpRequest/send-non-same-origin.htm"
},
{
"path": "XMLHttpRequest/send-receive-utf16.htm",
@@ -13505,7 +14557,7 @@
},
{
"path": "XMLHttpRequest/send-send.worker.js",
- "url": "/XMLHttpRequest/send-send.worker"
+ "url": "/XMLHttpRequest/send-send.worker.html"
},
{
"path": "XMLHttpRequest/send-sync-blocks-async.htm",
@@ -13541,7 +14593,7 @@
},
{
"path": "XMLHttpRequest/send-usp.worker.js",
- "url": "/XMLHttpRequest/send-usp.worker"
+ "url": "/XMLHttpRequest/send-usp.worker.html"
},
{
"path": "XMLHttpRequest/setrequestheader-after-send.htm",
@@ -13680,6 +14732,18 @@
"url": "/battery-status/battery-promise.html"
},
{
+ "path": "compat/webkit-text-fill-color-currentColor.html",
+ "url": "/compat/webkit-text-fill-color-currentColor.html"
+ },
+ {
+ "path": "console/console-is-a-namespace.any.js",
+ "url": "/console/console-is-a-namespace.any.html"
+ },
+ {
+ "path": "console/console-is-a-namespace.any.js",
+ "url": "/console/console-is-a-namespace.any.worker.html"
+ },
+ {
"path": "content-security-policy/blink-contrib-2/base-uri-allow.sub.html",
"url": "/content-security-policy/blink-contrib-2/base-uri-allow.sub.html"
},
@@ -14280,6 +15344,10 @@
"url": "/content-security-policy/meta/meta-modified.html"
},
{
+ "path": "content-security-policy/navigation/to-javascript-url.html",
+ "url": "/content-security-policy/navigation/to-javascript-url.html"
+ },
+ {
"path": "content-security-policy/reporting/securitypolicyviolation-idl.html",
"url": "/content-security-policy/reporting/securitypolicyviolation-idl.html"
},
@@ -14320,6 +15388,82 @@
"url": "/content-security-policy/script-src/script-src-1_4_2.html"
},
{
+ "path": "content-security-policy/script-src/script-src-strict_dynamic_and_unsafe_eval_eval.html",
+ "url": "/content-security-policy/script-src/script-src-strict_dynamic_and_unsafe_eval_eval.html"
+ },
+ {
+ "path": "content-security-policy/script-src/script-src-strict_dynamic_and_unsafe_eval_new_function.html",
+ "url": "/content-security-policy/script-src/script-src-strict_dynamic_and_unsafe_eval_new_function.html"
+ },
+ {
+ "path": "content-security-policy/script-src/script-src-strict_dynamic_discard_whitelist.html",
+ "url": "/content-security-policy/script-src/script-src-strict_dynamic_discard_whitelist.html"
+ },
+ {
+ "path": "content-security-policy/script-src/script-src-strict_dynamic_double_policy_different_nonce.html",
+ "url": "/content-security-policy/script-src/script-src-strict_dynamic_double_policy_different_nonce.html"
+ },
+ {
+ "path": "content-security-policy/script-src/script-src-strict_dynamic_double_policy_honor_whitelist.sub.html",
+ "url": "/content-security-policy/script-src/script-src-strict_dynamic_double_policy_honor_whitelist.sub.html"
+ },
+ {
+ "path": "content-security-policy/script-src/script-src-strict_dynamic_double_policy_report_only.html",
+ "url": "/content-security-policy/script-src/script-src-strict_dynamic_double_policy_report_only.html"
+ },
+ {
+ "path": "content-security-policy/script-src/script-src-strict_dynamic_eval.html",
+ "url": "/content-security-policy/script-src/script-src-strict_dynamic_eval.html"
+ },
+ {
+ "path": "content-security-policy/script-src/script-src-strict_dynamic_hashes.html",
+ "url": "/content-security-policy/script-src/script-src-strict_dynamic_hashes.html"
+ },
+ {
+ "path": "content-security-policy/script-src/script-src-strict_dynamic_in_img-src.html",
+ "url": "/content-security-policy/script-src/script-src-strict_dynamic_in_img-src.html"
+ },
+ {
+ "path": "content-security-policy/script-src/script-src-strict_dynamic_meta_tag.html",
+ "url": "/content-security-policy/script-src/script-src-strict_dynamic_meta_tag.html"
+ },
+ {
+ "path": "content-security-policy/script-src/script-src-strict_dynamic_new_function.html",
+ "url": "/content-security-policy/script-src/script-src-strict_dynamic_new_function.html"
+ },
+ {
+ "path": "content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted.html",
+ "url": "/content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted.html"
+ },
+ {
+ "path": "content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted_incorrect_nonce.html",
+ "url": "/content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted_incorrect_nonce.html"
+ },
+ {
+ "path": "content-security-policy/script-src/script-src-strict_dynamic_parser_inserted.html",
+ "url": "/content-security-policy/script-src/script-src-strict_dynamic_parser_inserted.html"
+ },
+ {
+ "path": "content-security-policy/script-src/script-src-strict_dynamic_parser_inserted_correct_nonce.html",
+ "url": "/content-security-policy/script-src/script-src-strict_dynamic_parser_inserted_correct_nonce.html"
+ },
+ {
+ "path": "content-security-policy/securitypolicyviolation/blockeduri-eval.html",
+ "url": "/content-security-policy/securitypolicyviolation/blockeduri-eval.html"
+ },
+ {
+ "path": "content-security-policy/securitypolicyviolation/blockeduri-inline.html",
+ "url": "/content-security-policy/securitypolicyviolation/blockeduri-inline.html"
+ },
+ {
+ "path": "content-security-policy/securitypolicyviolation/idl.html",
+ "url": "/content-security-policy/securitypolicyviolation/idl.html"
+ },
+ {
+ "path": "content-security-policy/securitypolicyviolation/targeting.html",
+ "url": "/content-security-policy/securitypolicyviolation/targeting.html"
+ },
+ {
"path": "content-security-policy/style-src/style-src-3_1.html",
"url": "/content-security-policy/style-src/style-src-3_1.html"
},
@@ -14352,6 +15496,70 @@
"url": "/content-security-policy/svg/svg-policy-with-resource.html"
},
{
+ "path": "content-security-policy/worker-src/dedicated-child.sub.html",
+ "url": "/content-security-policy/worker-src/dedicated-child.sub.html"
+ },
+ {
+ "path": "content-security-policy/worker-src/dedicated-fallback.sub.html",
+ "url": "/content-security-policy/worker-src/dedicated-fallback.sub.html"
+ },
+ {
+ "path": "content-security-policy/worker-src/dedicated-list.sub.html",
+ "url": "/content-security-policy/worker-src/dedicated-list.sub.html"
+ },
+ {
+ "path": "content-security-policy/worker-src/dedicated-none.sub.html",
+ "url": "/content-security-policy/worker-src/dedicated-none.sub.html"
+ },
+ {
+ "path": "content-security-policy/worker-src/dedicated-self.sub.html",
+ "url": "/content-security-policy/worker-src/dedicated-self.sub.html"
+ },
+ {
+ "path": "content-security-policy/worker-src/service-child.https.sub.html",
+ "url": "/content-security-policy/worker-src/service-child.https.sub.html"
+ },
+ {
+ "path": "content-security-policy/worker-src/service-fallback.https.sub.html",
+ "url": "/content-security-policy/worker-src/service-fallback.https.sub.html"
+ },
+ {
+ "path": "content-security-policy/worker-src/service-list.https.sub.html",
+ "url": "/content-security-policy/worker-src/service-list.https.sub.html"
+ },
+ {
+ "path": "content-security-policy/worker-src/service-none.https.sub.html",
+ "url": "/content-security-policy/worker-src/service-none.https.sub.html"
+ },
+ {
+ "path": "content-security-policy/worker-src/service-self.https.sub.html",
+ "url": "/content-security-policy/worker-src/service-self.https.sub.html"
+ },
+ {
+ "path": "content-security-policy/worker-src/shared-child.sub.html",
+ "url": "/content-security-policy/worker-src/shared-child.sub.html"
+ },
+ {
+ "path": "content-security-policy/worker-src/shared-fallback.sub.html",
+ "url": "/content-security-policy/worker-src/shared-fallback.sub.html"
+ },
+ {
+ "path": "content-security-policy/worker-src/shared-list.sub.html",
+ "url": "/content-security-policy/worker-src/shared-list.sub.html"
+ },
+ {
+ "path": "content-security-policy/worker-src/shared-none.sub.html",
+ "url": "/content-security-policy/worker-src/shared-none.sub.html"
+ },
+ {
+ "path": "content-security-policy/worker-src/shared-self.sub.html",
+ "url": "/content-security-policy/worker-src/shared-self.sub.html"
+ },
+ {
+ "path": "cookies/path/match.html",
+ "url": "/cookies/path/match.html"
+ },
+ {
"path": "cookies/secure/set-from-dom.https.sub.html",
"url": "/cookies/secure/set-from-dom.https.sub.html"
},
@@ -14444,6 +15652,10 @@
"url": "/cssom-view/HTMLBody-ScrollArea_quirksmode.html"
},
{
+ "path": "cssom-view/MediaQueryList-with-empty-string.html",
+ "url": "/cssom-view/MediaQueryList-with-empty-string.html"
+ },
+ {
"path": "cssom-view/elementFromPoint.html",
"url": "/cssom-view/elementFromPoint.html"
},
@@ -14468,18 +15680,194 @@
"url": "/cssom-view/scrollingElement.html"
},
{
+ "path": "cssom/serialize-values.html",
+ "url": "/cssom/serialize-values.html"
+ },
+ {
+ "path": "custom-elements/CustomElementRegistry.html",
+ "url": "/custom-elements/CustomElementRegistry.html"
+ },
+ {
+ "path": "custom-elements/Document-createElement.html",
+ "url": "/custom-elements/Document-createElement.html"
+ },
+ {
"path": "custom-elements/HTMLElement-constructor.html",
"url": "/custom-elements/HTMLElement-constructor.html"
},
{
+ "path": "custom-elements/adopted-callback.html",
+ "url": "/custom-elements/adopted-callback.html"
+ },
+ {
+ "path": "custom-elements/attribute-changed-callback.html",
+ "url": "/custom-elements/attribute-changed-callback.html"
+ },
+ {
+ "path": "custom-elements/connected-callbacks.html",
+ "url": "/custom-elements/connected-callbacks.html"
+ },
+ {
+ "path": "custom-elements/custom-element-reaction-queue.html",
+ "url": "/custom-elements/custom-element-reaction-queue.html"
+ },
+ {
"path": "custom-elements/custom-element-registry/define.html",
"url": "/custom-elements/custom-element-registry/define.html"
},
{
+ "path": "custom-elements/disconnected-callbacks.html",
+ "url": "/custom-elements/disconnected-callbacks.html"
+ },
+ {
"path": "custom-elements/htmlconstructor/newtarget.html",
"url": "/custom-elements/htmlconstructor/newtarget.html"
},
{
+ "path": "custom-elements/parser/parser-constructs-custom-element-in-document-write.html",
+ "url": "/custom-elements/parser/parser-constructs-custom-element-in-document-write.html"
+ },
+ {
+ "path": "custom-elements/parser/parser-constructs-custom-element-synchronously.html",
+ "url": "/custom-elements/parser/parser-constructs-custom-element-synchronously.html"
+ },
+ {
+ "path": "custom-elements/parser/parser-constructs-custom-elements.html",
+ "url": "/custom-elements/parser/parser-constructs-custom-elements.html"
+ },
+ {
+ "path": "custom-elements/parser/parser-fallsback-to-unknown-element.html",
+ "url": "/custom-elements/parser/parser-fallsback-to-unknown-element.html"
+ },
+ {
+ "path": "custom-elements/parser/parser-sets-attributes-and-children.html",
+ "url": "/custom-elements/parser/parser-sets-attributes-and-children.html"
+ },
+ {
+ "path": "custom-elements/parser/parser-uses-constructed-element.html",
+ "url": "/custom-elements/parser/parser-uses-constructed-element.html"
+ },
+ {
+ "path": "custom-elements/parser/parser-uses-registry-of-owner-document.html",
+ "url": "/custom-elements/parser/parser-uses-registry-of-owner-document.html"
+ },
+ {
+ "path": "custom-elements/reaction-timing.html",
+ "url": "/custom-elements/reaction-timing.html"
+ },
+ {
+ "path": "custom-elements/reactions/Attr.html",
+ "url": "/custom-elements/reactions/Attr.html"
+ },
+ {
+ "path": "custom-elements/reactions/CSSStyleDeclaration.html",
+ "url": "/custom-elements/reactions/CSSStyleDeclaration.html"
+ },
+ {
+ "path": "custom-elements/reactions/ChildNode.html",
+ "url": "/custom-elements/reactions/ChildNode.html"
+ },
+ {
+ "path": "custom-elements/reactions/DOMStringMap.html",
+ "url": "/custom-elements/reactions/DOMStringMap.html"
+ },
+ {
+ "path": "custom-elements/reactions/DOMTokenList.html",
+ "url": "/custom-elements/reactions/DOMTokenList.html"
+ },
+ {
+ "path": "custom-elements/reactions/Document.html",
+ "url": "/custom-elements/reactions/Document.html"
+ },
+ {
+ "path": "custom-elements/reactions/Element.html",
+ "url": "/custom-elements/reactions/Element.html"
+ },
+ {
+ "path": "custom-elements/reactions/ElementContentEditable.html",
+ "url": "/custom-elements/reactions/ElementContentEditable.html"
+ },
+ {
+ "path": "custom-elements/reactions/HTMLAnchorElement.html",
+ "url": "/custom-elements/reactions/HTMLAnchorElement.html"
+ },
+ {
+ "path": "custom-elements/reactions/HTMLElement.html",
+ "url": "/custom-elements/reactions/HTMLElement.html"
+ },
+ {
+ "path": "custom-elements/reactions/HTMLOptionElement.html",
+ "url": "/custom-elements/reactions/HTMLOptionElement.html"
+ },
+ {
+ "path": "custom-elements/reactions/HTMLOptionsCollection.html",
+ "url": "/custom-elements/reactions/HTMLOptionsCollection.html"
+ },
+ {
+ "path": "custom-elements/reactions/HTMLOutputElement.html",
+ "url": "/custom-elements/reactions/HTMLOutputElement.html"
+ },
+ {
+ "path": "custom-elements/reactions/HTMLSelectElement.html",
+ "url": "/custom-elements/reactions/HTMLSelectElement.html"
+ },
+ {
+ "path": "custom-elements/reactions/HTMLTableElement.html",
+ "url": "/custom-elements/reactions/HTMLTableElement.html"
+ },
+ {
+ "path": "custom-elements/reactions/HTMLTableRowElement.html",
+ "url": "/custom-elements/reactions/HTMLTableRowElement.html"
+ },
+ {
+ "path": "custom-elements/reactions/HTMLTableSectionElement.html",
+ "url": "/custom-elements/reactions/HTMLTableSectionElement.html"
+ },
+ {
+ "path": "custom-elements/reactions/HTMLTitleElement.html",
+ "url": "/custom-elements/reactions/HTMLTitleElement.html"
+ },
+ {
+ "path": "custom-elements/reactions/NamedNodeMap.html",
+ "url": "/custom-elements/reactions/NamedNodeMap.html"
+ },
+ {
+ "path": "custom-elements/reactions/Node.html",
+ "url": "/custom-elements/reactions/Node.html"
+ },
+ {
+ "path": "custom-elements/reactions/ParentNode.html",
+ "url": "/custom-elements/reactions/ParentNode.html"
+ },
+ {
+ "path": "custom-elements/reactions/Range.html",
+ "url": "/custom-elements/reactions/Range.html"
+ },
+ {
+ "path": "custom-elements/reactions/Selection.html",
+ "url": "/custom-elements/reactions/Selection.html"
+ },
+ {
+ "path": "custom-elements/reactions/ShadowRoot.html",
+ "url": "/custom-elements/reactions/ShadowRoot.html"
+ },
+ {
+ "path": "custom-elements/upgrading.html",
+ "url": "/custom-elements/upgrading.html"
+ },
+ {
+ "path": "custom-elements/upgrading/Node-cloneNode.html",
+ "url": "/custom-elements/upgrading/Node-cloneNode.html"
+ },
+ {
+ "path": "custom-elements/upgrading/upgrading-enqueue-reactions.html",
+ "url": "/custom-elements/upgrading/upgrading-enqueue-reactions.html"
+ },
+ {
+ "path": "custom-elements/upgrading/upgrading-parser-created-element.html",
+ "url": "/custom-elements/upgrading/upgrading-parser-created-element.html"
+ },
+ {
"path": "custom-elements/v0/concepts/custom-elements-type-naming.html",
"url": "/custom-elements/v0/concepts/custom-elements-type-naming.html"
},
@@ -14760,6 +16148,10 @@
"url": "/dom/events/Event-dispatch-bubbles-true.html"
},
{
+ "path": "dom/events/Event-dispatch-click.html",
+ "url": "/dom/events/Event-dispatch-click.html"
+ },
+ {
"path": "dom/events/Event-dispatch-detached-click.html",
"url": "/dom/events/Event-dispatch-detached-click.html"
},
@@ -14780,6 +16172,10 @@
"url": "/dom/events/Event-dispatch-order.html"
},
{
+ "path": "dom/events/Event-dispatch-other-document.html",
+ "url": "/dom/events/Event-dispatch-other-document.html"
+ },
+ {
"path": "dom/events/Event-dispatch-propagation-stopped.html",
"url": "/dom/events/Event-dispatch-propagation-stopped.html"
},
@@ -15712,10 +17108,6 @@
"url": "/domparsing/innerhtml-01.xhtml"
},
{
- "path": "domparsing/innerhtml-02.html",
- "url": "/domparsing/innerhtml-02.html"
- },
- {
"path": "domparsing/innerhtml-03.xhtml",
"url": "/domparsing/innerhtml-03.xhtml"
},
@@ -15788,6 +17180,10 @@
"url": "/editing/other/delete.html"
},
{
+ "path": "editing/other/restoration.html",
+ "url": "/editing/other/restoration.html"
+ },
+ {
"path": "editing/run/backcolor.html",
"url": "/editing/run/backcolor.html"
},
@@ -15988,94 +17384,14 @@
"url": "/encoding/textencoder-utf16-surrogates.html"
},
{
- "path": "encrypted-media/Google/encrypted-media-clear-key-invalid-license.html",
- "url": "/encrypted-media/Google/encrypted-media-clear-key-invalid-license.html"
- },
- {
- "path": "encrypted-media/Google/encrypted-media-clearkey-update-non-ascii-input.html",
- "url": "/encrypted-media/Google/encrypted-media-clearkey-update-non-ascii-input.html"
- },
- {
- "path": "encrypted-media/Google/encrypted-media-onencrypted.html",
- "url": "/encrypted-media/Google/encrypted-media-onencrypted.html"
- },
- {
- "path": "encrypted-media/Google/encrypted-media-playback-encrypted-and-clear-sources.html",
- "url": "/encrypted-media/Google/encrypted-media-playback-encrypted-and-clear-sources.html"
- },
- {
- "path": "encrypted-media/Google/encrypted-media-requestmediakeysystemaccess.html",
- "url": "/encrypted-media/Google/encrypted-media-requestmediakeysystemaccess.html"
- },
- {
- "path": "encrypted-media/Google/encrypted-media-reset-src-after-setmediakeys.html",
- "url": "/encrypted-media/Google/encrypted-media-reset-src-after-setmediakeys.html"
- },
- {
- "path": "encrypted-media/Google/encrypted-media-session-closed-event.html",
- "url": "/encrypted-media/Google/encrypted-media-session-closed-event.html"
- },
- {
- "path": "encrypted-media/Google/encrypted-media-setmediakeys-again-after-playback.html",
- "url": "/encrypted-media/Google/encrypted-media-setmediakeys-again-after-playback.html"
- },
- {
- "path": "encrypted-media/Google/encrypted-media-setmediakeys-again-after-resetting-src.html",
- "url": "/encrypted-media/Google/encrypted-media-setmediakeys-again-after-resetting-src.html"
- },
- {
- "path": "encrypted-media/Google/encrypted-media-setmediakeys-at-same-time.html",
- "url": "/encrypted-media/Google/encrypted-media-setmediakeys-at-same-time.html"
- },
- {
- "path": "encrypted-media/Google/encrypted-media-setmediakeys-multiple-times-with-different-mediakeys.html",
- "url": "/encrypted-media/Google/encrypted-media-setmediakeys-multiple-times-with-different-mediakeys.html"
- },
- {
- "path": "encrypted-media/Google/encrypted-media-setmediakeys-multiple-times-with-the-same-mediakeys.html",
- "url": "/encrypted-media/Google/encrypted-media-setmediakeys-multiple-times-with-the-same-mediakeys.html"
- },
- {
- "path": "encrypted-media/Google/encrypted-media-setmediakeys-to-multiple-video-elements.html",
- "url": "/encrypted-media/Google/encrypted-media-setmediakeys-to-multiple-video-elements.html"
- },
- {
- "path": "encrypted-media/Google/encrypted-media-setmediakeys.html",
- "url": "/encrypted-media/Google/encrypted-media-setmediakeys.html"
- },
- {
- "path": "encrypted-media/Google/encrypted-media-syntax.html",
- "url": "/encrypted-media/Google/encrypted-media-syntax.html"
- },
- {
- "path": "encrypted-media/Google/encrypted-media-unique-origin.html",
- "url": "/encrypted-media/Google/encrypted-media-unique-origin.html"
- },
- {
- "path": "encrypted-media/Google/encrypted-media-update-disallowed-input.html",
- "url": "/encrypted-media/Google/encrypted-media-update-disallowed-input.html"
- },
- {
- "path": "encrypted-media/Google/encrypted-media-waiting-for-a-key.html",
- "url": "/encrypted-media/Google/encrypted-media-waiting-for-a-key.html"
- },
- {
- "path": "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses-multiple-sessions.html",
- "url": "/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses-multiple-sessions.html"
- },
- {
- "path": "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses-multiple-updates.html",
- "url": "/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses-multiple-updates.html"
- },
- {
- "path": "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-multiple-sessions.html",
- "url": "/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-multiple-sessions.html"
- },
- {
"path": "encrypted-media/clearkey-check-initdata-type.html",
"url": "/encrypted-media/clearkey-check-initdata-type.html"
},
{
+ "path": "encrypted-media/clearkey-events-session-closed-event.html",
+ "url": "/encrypted-media/clearkey-events-session-closed-event.html"
+ },
+ {
"path": "encrypted-media/clearkey-events.html",
"url": "/encrypted-media/clearkey-events.html"
},
@@ -16084,6 +17400,10 @@
"url": "/encrypted-media/clearkey-generate-request-disallowed-input.html"
},
{
+ "path": "encrypted-media/clearkey-invalid-license.html",
+ "url": "/encrypted-media/clearkey-invalid-license.html"
+ },
+ {
"path": "encrypted-media/clearkey-keystatuses-multiple-sessions.html",
"url": "/encrypted-media/clearkey-keystatuses-multiple-sessions.html"
},
@@ -16124,6 +17444,14 @@
"url": "/encrypted-media/clearkey-mp4-playback-retrieve-persistent-usage-record.html"
},
{
+ "path": "encrypted-media/clearkey-mp4-playback-temporary-clear-encrypted.html",
+ "url": "/encrypted-media/clearkey-mp4-playback-temporary-clear-encrypted.html"
+ },
+ {
+ "path": "encrypted-media/clearkey-mp4-playback-temporary-encrypted-clear.html",
+ "url": "/encrypted-media/clearkey-mp4-playback-temporary-encrypted-clear.html"
+ },
+ {
"path": "encrypted-media/clearkey-mp4-playback-temporary-events.html",
"url": "/encrypted-media/clearkey-mp4-playback-temporary-events.html"
},
@@ -16160,22 +17488,94 @@
"url": "/encrypted-media/clearkey-mp4-playback-temporary.html"
},
{
+ "path": "encrypted-media/clearkey-mp4-reset-src-after-setmediakeys.html",
+ "url": "/encrypted-media/clearkey-mp4-reset-src-after-setmediakeys.html"
+ },
+ {
+ "path": "encrypted-media/clearkey-mp4-setmediakeys-again-after-playback.html",
+ "url": "/encrypted-media/clearkey-mp4-setmediakeys-again-after-playback.html"
+ },
+ {
+ "path": "encrypted-media/clearkey-mp4-setmediakeys-again-after-resetting-src.html",
+ "url": "/encrypted-media/clearkey-mp4-setmediakeys-again-after-resetting-src.html"
+ },
+ {
+ "path": "encrypted-media/clearkey-mp4-setmediakeys-at-same-time.html",
+ "url": "/encrypted-media/clearkey-mp4-setmediakeys-at-same-time.html"
+ },
+ {
+ "path": "encrypted-media/clearkey-mp4-setmediakeys-multiple-times-with-different-mediakeys.html",
+ "url": "/encrypted-media/clearkey-mp4-setmediakeys-multiple-times-with-different-mediakeys.html"
+ },
+ {
+ "path": "encrypted-media/clearkey-mp4-setmediakeys-multiple-times-with-the-same-mediakeys.html",
+ "url": "/encrypted-media/clearkey-mp4-setmediakeys-multiple-times-with-the-same-mediakeys.html"
+ },
+ {
+ "path": "encrypted-media/clearkey-mp4-setmediakeys-to-multiple-video-elements.html",
+ "url": "/encrypted-media/clearkey-mp4-setmediakeys-to-multiple-video-elements.html"
+ },
+ {
+ "path": "encrypted-media/clearkey-mp4-setmediakeys.html",
+ "url": "/encrypted-media/clearkey-mp4-setmediakeys.html"
+ },
+ {
+ "path": "encrypted-media/clearkey-mp4-syntax-mediakeys.html",
+ "url": "/encrypted-media/clearkey-mp4-syntax-mediakeys.html"
+ },
+ {
+ "path": "encrypted-media/clearkey-mp4-syntax-mediakeysession.html",
+ "url": "/encrypted-media/clearkey-mp4-syntax-mediakeysession.html"
+ },
+ {
+ "path": "encrypted-media/clearkey-mp4-syntax-mediakeysystemaccess.html",
+ "url": "/encrypted-media/clearkey-mp4-syntax-mediakeysystemaccess.html"
+ },
+ {
+ "path": "encrypted-media/clearkey-mp4-unique-origin.html",
+ "url": "/encrypted-media/clearkey-mp4-unique-origin.html"
+ },
+ {
+ "path": "encrypted-media/clearkey-mp4-update-disallowed-input.html",
+ "url": "/encrypted-media/clearkey-mp4-update-disallowed-input.html"
+ },
+ {
+ "path": "encrypted-media/clearkey-mp4-waiting-for-a-key.html",
+ "url": "/encrypted-media/clearkey-mp4-waiting-for-a-key.html"
+ },
+ {
"path": "encrypted-media/clearkey-not-callable-after-createsession.html",
"url": "/encrypted-media/clearkey-not-callable-after-createsession.html"
},
{
+ "path": "encrypted-media/clearkey-update-non-ascii-input.html",
+ "url": "/encrypted-media/clearkey-update-non-ascii-input.html"
+ },
+ {
"path": "encrypted-media/drm-check-initdata-type.html",
"url": "/encrypted-media/drm-check-initdata-type.html"
},
{
+ "path": "encrypted-media/drm-events-session-closed-event.html",
+ "url": "/encrypted-media/drm-events-session-closed-event.html"
+ },
+ {
"path": "encrypted-media/drm-events.html",
"url": "/encrypted-media/drm-events.html"
},
{
+ "path": "encrypted-media/drm-expiration.html",
+ "url": "/encrypted-media/drm-expiration.html"
+ },
+ {
"path": "encrypted-media/drm-generate-request-disallowed-input.html",
"url": "/encrypted-media/drm-generate-request-disallowed-input.html"
},
{
+ "path": "encrypted-media/drm-invalid-license.html",
+ "url": "/encrypted-media/drm-invalid-license.html"
+ },
+ {
"path": "encrypted-media/drm-keystatuses-multiple-sessions.html",
"url": "/encrypted-media/drm-keystatuses-multiple-sessions.html"
},
@@ -16184,6 +17584,10 @@
"url": "/encrypted-media/drm-keystatuses.html"
},
{
+ "path": "encrypted-media/drm-mp4-onencrypted.html",
+ "url": "/encrypted-media/drm-mp4-onencrypted.html"
+ },
+ {
"path": "encrypted-media/drm-mp4-playback-destroy-persistent-license.html",
"url": "/encrypted-media/drm-mp4-playback-destroy-persistent-license.html"
},
@@ -16204,6 +17608,14 @@
"url": "/encrypted-media/drm-mp4-playback-retrieve-persistent-usage-record.html"
},
{
+ "path": "encrypted-media/drm-mp4-playback-temporary-clear-encrypted.html",
+ "url": "/encrypted-media/drm-mp4-playback-temporary-clear-encrypted.html"
+ },
+ {
+ "path": "encrypted-media/drm-mp4-playback-temporary-encrypted-clear.html",
+ "url": "/encrypted-media/drm-mp4-playback-temporary-encrypted-clear.html"
+ },
+ {
"path": "encrypted-media/drm-mp4-playback-temporary-multikey.html",
"url": "/encrypted-media/drm-mp4-playback-temporary-multikey.html"
},
@@ -16240,10 +17652,66 @@
"url": "/encrypted-media/drm-mp4-playback-temporary.html"
},
{
+ "path": "encrypted-media/drm-mp4-reset-src-after-setmediakeys.html",
+ "url": "/encrypted-media/drm-mp4-reset-src-after-setmediakeys.html"
+ },
+ {
+ "path": "encrypted-media/drm-mp4-setmediakeys-again-after-playback.html",
+ "url": "/encrypted-media/drm-mp4-setmediakeys-again-after-playback.html"
+ },
+ {
+ "path": "encrypted-media/drm-mp4-setmediakeys-again-after-resetting-src.html",
+ "url": "/encrypted-media/drm-mp4-setmediakeys-again-after-resetting-src.html"
+ },
+ {
+ "path": "encrypted-media/drm-mp4-setmediakeys-at-same-time.html",
+ "url": "/encrypted-media/drm-mp4-setmediakeys-at-same-time.html"
+ },
+ {
+ "path": "encrypted-media/drm-mp4-setmediakeys-multiple-times-with-different-mediakeys.html",
+ "url": "/encrypted-media/drm-mp4-setmediakeys-multiple-times-with-different-mediakeys.html"
+ },
+ {
+ "path": "encrypted-media/drm-mp4-setmediakeys-multiple-times-with-the-same-mediakeys.html",
+ "url": "/encrypted-media/drm-mp4-setmediakeys-multiple-times-with-the-same-mediakeys.html"
+ },
+ {
+ "path": "encrypted-media/drm-mp4-setmediakeys-to-multiple-video-elements.html",
+ "url": "/encrypted-media/drm-mp4-setmediakeys-to-multiple-video-elements.html"
+ },
+ {
+ "path": "encrypted-media/drm-mp4-setmediakeys.html",
+ "url": "/encrypted-media/drm-mp4-setmediakeys.html"
+ },
+ {
+ "path": "encrypted-media/drm-mp4-syntax-mediakeys.html",
+ "url": "/encrypted-media/drm-mp4-syntax-mediakeys.html"
+ },
+ {
+ "path": "encrypted-media/drm-mp4-syntax-mediakeysession.html",
+ "url": "/encrypted-media/drm-mp4-syntax-mediakeysession.html"
+ },
+ {
+ "path": "encrypted-media/drm-mp4-syntax-mediakeysystemaccess.html",
+ "url": "/encrypted-media/drm-mp4-syntax-mediakeysystemaccess.html"
+ },
+ {
+ "path": "encrypted-media/drm-mp4-unique-origin.html",
+ "url": "/encrypted-media/drm-mp4-unique-origin.html"
+ },
+ {
+ "path": "encrypted-media/drm-mp4-waiting-for-a-key.html",
+ "url": "/encrypted-media/drm-mp4-waiting-for-a-key.html"
+ },
+ {
"path": "encrypted-media/drm-not-callable-after-createsession.html",
"url": "/encrypted-media/drm-not-callable-after-createsession.html"
},
{
+ "path": "encrypted-media/drm-temporary-license-type.html",
+ "url": "/encrypted-media/drm-temporary-license-type.html"
+ },
+ {
"path": "encrypted-media/idlharness.html",
"url": "/encrypted-media/idlharness.html"
},
@@ -16257,7 +17725,7 @@
},
{
"path": "eventsource/dedicated-worker/eventsource-eventtarget.worker.js",
- "url": "/eventsource/dedicated-worker/eventsource-eventtarget.worker"
+ "url": "/eventsource/dedicated-worker/eventsource-eventtarget.worker.html"
},
{
"path": "eventsource/dedicated-worker/eventsource-onmesage.htm",
@@ -16308,6 +17776,10 @@
"url": "/eventsource/eventsource-eventtarget.htm"
},
{
+ "path": "eventsource/eventsource-onmessage-realm.htm",
+ "url": "/eventsource/eventsource-onmessage-realm.htm"
+ },
+ {
"path": "eventsource/eventsource-onmessage.htm",
"url": "/eventsource/eventsource-onmessage.htm"
},
@@ -16480,6 +17952,18 @@
"url": "/fetch/api/basic/accept-header.html"
},
{
+ "path": "fetch/api/basic/conditional-get.html",
+ "url": "/fetch/api/basic/conditional-get.html"
+ },
+ {
+ "path": "fetch/api/basic/error-after-response.html",
+ "url": "/fetch/api/basic/error-after-response.html"
+ },
+ {
+ "path": "fetch/api/basic/integrity-sharedworker.html",
+ "url": "/fetch/api/basic/integrity-sharedworker.html"
+ },
+ {
"path": "fetch/api/basic/integrity-worker.html",
"url": "/fetch/api/basic/integrity-worker.html"
},
@@ -16540,6 +18024,14 @@
"url": "/fetch/api/basic/request-referrer.html"
},
{
+ "path": "fetch/api/basic/request-upload-worker.html",
+ "url": "/fetch/api/basic/request-upload-worker.html"
+ },
+ {
+ "path": "fetch/api/basic/request-upload.html",
+ "url": "/fetch/api/basic/request-upload.html"
+ },
+ {
"path": "fetch/api/basic/response-url-worker.html",
"url": "/fetch/api/basic/response-url-worker.html"
},
@@ -16832,6 +18324,38 @@
"url": "/fetch/api/redirect/redirect-to-dataurl.html"
},
{
+ "path": "fetch/api/request/multi-globals/url-parsing.html",
+ "url": "/fetch/api/request/multi-globals/url-parsing.html"
+ },
+ {
+ "path": "fetch/api/request/request-cache-default-conditional.html",
+ "url": "/fetch/api/request/request-cache-default-conditional.html"
+ },
+ {
+ "path": "fetch/api/request/request-cache-default.html",
+ "url": "/fetch/api/request/request-cache-default.html"
+ },
+ {
+ "path": "fetch/api/request/request-cache-force-cache.html",
+ "url": "/fetch/api/request/request-cache-force-cache.html"
+ },
+ {
+ "path": "fetch/api/request/request-cache-no-cache.html",
+ "url": "/fetch/api/request/request-cache-no-cache.html"
+ },
+ {
+ "path": "fetch/api/request/request-cache-no-store.html",
+ "url": "/fetch/api/request/request-cache-no-store.html"
+ },
+ {
+ "path": "fetch/api/request/request-cache-only-if-cached.html",
+ "url": "/fetch/api/request/request-cache-only-if-cached.html"
+ },
+ {
+ "path": "fetch/api/request/request-cache-reload.html",
+ "url": "/fetch/api/request/request-cache-reload.html"
+ },
+ {
"path": "fetch/api/request/request-clone.sub.html",
"url": "/fetch/api/request/request-clone.sub.html"
},
@@ -16876,6 +18400,10 @@
"url": "/fetch/api/request/request-structure.html"
},
{
+ "path": "fetch/api/response/multi-globals/url-parsing.html",
+ "url": "/fetch/api/response/multi-globals/url-parsing.html"
+ },
+ {
"path": "fetch/api/response/response-cancel-stream.html",
"url": "/fetch/api/response/response-cancel-stream.html"
},
@@ -17021,7 +18549,7 @@
},
{
"path": "hr-time/basic.worker.js",
- "url": "/hr-time/basic.worker"
+ "url": "/hr-time/basic.worker.html"
},
{
"path": "hr-time/idlharness.html",
@@ -17436,6 +18964,10 @@
"url": "/html/browsers/history/the-history-interface/history_go_plus.html"
},
{
+ "path": "html/browsers/history/the-history-interface/history_go_to_uri.html",
+ "url": "/html/browsers/history/the-history-interface/history_go_to_uri.html"
+ },
+ {
"path": "html/browsers/history/the-history-interface/history_go_undefined.html",
"url": "/html/browsers/history/the-history-interface/history_go_undefined.html"
},
@@ -17480,10 +19012,6 @@
"url": "/html/browsers/history/the-history-interface/joint_session_history/002.html"
},
{
- "path": "html/browsers/history/the-history-interface/non-automated/traverse_the_session_history_unload_prompt_1.html",
- "url": "/html/browsers/history/the-history-interface/non-automated/traverse_the_session_history_unload_prompt_1.html"
- },
- {
"path": "html/browsers/history/the-history-interface/traverse_the_history_1.html",
"url": "/html/browsers/history/the-history-interface/traverse_the_history_1.html"
},
@@ -17540,6 +19068,10 @@
"url": "/html/browsers/history/the-location-interface/document_location.html"
},
{
+ "path": "html/browsers/history/the-location-interface/location-prototype-setting.html",
+ "url": "/html/browsers/history/the-location-interface/location-prototype-setting.html"
+ },
+ {
"path": "html/browsers/history/the-location-interface/location-stringifier.html",
"url": "/html/browsers/history/the-location-interface/location-stringifier.html"
},
@@ -17624,8 +19156,8 @@
"url": "/html/browsers/history/the-location-interface/scripted_form_submit_assign_during_load.html"
},
{
- "path": "html/browsers/history/the-location-interface/security_location_0.sub.htm",
- "url": "/html/browsers/history/the-location-interface/security_location_0.sub.htm"
+ "path": "html/browsers/history/the-location-interface/security_location_0.htm",
+ "url": "/html/browsers/history/the-location-interface/security_location_0.htm"
},
{
"path": "html/browsers/offline/application-cache-api/api_status_idle.html",
@@ -17680,6 +19212,22 @@
"url": "/html/browsers/origin/relaxing-the-same-origin-restriction/document_domain.html"
},
{
+ "path": "html/browsers/sandboxing/sandbox-allow-same-origin.html",
+ "url": "/html/browsers/sandboxing/sandbox-allow-same-origin.html"
+ },
+ {
+ "path": "html/browsers/sandboxing/sandbox-allow-scripts.html",
+ "url": "/html/browsers/sandboxing/sandbox-allow-scripts.html"
+ },
+ {
+ "path": "html/browsers/sandboxing/sandbox-disallow-same-origin.html",
+ "url": "/html/browsers/sandboxing/sandbox-disallow-same-origin.html"
+ },
+ {
+ "path": "html/browsers/sandboxing/sandbox-disallow-scripts.html",
+ "url": "/html/browsers/sandboxing/sandbox-disallow-scripts.html"
+ },
+ {
"path": "html/browsers/the-window-object/Document-defaultView.html",
"url": "/html/browsers/the-window-object/Document-defaultView.html"
},
@@ -17744,8 +19292,8 @@
"url": "/html/browsers/the-window-object/named-access-on-the-window-object/window-null-names.html"
},
{
- "path": "html/browsers/the-window-object/security-window/window-security.sub.html",
- "url": "/html/browsers/the-window-object/security-window/window-security.sub.html"
+ "path": "html/browsers/the-window-object/security-window/window-security.html",
+ "url": "/html/browsers/the-window-object/security-window/window-security.html"
},
{
"path": "html/browsers/the-window-object/window-aliases.html",
@@ -17764,6 +19312,10 @@
"url": "/html/browsers/the-window-object/window-named-properties.html"
},
{
+ "path": "html/browsers/the-window-object/window-open-noopener.html",
+ "url": "/html/browsers/the-window-object/window-open-noopener.html"
+ },
+ {
"path": "html/browsers/the-window-object/window-properties.html",
"url": "/html/browsers/the-window-object/window-properties.html"
},
@@ -17804,8 +19356,8 @@
"url": "/html/browsers/windows/browsing-context-names/browsing-context-default-name.html"
},
{
- "path": "html/browsers/windows/nested-browsing-contexts/frameElement.sub.html",
- "url": "/html/browsers/windows/nested-browsing-contexts/frameElement.sub.html"
+ "path": "html/browsers/windows/nested-browsing-contexts/frameElement.html",
+ "url": "/html/browsers/windows/nested-browsing-contexts/frameElement.html"
},
{
"path": "html/browsers/windows/nested-browsing-contexts/window-top-001.html",
@@ -17820,16 +19372,16 @@
"url": "/html/browsers/windows/noreferrer.html"
},
{
- "path": "html/browsers/windows/targeting-cross-origin-nested-browsing-contexts.sub.html",
- "url": "/html/browsers/windows/targeting-cross-origin-nested-browsing-contexts.sub.html"
+ "path": "html/browsers/windows/targeting-cross-origin-nested-browsing-contexts.html",
+ "url": "/html/browsers/windows/targeting-cross-origin-nested-browsing-contexts.html"
},
{
"path": "html/dom/documents/dom-tree-accessors/Document.body.html",
"url": "/html/dom/documents/dom-tree-accessors/Document.body.html"
},
{
- "path": "html/dom/documents/dom-tree-accessors/Document.currentScript.sub.html",
- "url": "/html/dom/documents/dom-tree-accessors/Document.currentScript.sub.html"
+ "path": "html/dom/documents/dom-tree-accessors/Document.currentScript.html",
+ "url": "/html/dom/documents/dom-tree-accessors/Document.currentScript.html"
},
{
"path": "html/dom/documents/dom-tree-accessors/Document.getElementsByClassName-null-undef.html",
@@ -18592,10 +20144,18 @@
"url": "/html/editing/focus/focus-management/focus-events.html"
},
{
+ "path": "html/editing/focus/processing-model/focus-fixup-rule-one-no-dialogs.html",
+ "url": "/html/editing/focus/processing-model/focus-fixup-rule-one-no-dialogs.html"
+ },
+ {
"path": "html/editing/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-default-value.html",
"url": "/html/editing/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-default-value.html"
},
{
+ "path": "html/infrastructure/common-dom-interfaces/collections/historical.html",
+ "url": "/html/infrastructure/common-dom-interfaces/collections/historical.html"
+ },
+ {
"path": "html/infrastructure/common-dom-interfaces/collections/htmlallcollection.html",
"url": "/html/infrastructure/common-dom-interfaces/collections/htmlallcollection.html"
},
@@ -18704,8 +20264,8 @@
"url": "/html/semantics/document-metadata/the-base-element/base_href_invalid.html"
},
{
- "path": "html/semantics/document-metadata/the-base-element/base_href_specified.sub.html",
- "url": "/html/semantics/document-metadata/the-base-element/base_href_specified.sub.html"
+ "path": "html/semantics/document-metadata/the-base-element/base_href_specified.html",
+ "url": "/html/semantics/document-metadata/the-base-element/base_href_specified.html"
},
{
"path": "html/semantics/document-metadata/the-base-element/base_href_unspecified.html",
@@ -19988,6 +21548,10 @@
"url": "/html/semantics/embedded-content/the-embed-element/embed-in-object-fallback.html"
},
{
+ "path": "html/semantics/embedded-content/the-embed-element/historical.html",
+ "url": "/html/semantics/embedded-content/the-embed-element/historical.html"
+ },
+ {
"path": "html/semantics/embedded-content/the-iframe-element/change_parentage.html",
"url": "/html/semantics/embedded-content/the-iframe-element/change_parentage.html"
},
@@ -20004,6 +21568,10 @@
"url": "/html/semantics/embedded-content/the-iframe-element/iframe-allowfullscreen.html"
},
{
+ "path": "html/semantics/embedded-content/the-iframe-element/iframe-append-to-child-document.html",
+ "url": "/html/semantics/embedded-content/the-iframe-element/iframe-append-to-child-document.html"
+ },
+ {
"path": "html/semantics/embedded-content/the-iframe-element/iframe-load-event.html",
"url": "/html/semantics/embedded-content/the-iframe-element/iframe-load-event.html"
},
@@ -20016,12 +21584,28 @@
"url": "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_script.html"
},
{
- "path": "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping.html",
- "url": "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping.html"
+ "path": "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html",
+ "url": "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html"
+ },
+ {
+ "path": "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html",
+ "url": "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html"
},
{
- "path": "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping.html",
- "url": "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping.html"
+ "path": "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html",
+ "url": "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html"
+ },
+ {
+ "path": "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html",
+ "url": "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html"
+ },
+ {
+ "path": "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html",
+ "url": "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html"
+ },
+ {
+ "path": "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html",
+ "url": "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html"
},
{
"path": "html/semantics/embedded-content/the-iframe-element/move_iframe_in_dom_01.html",
@@ -20056,6 +21640,10 @@
"url": "/html/semantics/embedded-content/the-img-element/current-pixel-density/error.html"
},
{
+ "path": "html/semantics/embedded-content/the-img-element/data-url.html",
+ "url": "/html/semantics/embedded-content/the-img-element/data-url.html"
+ },
+ {
"path": "html/semantics/embedded-content/the-img-element/environment-changes/viewport-change.html",
"url": "/html/semantics/embedded-content/the-img-element/environment-changes/viewport-change.html"
},
@@ -20096,6 +21684,14 @@
"url": "/html/semantics/embedded-content/the-img-element/update-the-source-set.html"
},
{
+ "path": "html/semantics/embedded-content/the-img-element/usemap-casing.html",
+ "url": "/html/semantics/embedded-content/the-img-element/usemap-casing.html"
+ },
+ {
+ "path": "html/semantics/embedded-content/the-object-element/historical.html",
+ "url": "/html/semantics/embedded-content/the-object-element/historical.html"
+ },
+ {
"path": "html/semantics/embedded-content/the-object-element/object-attributes.html",
"url": "/html/semantics/embedded-content/the-object-element/object-attributes.html"
},
@@ -20112,6 +21708,10 @@
"url": "/html/semantics/embedded-content/the-object-element/object-handler.html"
},
{
+ "path": "html/semantics/embedded-content/the-object-element/usemap-casing.html",
+ "url": "/html/semantics/embedded-content/the-object-element/usemap-casing.html"
+ },
+ {
"path": "html/semantics/embedded-content/the-video-element/video-tabindex.html",
"url": "/html/semantics/embedded-content/the-video-element/video-tabindex.html"
},
@@ -20272,6 +21872,10 @@
"url": "/html/semantics/forms/the-fieldset-element/disabled-002.xhtml"
},
{
+ "path": "html/semantics/forms/the-form-element/form-action-url.html",
+ "url": "/html/semantics/forms/the-form-element/form-action-url.html"
+ },
+ {
"path": "html/semantics/forms/the-form-element/form-autocomplete.html",
"url": "/html/semantics/forms/the-form-element/form-autocomplete.html"
},
@@ -20504,6 +22108,10 @@
"url": "/html/semantics/forms/the-progress-element/progress.html"
},
{
+ "path": "html/semantics/forms/the-select-element/common-HTMLOptionsCollection-add.html",
+ "url": "/html/semantics/forms/the-select-element/common-HTMLOptionsCollection-add.html"
+ },
+ {
"path": "html/semantics/forms/the-select-element/common-HTMLOptionsCollection-namedItem.html",
"url": "/html/semantics/forms/the-select-element/common-HTMLOptionsCollection-namedItem.html"
},
@@ -20524,6 +22132,10 @@
"url": "/html/semantics/forms/the-select-element/select-remove.html"
},
{
+ "path": "html/semantics/forms/the-select-element/selected-index.html",
+ "url": "/html/semantics/forms/the-select-element/selected-index.html"
+ },
+ {
"path": "html/semantics/forms/the-textarea-element/cloning-steps.html",
"url": "/html/semantics/forms/the-textarea-element/cloning-steps.html"
},
@@ -20620,6 +22232,10 @@
"url": "/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_getter.html"
},
{
+ "path": "html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html",
+ "url": "/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html"
+ },
+ {
"path": "html/semantics/scripting-1/the-script-element/async_001.htm",
"url": "/html/semantics/scripting-1/the-script-element/async_001.htm"
},
@@ -20664,6 +22280,10 @@
"url": "/html/semantics/scripting-1/the-script-element/async_011.htm"
},
{
+ "path": "html/semantics/scripting-1/the-script-element/data-url.html",
+ "url": "/html/semantics/scripting-1/the-script-element/data-url.html"
+ },
+ {
"path": "html/semantics/scripting-1/the-script-element/fetch-src/alpha/base.html",
"url": "/html/semantics/scripting-1/the-script-element/fetch-src/alpha/base.html"
},
@@ -20740,6 +22360,18 @@
"url": "/html/semantics/scripting-1/the-script-element/script-not-found-not-executed.html"
},
{
+ "path": "html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-1.html",
+ "url": "/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-1.html"
+ },
+ {
+ "path": "html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-2.html",
+ "url": "/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-2.html"
+ },
+ {
+ "path": "html/semantics/scripting-1/the-script-element/script-onload-insertion-point.html",
+ "url": "/html/semantics/scripting-1/the-script-element/script-onload-insertion-point.html"
+ },
+ {
"path": "html/semantics/scripting-1/the-script-element/script-onload-string.html",
"url": "/html/semantics/scripting-1/the-script-element/script-onload-string.html"
},
@@ -21224,6 +22856,34 @@
"url": "/html/webappapis/atob/base64.html"
},
{
+ "path": "html/webappapis/idle-callbacks/callback-exception.html",
+ "url": "/html/webappapis/idle-callbacks/callback-exception.html"
+ },
+ {
+ "path": "html/webappapis/idle-callbacks/callback-iframe.html",
+ "url": "/html/webappapis/idle-callbacks/callback-iframe.html"
+ },
+ {
+ "path": "html/webappapis/idle-callbacks/callback-invoked.html",
+ "url": "/html/webappapis/idle-callbacks/callback-invoked.html"
+ },
+ {
+ "path": "html/webappapis/idle-callbacks/callback-multiple-calls.html",
+ "url": "/html/webappapis/idle-callbacks/callback-multiple-calls.html"
+ },
+ {
+ "path": "html/webappapis/idle-callbacks/callback-timeout.html",
+ "url": "/html/webappapis/idle-callbacks/callback-timeout.html"
+ },
+ {
+ "path": "html/webappapis/idle-callbacks/cancel-invoked.html",
+ "url": "/html/webappapis/idle-callbacks/cancel-invoked.html"
+ },
+ {
+ "path": "html/webappapis/idle-callbacks/idlharness.html",
+ "url": "/html/webappapis/idle-callbacks/idlharness.html"
+ },
+ {
"path": "html/webappapis/scripting/event-loops/microtask_after_raf.html",
"url": "/html/webappapis/scripting/event-loops/microtask_after_raf.html"
},
@@ -21272,10 +22932,18 @@
"url": "/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-once.html"
},
{
+ "path": "html/webappapis/scripting/events/messageevent-constructor.https.html",
+ "url": "/html/webappapis/scripting/events/messageevent-constructor.https.html"
+ },
+ {
"path": "html/webappapis/scripting/events/onerroreventhandler.html",
"url": "/html/webappapis/scripting/events/onerroreventhandler.html"
},
{
+ "path": "html/webappapis/scripting/events/uncompiled_event_handler_with_scripting_disabled.html",
+ "url": "/html/webappapis/scripting/events/uncompiled_event_handler_with_scripting_disabled.html"
+ },
+ {
"path": "html/webappapis/scripting/processing-model-2/addEventListener.html",
"url": "/html/webappapis/scripting/processing-model-2/addEventListener.html"
},
@@ -21409,7 +23077,7 @@
},
{
"path": "html/webappapis/system-state-and-capabilities/the-navigator-object/NavigatorID.worker.js",
- "url": "/html/webappapis/system-state-and-capabilities/the-navigator-object/NavigatorID.worker"
+ "url": "/html/webappapis/system-state-and-capabilities/the-navigator-object/NavigatorID.worker.html"
},
{
"path": "html/webappapis/system-state-and-capabilities/the-navigator-object/content.html",
@@ -21484,6 +23152,30 @@
"url": "/http/content_length.html"
},
{
+ "path": "imagebitmap-renderingcontext/bitmaprenderer-as-imagesource.html",
+ "url": "/imagebitmap-renderingcontext/bitmaprenderer-as-imagesource.html"
+ },
+ {
+ "path": "imagebitmap-renderingcontext/context-creation-with-alpha.html",
+ "url": "/imagebitmap-renderingcontext/context-creation-with-alpha.html"
+ },
+ {
+ "path": "imagebitmap-renderingcontext/context-creation.html",
+ "url": "/imagebitmap-renderingcontext/context-creation.html"
+ },
+ {
+ "path": "imagebitmap-renderingcontext/context-preserves-canvas.html",
+ "url": "/imagebitmap-renderingcontext/context-preserves-canvas.html"
+ },
+ {
+ "path": "imagebitmap-renderingcontext/tranferFromImageBitmap-null.html",
+ "url": "/imagebitmap-renderingcontext/tranferFromImageBitmap-null.html"
+ },
+ {
+ "path": "imagebitmap-renderingcontext/transferFromImageBitmap-detached.html",
+ "url": "/imagebitmap-renderingcontext/transferFromImageBitmap-detached.html"
+ },
+ {
"path": "infrastructure/failing-test.html",
"url": "/infrastructure/failing-test.html"
},
@@ -21552,6 +23244,102 @@
"url": "/js/builtins/WeakMap.prototype-properties.html"
},
{
+ "path": "mathml/presentation-markup/fractions/frac-1.html",
+ "url": "/mathml/presentation-markup/fractions/frac-1.html"
+ },
+ {
+ "path": "mathml/presentation-markup/fractions/frac-parameters-1.html",
+ "url": "/mathml/presentation-markup/fractions/frac-parameters-1.html"
+ },
+ {
+ "path": "mathml/presentation-markup/fractions/frac-parameters-2.html",
+ "url": "/mathml/presentation-markup/fractions/frac-parameters-2.html"
+ },
+ {
+ "path": "mathml/presentation-markup/operators/mo-axis-height-1.html",
+ "url": "/mathml/presentation-markup/operators/mo-axis-height-1.html"
+ },
+ {
+ "path": "mathml/presentation-markup/radicals/root-parameters-1.html",
+ "url": "/mathml/presentation-markup/radicals/root-parameters-1.html"
+ },
+ {
+ "path": "mathml/presentation-markup/scripts/subsup-1.html",
+ "url": "/mathml/presentation-markup/scripts/subsup-1.html"
+ },
+ {
+ "path": "mathml/presentation-markup/scripts/subsup-2.html",
+ "url": "/mathml/presentation-markup/scripts/subsup-2.html"
+ },
+ {
+ "path": "mathml/presentation-markup/scripts/subsup-3.html",
+ "url": "/mathml/presentation-markup/scripts/subsup-3.html"
+ },
+ {
+ "path": "mathml/presentation-markup/scripts/subsup-4.html",
+ "url": "/mathml/presentation-markup/scripts/subsup-4.html"
+ },
+ {
+ "path": "mathml/presentation-markup/scripts/subsup-5.html",
+ "url": "/mathml/presentation-markup/scripts/subsup-5.html"
+ },
+ {
+ "path": "mathml/presentation-markup/scripts/subsup-parameters-1.html",
+ "url": "/mathml/presentation-markup/scripts/subsup-parameters-1.html"
+ },
+ {
+ "path": "mathml/presentation-markup/scripts/underover-1.html",
+ "url": "/mathml/presentation-markup/scripts/underover-1.html"
+ },
+ {
+ "path": "mathml/presentation-markup/scripts/underover-parameters-1.html",
+ "url": "/mathml/presentation-markup/scripts/underover-parameters-1.html"
+ },
+ {
+ "path": "mathml/presentation-markup/scripts/underover-parameters-2.html",
+ "url": "/mathml/presentation-markup/scripts/underover-parameters-2.html"
+ },
+ {
+ "path": "mathml/presentation-markup/scripts/underover-parameters-3.html",
+ "url": "/mathml/presentation-markup/scripts/underover-parameters-3.html"
+ },
+ {
+ "path": "mathml/presentation-markup/scripts/underover-parameters-4.html",
+ "url": "/mathml/presentation-markup/scripts/underover-parameters-4.html"
+ },
+ {
+ "path": "mathml/presentation-markup/spaces/space-1.html",
+ "url": "/mathml/presentation-markup/spaces/space-1.html"
+ },
+ {
+ "path": "mathml/presentation-markup/tables/table-axis-height.html",
+ "url": "/mathml/presentation-markup/tables/table-axis-height.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/displaystyle-1.html",
+ "url": "/mathml/relations/css-styling/displaystyle-1.html"
+ },
+ {
+ "path": "mathml/relations/css-styling/lengths-3.html",
+ "url": "/mathml/relations/css-styling/lengths-3.html"
+ },
+ {
+ "path": "mathml/relations/html5-tree/class-2.html",
+ "url": "/mathml/relations/html5-tree/class-2.html"
+ },
+ {
+ "path": "mathml/relations/html5-tree/display-1.html",
+ "url": "/mathml/relations/html5-tree/display-1.html"
+ },
+ {
+ "path": "mathml/relations/html5-tree/required-extensions-1.html",
+ "url": "/mathml/relations/html5-tree/required-extensions-1.html"
+ },
+ {
+ "path": "mathml/relations/html5-tree/unique-identifier-2.html",
+ "url": "/mathml/relations/html5-tree/unique-identifier-2.html"
+ },
+ {
"path": "media-source/SourceBuffer-abort-removed.html",
"url": "/media-source/SourceBuffer-abort-removed.html"
},
@@ -21776,6 +23564,10 @@
"url": "/media-source/mediasource-trackdefaultlist.html"
},
{
+ "path": "mediacapture-record/BlobEvent-constructor.html",
+ "url": "/mediacapture-record/BlobEvent-constructor.html"
+ },
+ {
"path": "mediacapture-streams/GUM-api.https.html",
"url": "/mediacapture-streams/GUM-api.https.html"
},
@@ -21836,10 +23628,6 @@
"url": "/mediacapture-streams/MediaStream-gettrackid.https.html"
},
{
- "path": "mediacapture-streams/MediaStream-id-manual.https.html",
- "url": "/mediacapture-streams/MediaStream-id-manual.https.html"
- },
- {
"path": "mediacapture-streams/MediaStream-idl.https.html",
"url": "/mediacapture-streams/MediaStream-idl.https.html"
},
@@ -23924,6 +25712,10 @@
"url": "/payment-request/payment-request-in-iframe.html"
},
{
+ "path": "performance-timeline/case-sensitivity.html",
+ "url": "/performance-timeline/case-sensitivity.html"
+ },
+ {
"path": "performance-timeline/idlharness.html",
"url": "/performance-timeline/idlharness.html"
},
@@ -23956,10 +25748,6 @@
"url": "/pointerevents/pointerevent_constructor.html"
},
{
- "path": "pointerevents/pointerevent_pointermove-on-chorded-mouse-button.html",
- "url": "/pointerevents/pointerevent_pointermove-on-chorded-mouse-button.html"
- },
- {
"path": "pointerevents/pointerevent_touch-action-illegal.html",
"url": "/pointerevents/pointerevent_touch-action-illegal.html"
},
@@ -24008,6 +25796,10 @@
"url": "/presentation-api/controlling-ua/reconnectToPresentation_mixedcontent.https.html"
},
{
+ "path": "presentation-api/controlling-ua/reconnectToPresentation_notfound_error.html",
+ "url": "/presentation-api/controlling-ua/reconnectToPresentation_notfound_error.html"
+ },
+ {
"path": "presentation-api/controlling-ua/reconnectToPresentation_sandboxing_error.html",
"url": "/presentation-api/controlling-ua/reconnectToPresentation_sandboxing_error.html"
},
@@ -24020,14 +25812,6 @@
"url": "/presentation-api/controlling-ua/startNewPresentation_error.html"
},
{
- "path": "presentation-api/controlling-ua/startNewPresentation_mixedcontent-manual.https.html",
- "url": "/presentation-api/controlling-ua/startNewPresentation_mixedcontent-manual.https.html"
- },
- {
- "path": "presentation-api/controlling-ua/startNewPresentation_mixedcontent_multiple-manual.https.html",
- "url": "/presentation-api/controlling-ua/startNewPresentation_mixedcontent_multiple-manual.https.html"
- },
- {
"path": "presentation-api/receiving-ua/idlharness.html",
"url": "/presentation-api/receiving-ua/idlharness.html"
},
@@ -29448,6 +31232,14 @@
"url": "/screen-orientation/orientation-reading.html"
},
{
+ "path": "secure-contexts/basic-dedicated-worker.html",
+ "url": "/secure-contexts/basic-dedicated-worker.html"
+ },
+ {
+ "path": "secure-contexts/basic-dedicated-worker.https.html",
+ "url": "/secure-contexts/basic-dedicated-worker.https.html"
+ },
+ {
"path": "secure-contexts/basic-popup-and-iframe-tests.html",
"url": "/secure-contexts/basic-popup-and-iframe-tests.html"
},
@@ -29456,6 +31248,22 @@
"url": "/secure-contexts/basic-popup-and-iframe-tests.https.html"
},
{
+ "path": "secure-contexts/basic-shared-worker.html",
+ "url": "/secure-contexts/basic-shared-worker.html"
+ },
+ {
+ "path": "secure-contexts/basic-shared-worker.https.html",
+ "url": "/secure-contexts/basic-shared-worker.https.html"
+ },
+ {
+ "path": "secure-contexts/shared-worker-insecure-first.https.html",
+ "url": "/secure-contexts/shared-worker-insecure-first.https.html"
+ },
+ {
+ "path": "secure-contexts/shared-worker-secure-first.https.html",
+ "url": "/secure-contexts/shared-worker-secure-first.https.html"
+ },
+ {
"path": "selection/Document-open.html",
"url": "/selection/Document-open.html"
},
@@ -29508,6 +31316,10 @@
"url": "/selectors/attribute-selectors/attribute-case/syntax.html"
},
{
+ "path": "selectors/child-indexed-pseudo-class.html",
+ "url": "/selectors/child-indexed-pseudo-class.html"
+ },
+ {
"path": "service-workers/cache-storage/serviceworker/credentials.html",
"url": "/service-workers/cache-storage/serviceworker/credentials.html"
},
@@ -29800,6 +31612,10 @@
"url": "/service-workers/service-worker/service-worker-csp-script.https.html"
},
{
+ "path": "service-workers/service-worker/serviceworker-message-event-historical.https.html",
+ "url": "/service-workers/service-worker/serviceworker-message-event-historical.https.html"
+ },
+ {
"path": "service-workers/service-worker/serviceworkerobject-scripturl.https.html",
"url": "/service-workers/service-worker/serviceworkerobject-scripturl.https.html"
},
@@ -30272,6 +32088,22 @@
"url": "/svg/interfaces.html"
},
{
+ "path": "svg/linking/scripted/href-animate-element.html",
+ "url": "/svg/linking/scripted/href-animate-element.html"
+ },
+ {
+ "path": "svg/linking/scripted/href-mpath-element.html",
+ "url": "/svg/linking/scripted/href-mpath-element.html"
+ },
+ {
+ "path": "svg/linking/scripted/href-script-element-markup.html",
+ "url": "/svg/linking/scripted/href-script-element-markup.html"
+ },
+ {
+ "path": "svg/linking/scripted/href-script-element.html",
+ "url": "/svg/linking/scripted/href-script-element.html"
+ },
+ {
"path": "touch-events/create-touch-touchlist.html",
"url": "/touch-events/create-touch-touchlist.html"
},
@@ -30357,7 +32189,7 @@
},
{
"path": "url/historical.worker.js",
- "url": "/url/historical.worker"
+ "url": "/url/historical.worker.html"
},
{
"path": "url/interfaces.html",
@@ -30368,10 +32200,6 @@
"url": "/url/url-constructor.html"
},
{
- "path": "url/url-domainToUnicode.html",
- "url": "/url/url-domainToUnicode.html"
- },
- {
"path": "url/url-setters.html",
"url": "/url/url-setters.html"
},
@@ -30508,6 +32336,10 @@
"url": "/web-animations/interfaces/Animation/constructor.html"
},
{
+ "path": "web-animations/interfaces/Animation/effect.html",
+ "url": "/web-animations/interfaces/Animation/effect.html"
+ },
+ {
"path": "web-animations/interfaces/Animation/finish.html",
"url": "/web-animations/interfaces/Animation/finish.html"
},
@@ -30624,6 +32456,10 @@
"url": "/web-animations/interfaces/KeyframeEffect/getComputedTiming.html"
},
{
+ "path": "web-animations/interfaces/KeyframeEffect/iterationComposite.html",
+ "url": "/web-animations/interfaces/KeyframeEffect/iterationComposite.html"
+ },
+ {
"path": "web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument.html",
"url": "/web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument.html"
},
@@ -30636,6 +32472,10 @@
"url": "/web-animations/interfaces/KeyframeEffect/setTarget.html"
},
{
+ "path": "web-animations/interfaces/KeyframeEffect/spacing.html",
+ "url": "/web-animations/interfaces/KeyframeEffect/spacing.html"
+ },
+ {
"path": "web-animations/interfaces/KeyframeEffectReadOnly/spacing.html",
"url": "/web-animations/interfaces/KeyframeEffectReadOnly/spacing.html"
},
@@ -30664,6 +32504,10 @@
"url": "/web-animations/timing-model/animations/set-the-animation-start-time.html"
},
{
+ "path": "web-animations/timing-model/animations/set-the-target-effect-of-an-animation.html",
+ "url": "/web-animations/timing-model/animations/set-the-target-effect-of-an-animation.html"
+ },
+ {
"path": "web-animations/timing-model/animations/set-the-timeline-of-an-animation.html",
"url": "/web-animations/timing-model/animations/set-the-timeline-of-an-animation.html"
},
@@ -30696,6 +32540,10 @@
"url": "/webaudio/the-audio-api/the-audioparam-interface/setValueAtTime-within-block.html"
},
{
+ "path": "webaudio/the-audio-api/the-constantsourcenode-interface/test-constantsourcenode.html",
+ "url": "/webaudio/the-audio-api/the-constantsourcenode-interface/test-constantsourcenode.html"
+ },
+ {
"path": "webaudio/the-audio-api/the-delaynode-interface/idl-test.html",
"url": "/webaudio/the-audio-api/the-delaynode-interface/idl-test.html"
},
@@ -30728,6 +32576,10 @@
"url": "/webaudio/the-audio-api/the-waveshapernode-interface/curve-tests.html"
},
{
+ "path": "webauthn/interfaces.https.html",
+ "url": "/webauthn/interfaces.https.html"
+ },
+ {
"path": "webdriver/interface.html",
"url": "/webdriver/interface.html"
},
@@ -33828,6 +35680,10 @@
"url": "/webrtc/promises-call.html"
},
{
+ "path": "webrtc/rtcpeerconnection/rtcpeerconnection-constructor.html",
+ "url": "/webrtc/rtcpeerconnection/rtcpeerconnection-constructor.html"
+ },
+ {
"path": "webrtc/rtcpeerconnection/rtcpeerconnection-idl.html",
"url": "/webrtc/rtcpeerconnection/rtcpeerconnection-idl.html"
},
@@ -34149,7 +36005,7 @@
},
{
"path": "websockets/Send-data.worker.js",
- "url": "/websockets/Send-data.worker"
+ "url": "/websockets/Send-data.worker.html"
},
{
"path": "websockets/Send-null.htm",
@@ -34960,6 +36816,10 @@
"url": "/websockets/interfaces/WebSocket/url/resolve.html?wss"
},
{
+ "path": "websockets/multi-globals/message-received.html",
+ "url": "/websockets/multi-globals/message-received.html"
+ },
+ {
"path": "websockets/opening-handshake/001.html",
"url": "/websockets/opening-handshake/001.html"
},
@@ -34969,7 +36829,7 @@
},
{
"path": "websockets/opening-handshake/003-sets-origin.worker.js",
- "url": "/websockets/opening-handshake/003-sets-origin.worker"
+ "url": "/websockets/opening-handshake/003-sets-origin.worker.html"
},
{
"path": "websockets/opening-handshake/003.html",
@@ -35324,6 +37184,10 @@
"url": "/workers/Worker_ErrorEvent_bubbles_cancelable.htm"
},
{
+ "path": "workers/Worker_ErrorEvent_error.htm",
+ "url": "/workers/Worker_ErrorEvent_error.htm"
+ },
+ {
"path": "workers/Worker_ErrorEvent_filename.htm",
"url": "/workers/Worker_ErrorEvent_filename.htm"
},
@@ -35461,7 +37325,7 @@
},
{
"path": "workers/constructors/Worker/DedicatedWorkerGlobalScope-members.worker.js",
- "url": "/workers/constructors/Worker/DedicatedWorkerGlobalScope-members.worker"
+ "url": "/workers/constructors/Worker/DedicatedWorkerGlobalScope-members.worker.html"
},
{
"path": "workers/constructors/Worker/ctor-1.html",
@@ -35477,7 +37341,7 @@
},
{
"path": "workers/constructors/Worker/expected-self-properties.worker.js",
- "url": "/workers/constructors/Worker/expected-self-properties.worker"
+ "url": "/workers/constructors/Worker/expected-self-properties.worker.html"
},
{
"path": "workers/constructors/Worker/no-arguments-ctor.html",
@@ -35497,7 +37361,7 @@
},
{
"path": "workers/constructors/Worker/unexpected-self-properties.worker.js",
- "url": "/workers/constructors/Worker/unexpected-self-properties.worker"
+ "url": "/workers/constructors/Worker/unexpected-self-properties.worker.html"
},
{
"path": "workers/constructors/Worker/unresolvable-url.html",
@@ -35508,16 +37372,24 @@
"url": "/workers/constructors/Worker/use-base-url.html"
},
{
+ "path": "workers/data-url-shared.html",
+ "url": "/workers/data-url-shared.html"
+ },
+ {
+ "path": "workers/data-url.html",
+ "url": "/workers/data-url.html"
+ },
+ {
"path": "workers/interfaces.worker.js",
- "url": "/workers/interfaces.worker"
+ "url": "/workers/interfaces.worker.html"
},
{
"path": "workers/interfaces/DedicatedWorkerGlobalScope/EventTarget.worker.js",
- "url": "/workers/interfaces/DedicatedWorkerGlobalScope/EventTarget.worker"
+ "url": "/workers/interfaces/DedicatedWorkerGlobalScope/EventTarget.worker.html"
},
{
"path": "workers/interfaces/DedicatedWorkerGlobalScope/onmessage.worker.js",
- "url": "/workers/interfaces/DedicatedWorkerGlobalScope/onmessage.worker"
+ "url": "/workers/interfaces/DedicatedWorkerGlobalScope/onmessage.worker.html"
},
{
"path": "workers/interfaces/DedicatedWorkerGlobalScope/postMessage/event-ports-dedicated.html",
@@ -35533,7 +37405,7 @@
},
{
"path": "workers/interfaces/DedicatedWorkerGlobalScope/postMessage/return-value.worker.js",
- "url": "/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/return-value.worker"
+ "url": "/workers/interfaces/DedicatedWorkerGlobalScope/postMessage/return-value.worker.html"
},
{
"path": "workers/interfaces/DedicatedWorkerGlobalScope/postMessage/second-argument-null-in-array.html",
@@ -35645,11 +37517,11 @@
},
{
"path": "workers/interfaces/WorkerUtils/importScripts/001.worker.js",
- "url": "/workers/interfaces/WorkerUtils/importScripts/001.worker"
+ "url": "/workers/interfaces/WorkerUtils/importScripts/001.worker.html"
},
{
"path": "workers/interfaces/WorkerUtils/importScripts/002.worker.js",
- "url": "/workers/interfaces/WorkerUtils/importScripts/002.worker"
+ "url": "/workers/interfaces/WorkerUtils/importScripts/002.worker.html"
},
{
"path": "workers/interfaces/WorkerUtils/importScripts/003.html",
@@ -35720,12 +37592,8 @@
"url": "/workers/interfaces/WorkerUtils/navigator/language.html"
},
{
- "path": "workers/interfaces/WorkerUtils/navigator/window-only.worker.js",
- "url": "/workers/interfaces/WorkerUtils/navigator/window-only.worker"
- },
- {
"path": "workers/nested_worker.worker.js",
- "url": "/workers/nested_worker.worker"
+ "url": "/workers/nested_worker.worker.html"
},
{
"path": "workers/postMessage_DataCloneErr.htm",
@@ -35769,15 +37637,15 @@
},
{
"path": "workers/semantics/encodings/004.worker.js",
- "url": "/workers/semantics/encodings/004.worker"
+ "url": "/workers/semantics/encodings/004.worker.html"
},
{
"path": "workers/semantics/interface-objects/001.worker.js",
- "url": "/workers/semantics/interface-objects/001.worker"
+ "url": "/workers/semantics/interface-objects/001.worker.html"
},
{
"path": "workers/semantics/interface-objects/002.worker.js",
- "url": "/workers/semantics/interface-objects/002.worker"
+ "url": "/workers/semantics/interface-objects/002.worker.html"
},
{
"path": "workers/semantics/interface-objects/003.html",
@@ -35888,6 +37756,11 @@
"url": "/workers/semantics/xhr/006.html"
},
{
+ "path": "IndexedDB/idbcursor-continuePrimaryKey-exception-order.htm",
+ "timeout": "long",
+ "url": "/IndexedDB/idbcursor-continuePrimaryKey-exception-order.htm"
+ },
+ {
"path": "IndexedDB/idbdatabase_createObjectStore10-1000ends.htm",
"timeout": "long",
"url": "/IndexedDB/idbdatabase_createObjectStore10-1000ends.htm"
@@ -36313,9 +38186,54 @@
"url": "/dom/ranges/Range-isPointInRange.html"
},
{
- "path": "dom/ranges/Range-mutations.html",
+ "path": "dom/ranges/Range-mutations-appendChild.html",
+ "timeout": "long",
+ "url": "/dom/ranges/Range-mutations-appendChild.html"
+ },
+ {
+ "path": "dom/ranges/Range-mutations-appendData.html",
+ "timeout": "long",
+ "url": "/dom/ranges/Range-mutations-appendData.html"
+ },
+ {
+ "path": "dom/ranges/Range-mutations-dataChange.html",
+ "timeout": "long",
+ "url": "/dom/ranges/Range-mutations-dataChange.html"
+ },
+ {
+ "path": "dom/ranges/Range-mutations-deleteData.html",
+ "timeout": "long",
+ "url": "/dom/ranges/Range-mutations-deleteData.html"
+ },
+ {
+ "path": "dom/ranges/Range-mutations-insertBefore.html",
+ "timeout": "long",
+ "url": "/dom/ranges/Range-mutations-insertBefore.html"
+ },
+ {
+ "path": "dom/ranges/Range-mutations-insertData.html",
+ "timeout": "long",
+ "url": "/dom/ranges/Range-mutations-insertData.html"
+ },
+ {
+ "path": "dom/ranges/Range-mutations-removeChild.html",
+ "timeout": "long",
+ "url": "/dom/ranges/Range-mutations-removeChild.html"
+ },
+ {
+ "path": "dom/ranges/Range-mutations-replaceChild.html",
"timeout": "long",
- "url": "/dom/ranges/Range-mutations.html"
+ "url": "/dom/ranges/Range-mutations-replaceChild.html"
+ },
+ {
+ "path": "dom/ranges/Range-mutations-replaceData.html",
+ "timeout": "long",
+ "url": "/dom/ranges/Range-mutations-replaceData.html"
+ },
+ {
+ "path": "dom/ranges/Range-mutations-splitText.html",
+ "timeout": "long",
+ "url": "/dom/ranges/Range-mutations-splitText.html"
},
{
"path": "dom/ranges/Range-selectNode.html",
@@ -36368,11 +38286,31 @@
"url": "/encoding/single-byte-decoder.html"
},
{
+ "path": "encrypted-media/clearkey-mp4-playback-temporary-encrypted-clear-sources.html",
+ "timeout": "long",
+ "url": "/encrypted-media/clearkey-mp4-playback-temporary-encrypted-clear-sources.html"
+ },
+ {
+ "path": "encrypted-media/clearkey-mp4-playback-temporary-multikey-sequential-readyState.html",
+ "timeout": "long",
+ "url": "/encrypted-media/clearkey-mp4-playback-temporary-multikey-sequential-readyState.html"
+ },
+ {
+ "path": "encrypted-media/clearkey-mp4-playback-temporary-multikey-sequential.html",
+ "timeout": "long",
+ "url": "/encrypted-media/clearkey-mp4-playback-temporary-multikey-sequential.html"
+ },
+ {
"path": "encrypted-media/clearkey-mp4-playback-temporary-two-videos.html",
"timeout": "long",
"url": "/encrypted-media/clearkey-mp4-playback-temporary-two-videos.html"
},
{
+ "path": "encrypted-media/clearkey-mp4-requestmediakeysystemaccess.html",
+ "timeout": "long",
+ "url": "/encrypted-media/clearkey-mp4-requestmediakeysystemaccess.html"
+ },
+ {
"path": "encrypted-media/drm-mp4-playback-persistent-usage-record.html",
"timeout": "long",
"url": "/encrypted-media/drm-mp4-playback-persistent-usage-record.html"
@@ -36388,11 +38326,36 @@
"url": "/encrypted-media/drm-mp4-playback-retrieve-persistent-license.html"
},
{
+ "path": "encrypted-media/drm-mp4-playback-temporary-encrypted-clear-sources.html",
+ "timeout": "long",
+ "url": "/encrypted-media/drm-mp4-playback-temporary-encrypted-clear-sources.html"
+ },
+ {
"path": "encrypted-media/drm-mp4-playback-temporary-events.html",
"timeout": "long",
"url": "/encrypted-media/drm-mp4-playback-temporary-events.html"
},
{
+ "path": "encrypted-media/drm-mp4-playback-temporary-expired.html",
+ "timeout": "long",
+ "url": "/encrypted-media/drm-mp4-playback-temporary-expired.html"
+ },
+ {
+ "path": "encrypted-media/drm-mp4-playback-temporary-multikey-sequential-readyState.html",
+ "timeout": "long",
+ "url": "/encrypted-media/drm-mp4-playback-temporary-multikey-sequential-readyState.html"
+ },
+ {
+ "path": "encrypted-media/drm-mp4-playback-temporary-multikey-sequential.html",
+ "timeout": "long",
+ "url": "/encrypted-media/drm-mp4-playback-temporary-multikey-sequential.html"
+ },
+ {
+ "path": "encrypted-media/drm-mp4-requestmediakeysystemaccess.html",
+ "timeout": "long",
+ "url": "/encrypted-media/drm-mp4-requestmediakeysystemaccess.html"
+ },
+ {
"path": "eventsource/dedicated-worker/eventsource-constructor-non-same-origin.htm",
"timeout": "long",
"url": "/eventsource/dedicated-worker/eventsource-constructor-non-same-origin.htm"
@@ -36408,11 +38371,6 @@
"url": "/eventsource/shared-worker/eventsource-constructor-non-same-origin.htm"
},
{
- "path": "fetch/api/request/request-cache.html",
- "timeout": "long",
- "url": "/fetch/api/request/request-cache.html"
- },
- {
"path": "html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html",
"timeout": "long",
"url": "/html/browsers/browsing-the-web/history-traversal/persisted-user-state-restoration/scroll-restoration-fragment-scrolling-cross-origin.html"
@@ -37715,109 +39673,20 @@
]
},
"local_changes": {
- "deleted": [
- "url/url-domainToUnicode.html"
- ],
+ "deleted": [],
"deleted_reftests": {},
"items": {
- "reftest": {
- "html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html": [
- {
- "path": "html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html",
- "references": [
- [
- "/html/semantics/document-metadata/the-link-element/stylesheet-empty-href-ref.html",
- "=="
- ]
- ],
- "url": "/html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html"
- }
- ],
- "html/semantics/document-metadata/the-link-element/stylesheet-media.html": [
- {
- "path": "html/semantics/document-metadata/the-link-element/stylesheet-media.html",
- "references": [
- [
- "/html/semantics/document-metadata/the-link-element/stylesheet-media-ref.html",
- "=="
- ]
- ],
- "url": "/html/semantics/document-metadata/the-link-element/stylesheet-media.html"
- }
- ]
- },
"testharness": {
- "cookies/path/match.html": [
- {
- "path": "cookies/path/match.html",
- "url": "/cookies/path/match.html"
- }
- ],
- "cssom-view/MediaQueryList-with-empty-string.html": [
- {
- "path": "cssom-view/MediaQueryList-with-empty-string.html",
- "url": "/cssom-view/MediaQueryList-with-empty-string.html"
- }
- ],
"html/semantics/forms/form-submission-0/submit-entity-body.html": [
{
"path": "html/semantics/forms/form-submission-0/submit-entity-body.html",
"timeout": "long",
"url": "/html/semantics/forms/form-submission-0/submit-entity-body.html"
}
- ],
- "html/semantics/forms/the-form-element/form-action-url.html": [
- {
- "path": "html/semantics/forms/the-form-element/form-action-url.html",
- "url": "/html/semantics/forms/the-form-element/form-action-url.html"
- }
- ],
- "html/semantics/forms/the-select-element/common-HTMLOptionsCollection-add.html": [
- {
- "path": "html/semantics/forms/the-select-element/common-HTMLOptionsCollection-add.html",
- "url": "/html/semantics/forms/the-select-element/common-HTMLOptionsCollection-add.html"
- }
- ],
- "html/semantics/forms/the-select-element/selected-index.html": [
- {
- "path": "html/semantics/forms/the-select-element/selected-index.html",
- "url": "/html/semantics/forms/the-select-element/selected-index.html"
- }
- ],
- "html/webappapis/scripting/events/uncompiled_event_handler_with_scripting_disabled.html": [
- {
- "path": "html/webappapis/scripting/events/uncompiled_event_handler_with_scripting_disabled.html",
- "url": "/html/webappapis/scripting/events/uncompiled_event_handler_with_scripting_disabled.html"
- }
]
}
},
- "reftest_nodes": {
- "html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html": [
- {
- "path": "html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html",
- "references": [
- [
- "/html/semantics/document-metadata/the-link-element/stylesheet-empty-href-ref.html",
- "=="
- ]
- ],
- "url": "/html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html"
- }
- ],
- "html/semantics/document-metadata/the-link-element/stylesheet-media.html": [
- {
- "path": "html/semantics/document-metadata/the-link-element/stylesheet-media.html",
- "references": [
- [
- "/html/semantics/document-metadata/the-link-element/stylesheet-media-ref.html",
- "=="
- ]
- ],
- "url": "/html/semantics/document-metadata/the-link-element/stylesheet-media.html"
- }
- ]
- }
+ "reftest_nodes": {}
},
"reftest_nodes": {
"2dcontext/building-paths/canvas_complexshapes_arcto_001.htm": [
@@ -38372,6 +40241,30 @@
"url": "/compat/webkit-text-fill-color-property-006.html"
}
],
+ "content-security-policy/font-src/font-blacklisted.html": [
+ {
+ "path": "content-security-policy/font-src/font-blacklisted.html",
+ "references": [
+ [
+ "/content-security-policy/font-src/font-blacklisted-ref.html",
+ "!="
+ ]
+ ],
+ "url": "/content-security-policy/font-src/font-blacklisted.html"
+ }
+ ],
+ "content-security-policy/font-src/font-whitelisted.html": [
+ {
+ "path": "content-security-policy/font-src/font-whitelisted.html",
+ "references": [
+ [
+ "/content-security-policy/font-src/font-whitelisted-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/content-security-policy/font-src/font-whitelisted.html"
+ }
+ ],
"custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-custom-tag.html": [
{
"path": "custom-elements/v0/registering/unresolved-element-pseudoclass/unresolved-element-pseudoclass-css-test-custom-tag.html",
@@ -40220,6 +42113,30 @@
"url": "/html/rendering/replaced-elements/images/space.html"
}
],
+ "html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html": [
+ {
+ "path": "html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html",
+ "references": [
+ [
+ "/html/semantics/document-metadata/the-link-element/stylesheet-empty-href-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/document-metadata/the-link-element/stylesheet-empty-href.html"
+ }
+ ],
+ "html/semantics/document-metadata/the-link-element/stylesheet-media.html": [
+ {
+ "path": "html/semantics/document-metadata/the-link-element/stylesheet-media.html",
+ "references": [
+ [
+ "/html/semantics/document-metadata/the-link-element/stylesheet-media-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/document-metadata/the-link-element/stylesheet-media.html"
+ }
+ ],
"html/semantics/document-metadata/the-link-element/stylesheet-with-base.html": [
{
"path": "html/semantics/document-metadata/the-link-element/stylesheet-with-base.html",
@@ -40472,6 +42389,126 @@
"url": "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-002.html"
}
],
+ "html/semantics/grouping-content/the-li-element/grouping-li-reftest-display-list-item.html": [
+ {
+ "path": "html/semantics/grouping-content/the-li-element/grouping-li-reftest-display-list-item.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-display-list-item-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-display-list-item.html"
+ }
+ ],
+ "html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu.html": [
+ {
+ "path": "html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu.html"
+ }
+ ],
+ "html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-mixed.html": [
+ {
+ "path": "html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-mixed.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-mixed-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-mixed.html"
+ }
+ ],
+ "html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-not-dir.html": [
+ {
+ "path": "html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-not-dir.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-not-dir-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-not-dir.html"
+ }
+ ],
+ "html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ol.html": [
+ {
+ "path": "html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ol.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ol-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ol.html"
+ }
+ ],
+ "html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-parent.html": [
+ {
+ "path": "html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-parent.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-parent-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-parent.html"
+ }
+ ],
+ "html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes.html": [
+ {
+ "path": "html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes.html"
+ }
+ ],
+ "html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ul.html": [
+ {
+ "path": "html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ul.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ul-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ul.html"
+ }
+ ],
+ "html/semantics/grouping-content/the-li-element/grouping-li-reftest-no-list-owner.html": [
+ {
+ "path": "html/semantics/grouping-content/the-li-element/grouping-li-reftest-no-list-owner.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-no-list-owner-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-no-list-owner.html"
+ }
+ ],
+ "html/semantics/grouping-content/the-li-element/grouping-li-reftest-not-being-rendered.html": [
+ {
+ "path": "html/semantics/grouping-content/the-li-element/grouping-li-reftest-not-being-rendered.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-not-being-rendered-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-li-element/grouping-li-reftest-not-being-rendered.html"
+ }
+ ],
"html/semantics/grouping-content/the-ol-element/grouping-ol-rev-reftest-001.html": [
{
"path": "html/semantics/grouping-content/the-ol-element/grouping-ol-rev-reftest-001.html",
@@ -40544,6 +42581,66 @@
"url": "/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-003.html"
}
],
+ "html/semantics/grouping-content/the-ol-element/reversed-1a.html": [
+ {
+ "path": "html/semantics/grouping-content/the-ol-element/reversed-1a.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-ol-element/reversed-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-ol-element/reversed-1a.html"
+ }
+ ],
+ "html/semantics/grouping-content/the-ol-element/reversed-1b.html": [
+ {
+ "path": "html/semantics/grouping-content/the-ol-element/reversed-1b.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-ol-element/reversed-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-ol-element/reversed-1b.html"
+ }
+ ],
+ "html/semantics/grouping-content/the-ol-element/reversed-1c.html": [
+ {
+ "path": "html/semantics/grouping-content/the-ol-element/reversed-1c.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-ol-element/reversed-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-ol-element/reversed-1c.html"
+ }
+ ],
+ "html/semantics/grouping-content/the-ol-element/reversed-1d.html": [
+ {
+ "path": "html/semantics/grouping-content/the-ol-element/reversed-1d.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-ol-element/reversed-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-ol-element/reversed-1d.html"
+ }
+ ],
+ "html/semantics/grouping-content/the-ol-element/reversed-1e.html": [
+ {
+ "path": "html/semantics/grouping-content/the-ol-element/reversed-1e.html",
+ "references": [
+ [
+ "/html/semantics/grouping-content/the-ol-element/reversed-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/html/semantics/grouping-content/the-ol-element/reversed-1e.html"
+ }
+ ],
"html/semantics/grouping-content/the-ol-element/reversed-2.html": [
{
"path": "html/semantics/grouping-content/the-ol-element/reversed-2.html",
@@ -40916,6 +43013,438 @@
"url": "/http/basic-auth-cache-test.html"
}
],
+ "mathml/presentation-markup/spaces/space-2.html": [
+ {
+ "path": "mathml/presentation-markup/spaces/space-2.html",
+ "references": [
+ [
+ "/mathml/presentation-markup/spaces/space-2-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/presentation-markup/spaces/space-2.html"
+ }
+ ],
+ "mathml/relations/css-styling/color-1.html": [
+ {
+ "path": "mathml/relations/css-styling/color-1.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/color-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/color-1.html"
+ }
+ ],
+ "mathml/relations/css-styling/display-1.html": [
+ {
+ "path": "mathml/relations/css-styling/display-1.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/display-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/display-1.html"
+ }
+ ],
+ "mathml/relations/css-styling/lengths-1-ref.html": [
+ {
+ "path": "mathml/relations/css-styling/lengths-1-ref.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/lengths-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/lengths-1-ref.html"
+ }
+ ],
+ "mathml/relations/css-styling/lengths-1.html": [
+ {
+ "path": "mathml/relations/css-styling/lengths-1.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/lengths-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/lengths-1.html"
+ }
+ ],
+ "mathml/relations/css-styling/lengths-2.html": [
+ {
+ "path": "mathml/relations/css-styling/lengths-2.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/lengths-2-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/lengths-2.html"
+ }
+ ],
+ "mathml/relations/css-styling/mathvariant-bold-fraktur.html": [
+ {
+ "path": "mathml/relations/css-styling/mathvariant-bold-fraktur.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-bold-fraktur-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-bold-fraktur.html"
+ }
+ ],
+ "mathml/relations/css-styling/mathvariant-bold-italic.html": [
+ {
+ "path": "mathml/relations/css-styling/mathvariant-bold-italic.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-bold-italic-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-bold-italic.html"
+ }
+ ],
+ "mathml/relations/css-styling/mathvariant-bold-sans-serif.html": [
+ {
+ "path": "mathml/relations/css-styling/mathvariant-bold-sans-serif.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-bold-sans-serif-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-bold-sans-serif.html"
+ }
+ ],
+ "mathml/relations/css-styling/mathvariant-bold-script.html": [
+ {
+ "path": "mathml/relations/css-styling/mathvariant-bold-script.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-bold-script-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-bold-script.html"
+ }
+ ],
+ "mathml/relations/css-styling/mathvariant-bold.html": [
+ {
+ "path": "mathml/relations/css-styling/mathvariant-bold.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-bold-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-bold.html"
+ }
+ ],
+ "mathml/relations/css-styling/mathvariant-double-struck.html": [
+ {
+ "path": "mathml/relations/css-styling/mathvariant-double-struck.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-double-struck-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-double-struck.html"
+ }
+ ],
+ "mathml/relations/css-styling/mathvariant-fraktur.html": [
+ {
+ "path": "mathml/relations/css-styling/mathvariant-fraktur.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-fraktur-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-fraktur.html"
+ }
+ ],
+ "mathml/relations/css-styling/mathvariant-initial.html": [
+ {
+ "path": "mathml/relations/css-styling/mathvariant-initial.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-initial-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-initial.html"
+ }
+ ],
+ "mathml/relations/css-styling/mathvariant-italic.html": [
+ {
+ "path": "mathml/relations/css-styling/mathvariant-italic.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-italic-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-italic.html"
+ }
+ ],
+ "mathml/relations/css-styling/mathvariant-looped.html": [
+ {
+ "path": "mathml/relations/css-styling/mathvariant-looped.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-looped-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-looped.html"
+ }
+ ],
+ "mathml/relations/css-styling/mathvariant-monospace.html": [
+ {
+ "path": "mathml/relations/css-styling/mathvariant-monospace.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-monospace-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-monospace.html"
+ }
+ ],
+ "mathml/relations/css-styling/mathvariant-sans-serif-bold-italic.html": [
+ {
+ "path": "mathml/relations/css-styling/mathvariant-sans-serif-bold-italic.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-sans-serif-bold-italic-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-sans-serif-bold-italic.html"
+ }
+ ],
+ "mathml/relations/css-styling/mathvariant-sans-serif-italic.html": [
+ {
+ "path": "mathml/relations/css-styling/mathvariant-sans-serif-italic.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-sans-serif-italic-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-sans-serif-italic.html"
+ }
+ ],
+ "mathml/relations/css-styling/mathvariant-sans-serif.html": [
+ {
+ "path": "mathml/relations/css-styling/mathvariant-sans-serif.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-sans-serif-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-sans-serif.html"
+ }
+ ],
+ "mathml/relations/css-styling/mathvariant-script.html": [
+ {
+ "path": "mathml/relations/css-styling/mathvariant-script.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-script-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-script.html"
+ }
+ ],
+ "mathml/relations/css-styling/mathvariant-stretched.html": [
+ {
+ "path": "mathml/relations/css-styling/mathvariant-stretched.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-stretched-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-stretched.html"
+ }
+ ],
+ "mathml/relations/css-styling/mathvariant-tailed.html": [
+ {
+ "path": "mathml/relations/css-styling/mathvariant-tailed.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/mathvariant-tailed-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/mathvariant-tailed.html"
+ }
+ ],
+ "mathml/relations/css-styling/visibility-1.html": [
+ {
+ "path": "mathml/relations/css-styling/visibility-1.html",
+ "references": [
+ [
+ "/mathml/relations/css-styling/visibility-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/css-styling/visibility-1.html"
+ }
+ ],
+ "mathml/relations/html5-tree/class-1.html": [
+ {
+ "path": "mathml/relations/html5-tree/class-1.html",
+ "references": [
+ [
+ "/mathml/relations/html5-tree/class-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/html5-tree/class-1.html"
+ }
+ ],
+ "mathml/relations/html5-tree/color-attributes-1.html": [
+ {
+ "path": "mathml/relations/html5-tree/color-attributes-1.html",
+ "references": [
+ [
+ "/mathml/relations/html5-tree/color-attributes-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/html5-tree/color-attributes-1.html"
+ }
+ ],
+ "mathml/relations/html5-tree/dynamic-1.html": [
+ {
+ "path": "mathml/relations/html5-tree/dynamic-1.html",
+ "references": [
+ [
+ "/mathml/relations/html5-tree/dynamic-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/html5-tree/dynamic-1.html"
+ }
+ ],
+ "mathml/relations/html5-tree/href-click-1.html": [
+ {
+ "path": "mathml/relations/html5-tree/href-click-1.html",
+ "references": [
+ [
+ "/mathml/relations/html5-tree/href-click-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/html5-tree/href-click-1.html"
+ }
+ ],
+ "mathml/relations/html5-tree/href-click-2.html": [
+ {
+ "path": "mathml/relations/html5-tree/href-click-2.html",
+ "references": [
+ [
+ "/mathml/relations/html5-tree/href-click-2-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/html5-tree/href-click-2.html"
+ }
+ ],
+ "mathml/relations/html5-tree/integration-point-1.html": [
+ {
+ "path": "mathml/relations/html5-tree/integration-point-1.html",
+ "references": [
+ [
+ "/mathml/relations/html5-tree/integration-point-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/html5-tree/integration-point-1.html"
+ }
+ ],
+ "mathml/relations/html5-tree/integration-point-2.html": [
+ {
+ "path": "mathml/relations/html5-tree/integration-point-2.html",
+ "references": [
+ [
+ "/mathml/relations/html5-tree/integration-point-2-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/html5-tree/integration-point-2.html"
+ }
+ ],
+ "mathml/relations/html5-tree/integration-point-3.html": [
+ {
+ "path": "mathml/relations/html5-tree/integration-point-3.html",
+ "references": [
+ [
+ "/mathml/relations/html5-tree/integration-point-3-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/html5-tree/integration-point-3.html"
+ }
+ ],
+ "mathml/relations/html5-tree/required-extensions-2.html": [
+ {
+ "path": "mathml/relations/html5-tree/required-extensions-2.html",
+ "references": [
+ [
+ "/mathml/relations/html5-tree/required-extensions-2-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/html5-tree/required-extensions-2.html"
+ }
+ ],
+ "mathml/relations/html5-tree/unique-identifier-1.html": [
+ {
+ "path": "mathml/relations/html5-tree/unique-identifier-1.html",
+ "references": [
+ [
+ "/mathml/relations/html5-tree/unique-identifier-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/html5-tree/unique-identifier-1.html"
+ }
+ ],
+ "mathml/relations/html5-tree/unique-identifier-3.html": [
+ {
+ "path": "mathml/relations/html5-tree/unique-identifier-3.html",
+ "references": [
+ [
+ "/mathml/relations/html5-tree/unique-identifier-3-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/html5-tree/unique-identifier-3.html"
+ }
+ ],
+ "mathml/relations/text-and-math/use-typo-metrics-1.html": [
+ {
+ "path": "mathml/relations/text-and-math/use-typo-metrics-1.html",
+ "references": [
+ [
+ "/mathml/relations/text-and-math/use-typo-metrics-1-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/mathml/relations/text-and-math/use-typo-metrics-1.html"
+ }
+ ],
"quirks-mode/historical/list-item-bullet-size.html": [
{
"path": "quirks-mode/historical/list-item-bullet-size.html",
@@ -41000,6 +43529,150 @@
"url": "/shadow-dom/untriaged/styles/not-apply-in-shadow-root-001.html"
}
],
+ "svg/linking/reftests/href-a-element-attr-change.html": [
+ {
+ "path": "svg/linking/reftests/href-a-element-attr-change.html",
+ "references": [
+ [
+ "/svg/linking/reftests/href-a-element-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/linking/reftests/href-a-element-attr-change.html"
+ }
+ ],
+ "svg/linking/reftests/href-feImage-element.html": [
+ {
+ "path": "svg/linking/reftests/href-feImage-element.html",
+ "references": [
+ [
+ "/svg/linking/reftests/href-feImage-element-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/linking/reftests/href-feImage-element.html"
+ }
+ ],
+ "svg/linking/reftests/href-filter-element.html": [
+ {
+ "path": "svg/linking/reftests/href-filter-element.html",
+ "references": [
+ [
+ "/svg/linking/reftests/href-filter-element-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/linking/reftests/href-filter-element.html"
+ }
+ ],
+ "svg/linking/reftests/href-gradient-element.html": [
+ {
+ "path": "svg/linking/reftests/href-gradient-element.html",
+ "references": [
+ [
+ "/svg/linking/reftests/href-gradient-element-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/linking/reftests/href-gradient-element.html"
+ }
+ ],
+ "svg/linking/reftests/href-image-element.html": [
+ {
+ "path": "svg/linking/reftests/href-image-element.html",
+ "references": [
+ [
+ "/svg/linking/reftests/href-image-element-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/linking/reftests/href-image-element.html"
+ }
+ ],
+ "svg/linking/reftests/href-pattern-element.html": [
+ {
+ "path": "svg/linking/reftests/href-pattern-element.html",
+ "references": [
+ [
+ "/svg/linking/reftests/href-pattern-element-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/linking/reftests/href-pattern-element.html"
+ }
+ ],
+ "svg/linking/reftests/href-textPath-element.html": [
+ {
+ "path": "svg/linking/reftests/href-textPath-element.html",
+ "references": [
+ [
+ "/svg/linking/reftests/href-textPath-element-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/linking/reftests/href-textPath-element.html"
+ }
+ ],
+ "svg/linking/reftests/href-use-element.html": [
+ {
+ "path": "svg/linking/reftests/href-use-element.html",
+ "references": [
+ [
+ "/svg/linking/reftests/href-use-element-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/linking/reftests/href-use-element.html"
+ }
+ ],
+ "svg/shapes/rect-01.svg": [
+ {
+ "path": "svg/shapes/rect-01.svg",
+ "references": [
+ [
+ "/svg/shapes/rect-01-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/shapes/rect-01.svg"
+ }
+ ],
+ "svg/shapes/rect-02.svg": [
+ {
+ "path": "svg/shapes/rect-02.svg",
+ "references": [
+ [
+ "/svg/shapes/rect-02-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/shapes/rect-02.svg"
+ }
+ ],
+ "svg/shapes/rect-03.svg": [
+ {
+ "path": "svg/shapes/rect-03.svg",
+ "references": [
+ [
+ "/svg/shapes/rect-03-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/shapes/rect-03.svg"
+ }
+ ],
+ "svg/shapes/rect-04.svg": [
+ {
+ "path": "svg/shapes/rect-04.svg",
+ "references": [
+ [
+ "/svg/shapes/rect-04-ref.html",
+ "=="
+ ]
+ ],
+ "url": "/svg/shapes/rect-04.svg"
+ }
+ ],
"webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_completely_move_up.html": [
{
"path": "webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_completely_move_up.html",
@@ -43653,7 +46326,7 @@
}
]
},
- "rev": "3b3585e368841b77caea8576fa56cef91c3fbdf0",
+ "rev": "e8bfc205e36ad699601212cd50083870bad9a75d",
"url_base": "/",
"version": 3
}
diff --git a/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_bits.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_bits.worker.js.ini
index a38bb6334e6..73885505831 100644
--- a/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_bits.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_bits.worker.js.ini
@@ -1,3 +1,3 @@
-[ecdh_bits.worker]
+[ecdh_bits.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_keys.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_keys.worker.js.ini
index d06f90911fe..9f20f554ccb 100644
--- a/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_keys.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/ecdh_keys.worker.js.ini
@@ -1,3 +1,3 @@
-[ecdh_keys.worker]
+[ecdh_keys.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/hkdf.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/hkdf.worker.js.ini
index c036e5efc17..4831ce66875 100644
--- a/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/hkdf.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/hkdf.worker.js.ini
@@ -1,3 +1,3 @@
-[hkdf.worker]
+[hkdf.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/pbkdf2.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/pbkdf2.worker.js.ini
index 449664ad47b..4b70f2b1f1d 100644
--- a/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/pbkdf2.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/derive_bits_keys/pbkdf2.worker.js.ini
@@ -1,3 +1,3 @@
-[pbkdf2.worker]
+[pbkdf2.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/digest/digest.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/digest/digest.worker.js.ini
index 715e7fa9097..ee646a95f38 100644
--- a/tests/wpt/metadata/WebCryptoAPI/digest/digest.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/digest/digest.worker.js.ini
@@ -1,4 +1,4 @@
-[digest.worker]
+[digest.worker.html]
type: testharness
[SHA-1 with empty source data]
expected: FAIL
diff --git a/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_cbc.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_cbc.worker.js.ini
index ad9373e870d..990ba43cd33 100644
--- a/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_cbc.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_cbc.worker.js.ini
@@ -1,3 +1,3 @@
-[aes_cbc.worker]
+[aes_cbc.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_ctr.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_ctr.worker.js.ini
index b65f0a6d0f5..f25976f5bca 100644
--- a/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_ctr.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_ctr.worker.js.ini
@@ -1,3 +1,3 @@
-[aes_ctr.worker]
+[aes_ctr.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_gcm.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_gcm.worker.js.ini
index a576b4e021b..79535257faf 100644
--- a/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_gcm.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/aes_gcm.worker.js.ini
@@ -1,3 +1,3 @@
-[aes_gcm.worker]
+[aes_gcm.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/rsa.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/rsa.worker.js.ini
index addfa4b287f..91d784e300c 100644
--- a/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/rsa.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/encrypt_decrypt/rsa.worker.js.ini
@@ -1,3 +1,3 @@
-[rsa.worker]
+[rsa.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/generateKey/failures.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/generateKey/failures.worker.js.ini
index 1e4aabbea47..a28f0dff8e3 100644
--- a/tests/wpt/metadata/WebCryptoAPI/generateKey/failures.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/generateKey/failures.worker.js.ini
@@ -1,3 +1,3 @@
-[failures.worker]
+[failures.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_AES-CBC.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_AES-CBC.worker.js.ini
index 7b3310b78b5..077ac5f87ae 100644
--- a/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_AES-CBC.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_AES-CBC.worker.js.ini
@@ -1,3 +1,3 @@
-[failures_AES-CBC.worker]
+[failures_AES-CBC.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_AES-CTR.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_AES-CTR.worker.js.ini
index 472b09dd1ee..478ee6b23c3 100644
--- a/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_AES-CTR.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_AES-CTR.worker.js.ini
@@ -1,3 +1,3 @@
-[failures_AES-CTR.worker]
+[failures_AES-CTR.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_AES-GCM.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_AES-GCM.worker.js.ini
index 64e9f58f061..0a0afaff0d7 100644
--- a/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_AES-GCM.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_AES-GCM.worker.js.ini
@@ -1,3 +1,3 @@
-[failures_AES-GCM.worker]
+[failures_AES-GCM.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_AES-KW.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_AES-KW.worker.js.ini
index 96031ce55c3..184df17d30b 100644
--- a/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_AES-KW.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_AES-KW.worker.js.ini
@@ -1,3 +1,3 @@
-[failures_AES-KW.worker]
+[failures_AES-KW.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_ECDH.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_ECDH.worker.js.ini
index 49ab628294f..d8a841420a8 100644
--- a/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_ECDH.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_ECDH.worker.js.ini
@@ -1,3 +1,3 @@
-[failures_ECDH.worker]
+[failures_ECDH.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_ECDSA.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_ECDSA.worker.js.ini
index 2fd250f4500..dff306cc4d1 100644
--- a/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_ECDSA.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_ECDSA.worker.js.ini
@@ -1,3 +1,3 @@
-[failures_ECDSA.worker]
+[failures_ECDSA.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_HMAC.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_HMAC.worker.js.ini
index 411ecbddac9..bc918d0a819 100644
--- a/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_HMAC.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_HMAC.worker.js.ini
@@ -1,3 +1,3 @@
-[failures_HMAC.worker]
+[failures_HMAC.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_RSA-OAEP.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_RSA-OAEP.worker.js.ini
index 3ec9c3c5388..3fee657163c 100644
--- a/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_RSA-OAEP.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_RSA-OAEP.worker.js.ini
@@ -1,3 +1,3 @@
-[failures_RSA-OAEP.worker]
+[failures_RSA-OAEP.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_RSA-PSS.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_RSA-PSS.worker.js.ini
index 7b28b2c0480..52ee9bde09d 100644
--- a/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_RSA-PSS.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_RSA-PSS.worker.js.ini
@@ -1,3 +1,3 @@
-[failures_RSA-PSS.worker]
+[failures_RSA-PSS.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_RSASSA-PKCS1-v1_5.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_RSASSA-PKCS1-v1_5.worker.js.ini
index 5cb45ae095b..b8b37f0b6e5 100644
--- a/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_RSASSA-PKCS1-v1_5.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/generateKey/failures_RSASSA-PKCS1-v1_5.worker.js.ini
@@ -1,3 +1,3 @@
-[failures_RSASSA-PKCS1-v1_5.worker]
+[failures_RSASSA-PKCS1-v1_5.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/generateKey/successes.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/generateKey/successes.worker.js.ini
index f3a7d610c37..87f8db413bc 100644
--- a/tests/wpt/metadata/WebCryptoAPI/generateKey/successes.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/generateKey/successes.worker.js.ini
@@ -1,3 +1,3 @@
-[successes.worker]
+[successes.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_AES-CBC.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_AES-CBC.worker.js.ini
index e9a9e303a25..ec5ae4f0bef 100644
--- a/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_AES-CBC.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_AES-CBC.worker.js.ini
@@ -1,3 +1,3 @@
-[successes_AES-CBC.worker]
+[successes_AES-CBC.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_AES-CTR.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_AES-CTR.worker.js.ini
index dcf7febafe5..662f8504734 100644
--- a/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_AES-CTR.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_AES-CTR.worker.js.ini
@@ -1,3 +1,3 @@
-[successes_AES-CTR.worker]
+[successes_AES-CTR.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_AES-GCM.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_AES-GCM.worker.js.ini
index 4b949a1b47d..180de54dad9 100644
--- a/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_AES-GCM.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_AES-GCM.worker.js.ini
@@ -1,3 +1,3 @@
-[successes_AES-GCM.worker]
+[successes_AES-GCM.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_AES-KW.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_AES-KW.worker.js.ini
index 5efa92cfc5d..6c38652867a 100644
--- a/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_AES-KW.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_AES-KW.worker.js.ini
@@ -1,3 +1,3 @@
-[successes_AES-KW.worker]
+[successes_AES-KW.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_ECDH.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_ECDH.worker.js.ini
index 42eac719df6..7d00784170d 100644
--- a/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_ECDH.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_ECDH.worker.js.ini
@@ -1,3 +1,3 @@
-[successes_ECDH.worker]
+[successes_ECDH.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_ECDSA.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_ECDSA.worker.js.ini
index 0d73e197cf9..5cb011f2614 100644
--- a/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_ECDSA.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_ECDSA.worker.js.ini
@@ -1,3 +1,3 @@
-[successes_ECDSA.worker]
+[successes_ECDSA.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_HMAC.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_HMAC.worker.js.ini
index 84b2544fd81..9296e99064e 100644
--- a/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_HMAC.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_HMAC.worker.js.ini
@@ -1,3 +1,3 @@
-[successes_HMAC.worker]
+[successes_HMAC.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_RSA-OAEP.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_RSA-OAEP.worker.js.ini
index f4e683fa2df..61c9375046f 100644
--- a/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_RSA-OAEP.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_RSA-OAEP.worker.js.ini
@@ -1,3 +1,3 @@
-[successes_RSA-OAEP.worker]
+[successes_RSA-OAEP.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_RSA-PSS.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_RSA-PSS.worker.js.ini
index 76a09318544..3b435eaa1ed 100644
--- a/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_RSA-PSS.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_RSA-PSS.worker.js.ini
@@ -1,3 +1,3 @@
-[successes_RSA-PSS.worker]
+[successes_RSA-PSS.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_RSASSA-PKCS1-v1_5.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_RSASSA-PKCS1-v1_5.worker.js.ini
index 95acb89f629..9247c718885 100644
--- a/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_RSASSA-PKCS1-v1_5.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/generateKey/successes_RSASSA-PKCS1-v1_5.worker.js.ini
@@ -1,3 +1,3 @@
-[successes_RSASSA-PKCS1-v1_5.worker]
+[successes_RSASSA-PKCS1-v1_5.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/idlharness.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/idlharness.worker.js.ini
index fa3b42951f7..71b1ea6c745 100644
--- a/tests/wpt/metadata/WebCryptoAPI/idlharness.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/idlharness.worker.js.ini
@@ -1,5 +1,8 @@
-[idlharness.worker]
+[idlharness.worker.html]
type: testharness
+ [ArrayBuffer interface: existence and properties of interface object]
+ expected: FAIL
+
[Crypto interface: attribute subtle]
expected: FAIL
@@ -162,6 +165,3 @@
[SubtleCrypto interface: calling unwrapKey(KeyFormat,BufferSource,CryptoKey,AlgorithmIdentifier,AlgorithmIdentifier,boolean,[object Object\]) on crypto.subtle with too few arguments must throw TypeError]
expected: FAIL
- [ArrayBuffer interface: existence and properties of interface object]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/WebCryptoAPI/import_export/ec_importKey.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/import_export/ec_importKey.worker.js.ini
index b9c9b687623..50b89ab7222 100644
--- a/tests/wpt/metadata/WebCryptoAPI/import_export/ec_importKey.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/import_export/ec_importKey.worker.js.ini
@@ -1,4 +1,4 @@
-[ec_importKey.worker]
+[ec_importKey.worker.html]
type: testharness
[Good parameters: P-256 bits (spki, buffer(91), {name: ECDSA, namedCurve: P-256}, true, [\])]
expected: FAIL
diff --git a/tests/wpt/metadata/WebCryptoAPI/import_export/rsa_importKey.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/import_export/rsa_importKey.worker.js.ini
index c6e5bf65a4d..9f6f25dcca9 100644
--- a/tests/wpt/metadata/WebCryptoAPI/import_export/rsa_importKey.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/import_export/rsa_importKey.worker.js.ini
@@ -1,6 +1,5 @@
-[rsa_importKey.worker]
+[rsa_importKey.worker.html]
type: testharness
- disabled: https://github.com/servo/servo/issues/12654
[Good parameters: 1024 bits (spki, buffer(162), {hash: SHA-1, name: RSA-OAEP}, true, [encrypt\])]
expected: FAIL
diff --git a/tests/wpt/metadata/WebCryptoAPI/import_export/symmetric_importKey.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/import_export/symmetric_importKey.worker.js.ini
index 5d98517ad63..d974812e8f6 100644
--- a/tests/wpt/metadata/WebCryptoAPI/import_export/symmetric_importKey.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/import_export/symmetric_importKey.worker.js.ini
@@ -1,4 +1,4 @@
-[symmetric_importKey.worker]
+[symmetric_importKey.worker.html]
type: testharness
[Good parameters: 128 bits (raw, {0: 1, 1: 2, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}, {name: AES-CTR}, true, [encrypt\])]
expected: FAIL
diff --git a/tests/wpt/metadata/WebCryptoAPI/sign_verify/ecdsa.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/sign_verify/ecdsa.worker.js.ini
index 50fe8b0f2f0..f1f9ac74838 100644
--- a/tests/wpt/metadata/WebCryptoAPI/sign_verify/ecdsa.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/sign_verify/ecdsa.worker.js.ini
@@ -1,3 +1,3 @@
-[ecdsa.worker]
+[ecdsa.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/sign_verify/hmac.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/sign_verify/hmac.worker.js.ini
index 76f33a3d17d..3842f8812c6 100644
--- a/tests/wpt/metadata/WebCryptoAPI/sign_verify/hmac.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/sign_verify/hmac.worker.js.ini
@@ -1,3 +1,3 @@
-[hmac.worker]
+[hmac.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pkcs.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pkcs.worker.js.ini
index 63b341c3b39..206f3c11726 100644
--- a/tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pkcs.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pkcs.worker.js.ini
@@ -1,3 +1,3 @@
-[rsa_pkcs.worker]
+[rsa_pkcs.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pss.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pss.worker.js.ini
index 4b81358e800..89aa8859aff 100644
--- a/tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pss.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/sign_verify/rsa_pss.worker.js.ini
@@ -1,3 +1,3 @@
-[rsa_pss.worker]
+[rsa_pss.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker.js.ini
index 1467e49622f..0726e6d35ef 100644
--- a/tests/wpt/metadata/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker.js.ini
@@ -1,3 +1,3 @@
-[wrapKey_unwrapKey.worker]
+[wrapKey_unwrapKey.worker.html]
type: testharness
expected: ERROR
diff --git a/tests/wpt/metadata/WebIDL/current-realm.html.ini b/tests/wpt/metadata/WebIDL/current-realm.html.ini
new file mode 100644
index 00000000000..f1c9625cf74
--- /dev/null
+++ b/tests/wpt/metadata/WebIDL/current-realm.html.ini
@@ -0,0 +1,95 @@
+[current-realm.html]
+ type: testharness
+ [querySelectorAll]
+ expected: FAIL
+
+ [createElement]
+ expected: FAIL
+
+ [createElementNS]
+ expected: FAIL
+
+ [createDocumentFragment]
+ expected: FAIL
+
+ [createTextNode]
+ expected: FAIL
+
+ [createComment]
+ expected: FAIL
+
+ [createProcessingInstruction]
+ expected: FAIL
+
+ [createAttribute]
+ expected: FAIL
+
+ [createAttributeNS]
+ expected: FAIL
+
+ [createEvent]
+ expected: FAIL
+
+ [createRange]
+ expected: FAIL
+
+ [createNodeIterator]
+ expected: FAIL
+
+ [createTreeWalker]
+ expected: FAIL
+
+ [getElementsByTagName]
+ expected: FAIL
+
+ [getElementsByTagNameNS]
+ expected: FAIL
+
+ [getElementsByClassName]
+ expected: FAIL
+
+ [createDocumentType]
+ expected: FAIL
+
+ [createDocument]
+ expected: FAIL
+
+ [createHTMLDocument]
+ expected: FAIL
+
+ [NamedNodeMap item]
+ expected: FAIL
+
+ [NamedNodeMap getNamedItem]
+ expected: FAIL
+
+ [NamedNodeMap getNamedItemNS]
+ expected: FAIL
+
+ [splitText]
+ expected: FAIL
+
+ [extractContents]
+ expected: FAIL
+
+ [cloneContents]
+ expected: FAIL
+
+ [cloneRange]
+ expected: FAIL
+
+ [getContext 2d]
+ expected: FAIL
+
+ [getContext webgl]
+ expected: FAIL
+
+ [createImageData]
+ expected: FAIL
+
+ [getImageData]
+ expected: FAIL
+
+ [FontFace's load()]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js.ini b/tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js.ini
index 66a75c592b8..40ad9777f12 100644
--- a/tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js.ini
+++ b/tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js.ini
@@ -1,4 +1,4 @@
-[constructor-object.worker]
+[constructor-object.worker.html]
type: testharness
[existence and properties of DOMException]
expected: FAIL
diff --git a/tests/wpt/metadata/XMLHttpRequest/abort-during-open.htm.ini b/tests/wpt/metadata/XMLHttpRequest/abort-during-open.htm.ini
new file mode 100644
index 00000000000..eac211dc538
--- /dev/null
+++ b/tests/wpt/metadata/XMLHttpRequest/abort-during-open.htm.ini
@@ -0,0 +1,5 @@
+[abort-during-open.htm]
+ type: testharness
+ [XMLHttpRequest: abort() during OPEN]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/XMLHttpRequest/abort-during-open.worker.js.ini b/tests/wpt/metadata/XMLHttpRequest/abort-during-open.worker.js.ini
new file mode 100644
index 00000000000..de95cce12e0
--- /dev/null
+++ b/tests/wpt/metadata/XMLHttpRequest/abort-during-open.worker.js.ini
@@ -0,0 +1,5 @@
+[abort-during-open.worker.html]
+ type: testharness
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/XMLHttpRequest/abort-event-abort.htm.ini b/tests/wpt/metadata/XMLHttpRequest/abort-event-abort.htm.ini
new file mode 100644
index 00000000000..2804d13941b
--- /dev/null
+++ b/tests/wpt/metadata/XMLHttpRequest/abort-event-abort.htm.ini
@@ -0,0 +1,5 @@
+[abort-event-abort.htm]
+ type: testharness
+ [XMLHttpRequest: The abort() method: do not fire abort event in OPENED state when send() flag is unset.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/XMLHttpRequest/responsexml-basic.htm.ini b/tests/wpt/metadata/XMLHttpRequest/responsexml-basic.htm.ini
index bf2383d17ac..df9151dc64c 100644
--- a/tests/wpt/metadata/XMLHttpRequest/responsexml-basic.htm.ini
+++ b/tests/wpt/metadata/XMLHttpRequest/responsexml-basic.htm.ini
@@ -1,8 +1,5 @@
[responsexml-basic.htm]
type: testharness
- [XMLHttpRequest: responseXML basic test]
- expected: FAIL
-
[responseXML on empty response documents]
expected: FAIL
diff --git a/tests/wpt/metadata/XMLHttpRequest/send-after-setting-document-domain.htm.ini b/tests/wpt/metadata/XMLHttpRequest/send-after-setting-document-domain.htm.ini
new file mode 100644
index 00000000000..cb48f45fae3
--- /dev/null
+++ b/tests/wpt/metadata/XMLHttpRequest/send-after-setting-document-domain.htm.ini
@@ -0,0 +1,3 @@
+[send-after-setting-document-domain.htm]
+ type: testharness
+ expected: ERROR
diff --git a/tests/wpt/metadata/XMLHttpRequest/send-data-unexpected-tostring.htm.ini b/tests/wpt/metadata/XMLHttpRequest/send-data-unexpected-tostring.htm.ini
new file mode 100644
index 00000000000..83018dbd05b
--- /dev/null
+++ b/tests/wpt/metadata/XMLHttpRequest/send-data-unexpected-tostring.htm.ini
@@ -0,0 +1,5 @@
+[send-data-unexpected-tostring.htm]
+ type: testharness
+ [abort() called from data stringification]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/XMLHttpRequest/send-usp.worker.js.ini b/tests/wpt/metadata/XMLHttpRequest/send-usp.worker.js.ini
deleted file mode 100644
index 0a4a9f9efa8..00000000000
--- a/tests/wpt/metadata/XMLHttpRequest/send-usp.worker.js.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[send-usp.worker]
- type: testharness
- disabled: https://github.com/servo/servo/issues/12654
diff --git a/tests/wpt/metadata/dom/collections/HTMLCollection-supported-property-indices.html.ini b/tests/wpt/metadata/dom/collections/HTMLCollection-supported-property-indices.html.ini
index 14c378bc64b..d614757774d 100644
--- a/tests/wpt/metadata/dom/collections/HTMLCollection-supported-property-indices.html.ini
+++ b/tests/wpt/metadata/dom/collections/HTMLCollection-supported-property-indices.html.ini
@@ -6,3 +6,12 @@
[Handling of property names that look like integers around 2^32]
expected: FAIL
+ [Trying to set an expando that would shadow an already-existing indexed property]
+ expected: FAIL
+
+ [Trying to set an expando with an indexed property name past the end of the list]
+ expected: FAIL
+
+ [Trying to delete an indexed property name should never work]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/collections/HTMLCollection-supported-property-names.html.ini b/tests/wpt/metadata/dom/collections/HTMLCollection-supported-property-names.html.ini
new file mode 100644
index 00000000000..fce9ea38e42
--- /dev/null
+++ b/tests/wpt/metadata/dom/collections/HTMLCollection-supported-property-names.html.ini
@@ -0,0 +1,5 @@
+[HTMLCollection-supported-property-names.html]
+ type: testharness
+ [Trying to set an expando that would shadow an already-existing named property]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/events/Event-dispatch-click.html.ini b/tests/wpt/metadata/dom/events/Event-dispatch-click.html.ini
new file mode 100644
index 00000000000..5daa842571a
--- /dev/null
+++ b/tests/wpt/metadata/dom/events/Event-dispatch-click.html.ini
@@ -0,0 +1,24 @@
+[Event-dispatch-click.html]
+ type: testharness
+ expected: TIMEOUT
+ [basic with dispatchEvent()]
+ expected: FAIL
+
+ [look at parents when event bubbles]
+ expected: FAIL
+
+ [pick the first with activation behavior <input type=checkbox>]
+ expected: FAIL
+
+ [pick the first with activation behavior <a href>]
+ expected: FAIL
+
+ [event state during post-click handling]
+ expected: TIMEOUT
+
+ [redispatch during post-click handling]
+ expected: TIMEOUT
+
+ [disconnected form should not submit]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/nodes/DOMImplementation-createDocument.html.ini b/tests/wpt/metadata/dom/nodes/DOMImplementation-createDocument.html.ini
new file mode 100644
index 00000000000..2c96250d0b1
--- /dev/null
+++ b/tests/wpt/metadata/dom/nodes/DOMImplementation-createDocument.html.ini
@@ -0,0 +1,14 @@
+[DOMImplementation-createDocument.html]
+ type: testharness
+ [createDocument test: null,"ெfoo",null,"INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createDocument test: "http://example.com/","a:0",null,"NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createDocument test: "http://example.com/","a:ெ",null,"NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createDocument test: "http://example.com/","ெ:a",null,"INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/nodes/Document-createElement.html.ini b/tests/wpt/metadata/dom/nodes/Document-createElement.html.ini
new file mode 100644
index 00000000000..94eefdcffa9
--- /dev/null
+++ b/tests/wpt/metadata/dom/nodes/Document-createElement.html.ini
@@ -0,0 +1,251 @@
+[Document-createElement.html]
+ type: testharness
+ [createElement(undefined) in XML document]
+ expected: FAIL
+
+ [createElement(undefined) in XHTML document]
+ expected: FAIL
+
+ [createElement(null) in XML document]
+ expected: FAIL
+
+ [createElement(null) in XHTML document]
+ expected: FAIL
+
+ [createElement("foo") in XML document]
+ expected: FAIL
+
+ [createElement("foo") in XHTML document]
+ expected: FAIL
+
+ [createElement("f1oo") in XML document]
+ expected: FAIL
+
+ [createElement("f1oo") in XHTML document]
+ expected: FAIL
+
+ [createElement("foo1") in XML document]
+ expected: FAIL
+
+ [createElement("foo1") in XHTML document]
+ expected: FAIL
+
+ [createElement("fெ") in XML document]
+ expected: FAIL
+
+ [createElement("fெ") in XHTML document]
+ expected: FAIL
+
+ [createElement("fooெ") in XML document]
+ expected: FAIL
+
+ [createElement("fooெ") in XHTML document]
+ expected: FAIL
+
+ [createElement(":") in XML document]
+ expected: FAIL
+
+ [createElement(":foo") in XML document]
+ expected: FAIL
+
+ [createElement(":foo") in XHTML document]
+ expected: FAIL
+
+ [createElement("f:oo") in XML document]
+ expected: FAIL
+
+ [createElement("f:oo") in XHTML document]
+ expected: FAIL
+
+ [createElement("foo:") in XML document]
+ expected: FAIL
+
+ [createElement("foo:") in XHTML document]
+ expected: FAIL
+
+ [createElement("f:o:o") in XML document]
+ expected: FAIL
+
+ [createElement("f:o:o") in XHTML document]
+ expected: FAIL
+
+ [createElement("f::oo") in XML document]
+ expected: FAIL
+
+ [createElement("f::oo") in XHTML document]
+ expected: FAIL
+
+ [createElement("f::oo:") in XML document]
+ expected: FAIL
+
+ [createElement("f::oo:") in XHTML document]
+ expected: FAIL
+
+ [createElement("foo:0") in XML document]
+ expected: FAIL
+
+ [createElement("foo:0") in XHTML document]
+ expected: FAIL
+
+ [createElement("foo:_") in XML document]
+ expected: FAIL
+
+ [createElement("foo:_") in XHTML document]
+ expected: FAIL
+
+ [createElement("foo:ெ") in XML document]
+ expected: FAIL
+
+ [createElement("foo:ெ") in XHTML document]
+ expected: FAIL
+
+ [createElement("foo:fooெ") in XML document]
+ expected: FAIL
+
+ [createElement("foo:fooெ") in XHTML document]
+ expected: FAIL
+
+ [createElement("fooெ:foo") in XML document]
+ expected: FAIL
+
+ [createElement("fooெ:foo") in XHTML document]
+ expected: FAIL
+
+ [createElement("xml") in XML document]
+ expected: FAIL
+
+ [createElement("xml") in XHTML document]
+ expected: FAIL
+
+ [createElement("xmlns") in XML document]
+ expected: FAIL
+
+ [createElement("xmlns") in XHTML document]
+ expected: FAIL
+
+ [createElement("xmlfoo") in XML document]
+ expected: FAIL
+
+ [createElement("xmlfoo") in XHTML document]
+ expected: FAIL
+
+ [createElement("xml:foo") in XML document]
+ expected: FAIL
+
+ [createElement("xml:foo") in XHTML document]
+ expected: FAIL
+
+ [createElement("xmlns:foo") in XML document]
+ expected: FAIL
+
+ [createElement("xmlns:foo") in XHTML document]
+ expected: FAIL
+
+ [createElement("xmlfoo:bar") in XML document]
+ expected: FAIL
+
+ [createElement("xmlfoo:bar") in XHTML document]
+ expected: FAIL
+
+ [createElement("svg") in XML document]
+ expected: FAIL
+
+ [createElement("svg") in XHTML document]
+ expected: FAIL
+
+ [createElement("math") in XML document]
+ expected: FAIL
+
+ [createElement("math") in XHTML document]
+ expected: FAIL
+
+ [createElement("FOO") in XML document]
+ expected: FAIL
+
+ [createElement("FOO") in XHTML document]
+ expected: FAIL
+
+ [createElement("marK") in XML document]
+ expected: FAIL
+
+ [createElement("marK") in XHTML document]
+ expected: FAIL
+
+ [createElement("İnput") in XML document]
+ expected: FAIL
+
+ [createElement("İnput") in XHTML document]
+ expected: FAIL
+
+ [createElement("ınput") in XML document]
+ expected: FAIL
+
+ [createElement("ınput") in XHTML document]
+ expected: FAIL
+
+ [createElement("") in XML document]
+ expected: FAIL
+
+ [createElement("1foo") in XML document]
+ expected: FAIL
+
+ [createElement("1:foo") in XML document]
+ expected: FAIL
+
+ [createElement("fo o") in XML document]
+ expected: FAIL
+
+ [createElement("ெfoo") in HTML document]
+ expected: FAIL
+
+ [createElement("ெfoo") in XML document]
+ expected: FAIL
+
+ [createElement("ெfoo") in XHTML document]
+ expected: FAIL
+
+ [createElement("}foo") in XML document]
+ expected: FAIL
+
+ [createElement("f}oo") in XML document]
+ expected: FAIL
+
+ [createElement("foo}") in XML document]
+ expected: FAIL
+
+ [createElement("\\ufffffoo") in XML document]
+ expected: FAIL
+
+ [createElement("f\\uffffoo") in XML document]
+ expected: FAIL
+
+ [createElement("foo\\uffff") in XML document]
+ expected: FAIL
+
+ [createElement("<foo") in XML document]
+ expected: FAIL
+
+ [createElement("foo>") in XML document]
+ expected: FAIL
+
+ [createElement("<foo>") in XML document]
+ expected: FAIL
+
+ [createElement("f<oo") in XML document]
+ expected: FAIL
+
+ [createElement("-foo") in XML document]
+ expected: FAIL
+
+ [createElement(".foo") in XML document]
+ expected: FAIL
+
+ [createElement("ெ") in HTML document]
+ expected: FAIL
+
+ [createElement("ெ") in XML document]
+ expected: FAIL
+
+ [createElement("ெ") in XHTML document]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/nodes/Document-createElementNS.html.ini b/tests/wpt/metadata/dom/nodes/Document-createElementNS.html.ini
new file mode 100644
index 00000000000..ff6e62d0bf1
--- /dev/null
+++ b/tests/wpt/metadata/dom/nodes/Document-createElementNS.html.ini
@@ -0,0 +1,596 @@
+[Document-createElementNS.html]
+ type: testharness
+ [createElementNS test in XML document: null,null,null]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,undefined,null]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"foo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"1foo","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"f1oo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"foo1",null]
+ expected: FAIL
+
+ [createElementNS test in HTML document: null,"ெfoo","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"ெfoo","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XHTML document: null,"ெfoo","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"}foo","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"f}oo","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"foo}","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"\\ufffffoo","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"f\\uffffoo","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"foo\\uffff","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"<foo","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"foo>","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"<foo>","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"f<oo","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"^^","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"fo o","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"-foo","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,".foo","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,":foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"f:oo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"foo:","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"f:o:o","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,":","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"xml",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"xmlns","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"xmlfoo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"xml:foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"xmlns:foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"xmlfoo:bar","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"null:xml","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "",null,null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "",":foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "","f:oo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "","foo:","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: undefined,null,null]
+ expected: FAIL
+
+ [createElementNS test in XML document: undefined,undefined,null]
+ expected: FAIL
+
+ [createElementNS test in XML document: undefined,"foo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: undefined,"1foo","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: undefined,"f1oo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: undefined,"foo1",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: undefined,":foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: undefined,"f:oo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: undefined,"foo:","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: undefined,"f::oo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: undefined,"xml",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: undefined,"xmlns","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: undefined,"xmlfoo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: undefined,"xml:foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: undefined,"xmlns:foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: undefined,"xmlfoo:bar","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","foo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","1foo","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","<foo>","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","fo<o","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","-foo","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/",".foo","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","f1oo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","foo1",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/",":foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","f:oo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","f:o:o","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","foo:","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","f::oo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in HTML document: "http://example.com/","a:0","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","a:0","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XHTML document: "http://example.com/","a:0","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","0:a","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","a:_",null]
+ expected: FAIL
+
+ [createElementNS test in HTML document: "http://example.com/","a:ெ","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","a:ெ","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XHTML document: "http://example.com/","a:ெ","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in HTML document: "http://example.com/","ெ:a","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","ெ:a","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XHTML document: "http://example.com/","ெ:a","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","a:aெ",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","aெ:a",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","xml:test","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","xmlns:test","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","test:xmlns",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","xmlns","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","_:_",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","_:h0",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","_:test",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","l_:_",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","ns:_0",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","ns:a0",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","ns0:test",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","a.b:c",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","a-b:c",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","xml",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","XMLNS",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","xmlfoo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","xml:foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","XML:foo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","xmlns:foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","XMLNS:foo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","xmlfoo:bar",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","prefix::local","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:{","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:}","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:~","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:'","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:!","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:@","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:#","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:$","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:%","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:^","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:&","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:*","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:(","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:)","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:+","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:=","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:[","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:\]","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:\\\\","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:/","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:;","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:`","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:<","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:>","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:,","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:a ","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","namespaceURI:\\"","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "/","foo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "/","1foo","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "/","f1oo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "/","foo1",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "/",":foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "/","f:oo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "/","foo:","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "/","xml",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "/","xmlns","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "/","xmlfoo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "/","xml:foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "/","xmlns:foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "/","xmlfoo:bar",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/XML/1998/namespace","foo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/XML/1998/namespace","1foo","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/XML/1998/namespace","f1oo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/XML/1998/namespace","foo1",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/XML/1998/namespace",":foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/XML/1998/namespace","f:oo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/XML/1998/namespace","foo:","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/XML/1998/namespace","xml",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/XML/1998/namespace","xmlns","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/XML/1998/namespace","xmlfoo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/XML/1998/namespace","xml:foo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/XML/1998/namespace","xmlns:foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/XML/1998/namespace","xmlfoo:bar",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/XML/1998/namespaces","xml:foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/xml/1998/namespace","xml:foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/2000/xmlns/","foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/2000/xmlns/","1foo","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/2000/xmlns/","f1oo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/2000/xmlns/","foo1","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/2000/xmlns/",":foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/2000/xmlns/","f:oo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/2000/xmlns/","foo:","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/2000/xmlns/","xml","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/2000/xmlns/","xmlns",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/2000/xmlns/","xmlfoo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/2000/xmlns/","xml:foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/2000/xmlns/","xmlns:foo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/2000/xmlns/","xmlfoo:bar","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/2000/xmlns/","foo:xmlns","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "foo:","foo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "foo:","1foo","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "foo:","f1oo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "foo:","foo1",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "foo:",":foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "foo:","f:oo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "foo:","foo:","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "foo:","xml",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "foo:","xmlns","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "foo:","xmlfoo",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "foo:","xml:foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "foo:","xmlns:foo","NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "foo:","xmlfoo:bar",null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "","","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: null,"","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: undefined,"","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/",null,null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://example.com/","","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "/",null,null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "/","","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/XML/1998/namespace",null,null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/XML/1998/namespace","","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/2000/xmlns/",null,"NAMESPACE_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "http://www.w3.org/2000/xmlns/","","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
+ [createElementNS test in XML document: "foo:",null,null]
+ expected: FAIL
+
+ [createElementNS test in XML document: "foo:","","INVALID_CHARACTER_ERR"]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/nodes/Element-matches.html.ini b/tests/wpt/metadata/dom/nodes/Element-matches.html.ini
index eb4e7150cb8..a142fe86bf4 100644
--- a/tests/wpt/metadata/dom/nodes/Element-matches.html.ini
+++ b/tests/wpt/metadata/dom/nodes/Element-matches.html.ini
@@ -51,3 +51,69 @@
[In-document Element.matches: ID selector, matching id values using non-ASCII characters (with no refNodes): #台北Táiběi, #台北]
expected: FAIL
+ [In-document Element.matches: Descendant combinator '>>', matching element that is a descendant of an element with id (with no refNodes): #descendant>>div]
+ expected: FAIL
+
+ [In-document Element.matches: Descendant combinator '>>', matching element with id that is a descendant of an element (with no refNodes): body>>#descendant-div1]
+ expected: FAIL
+
+ [In-document Element.matches: Descendant combinator '>>', matching element with id that is a descendant of an element (with no refNodes): div>>#descendant-div1]
+ expected: FAIL
+
+ [In-document Element.matches: Descendant combinator '>>', matching element with id that is a descendant of an element with id (with no refNodes): #descendant>>#descendant-div2]
+ expected: FAIL
+
+ [In-document Element.matches: Descendant combinator '>>', matching element with class that is a descendant of an element with id (with no refNodes): #descendant>>.descendant-div2]
+ expected: FAIL
+
+ [In-document Element.matches: Descendant combinator '>>', matching element with class that is a descendant of an element with class (with no refNodes): .descendant-div1>>.descendant-div3]
+ expected: FAIL
+
+ [Detached Element.matches: Descendant combinator '>>', matching element that is a descendant of an element with id (with no refNodes): #descendant>>div]
+ expected: FAIL
+
+ [Detached Element.matches: Descendant combinator '>>', matching element with id that is a descendant of an element (with no refNodes): div>>#descendant-div1]
+ expected: FAIL
+
+ [Detached Element.matches: Descendant combinator '>>', matching element with id that is a descendant of an element with id (with no refNodes): #descendant>>#descendant-div2]
+ expected: FAIL
+
+ [Detached Element.matches: Descendant combinator '>>', matching element with class that is a descendant of an element with id (with no refNodes): #descendant>>.descendant-div2]
+ expected: FAIL
+
+ [Detached Element.matches: Descendant combinator '>>', matching element with class that is a descendant of an element with class (with no refNodes): .descendant-div1>>.descendant-div3]
+ expected: FAIL
+
+ [Fragment Element.matches: Descendant combinator '>>', matching element that is a descendant of an element with id (with no refNodes): #descendant>>div]
+ expected: FAIL
+
+ [Fragment Element.matches: Descendant combinator '>>', matching element with id that is a descendant of an element (with no refNodes): div>>#descendant-div1]
+ expected: FAIL
+
+ [Fragment Element.matches: Descendant combinator '>>', matching element with id that is a descendant of an element with id (with no refNodes): #descendant>>#descendant-div2]
+ expected: FAIL
+
+ [Fragment Element.matches: Descendant combinator '>>', matching element with class that is a descendant of an element with id (with no refNodes): #descendant>>.descendant-div2]
+ expected: FAIL
+
+ [Fragment Element.matches: Descendant combinator '>>', matching element with class that is a descendant of an element with class (with no refNodes): .descendant-div1>>.descendant-div3]
+ expected: FAIL
+
+ [In-document Element.matches: Descendant combinator '>>', matching element that is a descendant of an element with id (1) (with no refNodes): #descendant>>div]
+ expected: FAIL
+
+ [In-document Element.matches: Descendant combinator '>>', matching element with id that is a descendant of an element (1) (with no refNodes): body>>#descendant-div1]
+ expected: FAIL
+
+ [In-document Element.matches: Descendant combinator '>>', matching element with id that is a descendant of an element (1) (with no refNodes): div>>#descendant-div1]
+ expected: FAIL
+
+ [In-document Element.matches: Descendant combinator '>>', matching element with id that is a descendant of an element with id (1) (with no refNodes): #descendant>>#descendant-div2]
+ expected: FAIL
+
+ [In-document Element.matches: Descendant combinator '>>', matching element with class that is a descendant of an element with id (1) (with no refNodes): #descendant>>.descendant-div2]
+ expected: FAIL
+
+ [In-document Element.matches: Descendant combinator, '>>', matching element with class that is a descendant of an element with class (1) (with no refNodes): .descendant-div1>>.descendant-div3]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/nodes/ParentNode-querySelector-All-xht.xht.ini b/tests/wpt/metadata/dom/nodes/ParentNode-querySelector-All-xht.xht.ini
index bf9ca1b19c3..e7b0b183659 100644
--- a/tests/wpt/metadata/dom/nodes/ParentNode-querySelector-All-xht.xht.ini
+++ b/tests/wpt/metadata/dom/nodes/ParentNode-querySelector-All-xht.xht.ini
@@ -216,3 +216,159 @@
[In-document Element.querySelector: ::first-letter pseudo-element (two-colon syntax) selector, not matching any elements: #pseudo-element::first-letter]
expected: FAIL
+ [Document.querySelectorAll: Descendant combinator '>>', matching element that is a descendant of an element with id: #descendant>>div]
+ expected: FAIL
+
+ [Document.querySelector: Descendant combinator '>>', matching element that is a descendant of an element with id: #descendant>>div]
+ expected: FAIL
+
+ [Document.querySelectorAll: Descendant combinator '>>', matching element with id that is a descendant of an element: body>>#descendant-div1]
+ expected: FAIL
+
+ [Document.querySelector: Descendant combinator '>>', matching element with id that is a descendant of an element: body>>#descendant-div1]
+ expected: FAIL
+
+ [Document.querySelectorAll: Descendant combinator '>>', matching element with id that is a descendant of an element: div>>#descendant-div1]
+ expected: FAIL
+
+ [Document.querySelector: Descendant combinator '>>', matching element with id that is a descendant of an element: div>>#descendant-div1]
+ expected: FAIL
+
+ [Document.querySelectorAll: Descendant combinator '>>', matching element with id that is a descendant of an element with id: #descendant>>#descendant-div2]
+ expected: FAIL
+
+ [Document.querySelector: Descendant combinator '>>', matching element with id that is a descendant of an element with id: #descendant>>#descendant-div2]
+ expected: FAIL
+
+ [Document.querySelectorAll: Descendant combinator '>>', matching element with class that is a descendant of an element with id: #descendant>>.descendant-div2]
+ expected: FAIL
+
+ [Document.querySelector: Descendant combinator '>>', matching element with class that is a descendant of an element with id: #descendant>>.descendant-div2]
+ expected: FAIL
+
+ [Document.querySelectorAll: Descendant combinator '>>', matching element with class that is a descendant of an element with class: .descendant-div1>>.descendant-div3]
+ expected: FAIL
+
+ [Document.querySelector: Descendant combinator '>>', matching element with class that is a descendant of an element with class: .descendant-div1>>.descendant-div3]
+ expected: FAIL
+
+ [Document.querySelectorAll: Descendant combinator '>>', not matching element with id that is not a descendant of an element with id: #descendant-div1>>#descendant-div4]
+ expected: FAIL
+
+ [Document.querySelector: Descendant combinator '>>', not matching element with id that is not a descendant of an element with id: #descendant-div1>>#descendant-div4]
+ expected: FAIL
+
+ [Detached Element.querySelectorAll: Descendant combinator '>>', matching element that is a descendant of an element with id: #descendant>>div]
+ expected: FAIL
+
+ [Detached Element.querySelector: Descendant combinator '>>', matching element that is a descendant of an element with id: #descendant>>div]
+ expected: FAIL
+
+ [Detached Element.querySelectorAll: Descendant combinator '>>', matching element with id that is a descendant of an element: div>>#descendant-div1]
+ expected: FAIL
+
+ [Detached Element.querySelector: Descendant combinator '>>', matching element with id that is a descendant of an element: div>>#descendant-div1]
+ expected: FAIL
+
+ [Detached Element.querySelectorAll: Descendant combinator '>>', matching element with id that is a descendant of an element with id: #descendant>>#descendant-div2]
+ expected: FAIL
+
+ [Detached Element.querySelector: Descendant combinator '>>', matching element with id that is a descendant of an element with id: #descendant>>#descendant-div2]
+ expected: FAIL
+
+ [Detached Element.querySelectorAll: Descendant combinator '>>', matching element with class that is a descendant of an element with id: #descendant>>.descendant-div2]
+ expected: FAIL
+
+ [Detached Element.querySelector: Descendant combinator '>>', matching element with class that is a descendant of an element with id: #descendant>>.descendant-div2]
+ expected: FAIL
+
+ [Detached Element.querySelectorAll: Descendant combinator '>>', matching element with class that is a descendant of an element with class: .descendant-div1>>.descendant-div3]
+ expected: FAIL
+
+ [Detached Element.querySelector: Descendant combinator '>>', matching element with class that is a descendant of an element with class: .descendant-div1>>.descendant-div3]
+ expected: FAIL
+
+ [Detached Element.querySelectorAll: Descendant combinator '>>', not matching element with id that is not a descendant of an element with id: #descendant-div1>>#descendant-div4]
+ expected: FAIL
+
+ [Detached Element.querySelector: Descendant combinator '>>', not matching element with id that is not a descendant of an element with id: #descendant-div1>>#descendant-div4]
+ expected: FAIL
+
+ [Fragment.querySelectorAll: Descendant combinator '>>', matching element that is a descendant of an element with id: #descendant>>div]
+ expected: FAIL
+
+ [Fragment.querySelector: Descendant combinator '>>', matching element that is a descendant of an element with id: #descendant>>div]
+ expected: FAIL
+
+ [Fragment.querySelectorAll: Descendant combinator '>>', matching element with id that is a descendant of an element: div>>#descendant-div1]
+ expected: FAIL
+
+ [Fragment.querySelector: Descendant combinator '>>', matching element with id that is a descendant of an element: div>>#descendant-div1]
+ expected: FAIL
+
+ [Fragment.querySelectorAll: Descendant combinator '>>', matching element with id that is a descendant of an element with id: #descendant>>#descendant-div2]
+ expected: FAIL
+
+ [Fragment.querySelector: Descendant combinator '>>', matching element with id that is a descendant of an element with id: #descendant>>#descendant-div2]
+ expected: FAIL
+
+ [Fragment.querySelectorAll: Descendant combinator '>>', matching element with class that is a descendant of an element with id: #descendant>>.descendant-div2]
+ expected: FAIL
+
+ [Fragment.querySelector: Descendant combinator '>>', matching element with class that is a descendant of an element with id: #descendant>>.descendant-div2]
+ expected: FAIL
+
+ [Fragment.querySelectorAll: Descendant combinator '>>', matching element with class that is a descendant of an element with class: .descendant-div1>>.descendant-div3]
+ expected: FAIL
+
+ [Fragment.querySelector: Descendant combinator '>>', matching element with class that is a descendant of an element with class: .descendant-div1>>.descendant-div3]
+ expected: FAIL
+
+ [Fragment.querySelectorAll: Descendant combinator '>>', not matching element with id that is not a descendant of an element with id: #descendant-div1>>#descendant-div4]
+ expected: FAIL
+
+ [Fragment.querySelector: Descendant combinator '>>', not matching element with id that is not a descendant of an element with id: #descendant-div1>>#descendant-div4]
+ expected: FAIL
+
+ [In-document Element.querySelectorAll: Descendant combinator '>>', matching element that is a descendant of an element with id: #descendant>>div]
+ expected: FAIL
+
+ [In-document Element.querySelector: Descendant combinator '>>', matching element that is a descendant of an element with id: #descendant>>div]
+ expected: FAIL
+
+ [In-document Element.querySelectorAll: Descendant combinator '>>', matching element with id that is a descendant of an element: body>>#descendant-div1]
+ expected: FAIL
+
+ [In-document Element.querySelector: Descendant combinator '>>', matching element with id that is a descendant of an element: body>>#descendant-div1]
+ expected: FAIL
+
+ [In-document Element.querySelectorAll: Descendant combinator '>>', matching element with id that is a descendant of an element: div>>#descendant-div1]
+ expected: FAIL
+
+ [In-document Element.querySelector: Descendant combinator '>>', matching element with id that is a descendant of an element: div>>#descendant-div1]
+ expected: FAIL
+
+ [In-document Element.querySelectorAll: Descendant combinator '>>', matching element with id that is a descendant of an element with id: #descendant>>#descendant-div2]
+ expected: FAIL
+
+ [In-document Element.querySelector: Descendant combinator '>>', matching element with id that is a descendant of an element with id: #descendant>>#descendant-div2]
+ expected: FAIL
+
+ [In-document Element.querySelectorAll: Descendant combinator '>>', matching element with class that is a descendant of an element with id: #descendant>>.descendant-div2]
+ expected: FAIL
+
+ [In-document Element.querySelector: Descendant combinator '>>', matching element with class that is a descendant of an element with id: #descendant>>.descendant-div2]
+ expected: FAIL
+
+ [In-document Element.querySelectorAll: Descendant combinator '>>', matching element with class that is a descendant of an element with class: .descendant-div1>>.descendant-div3]
+ expected: FAIL
+
+ [In-document Element.querySelector: Descendant combinator '>>', matching element with class that is a descendant of an element with class: .descendant-div1>>.descendant-div3]
+ expected: FAIL
+
+ [In-document Element.querySelectorAll: Descendant combinator '>>', not matching element with id that is not a descendant of an element with id: #descendant-div1>>#descendant-div4]
+ expected: FAIL
+
+ [In-document Element.querySelector: Descendant combinator '>>', not matching element with id that is not a descendant of an element with id: #descendant-div1>>#descendant-div4]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/nodes/ParentNode-querySelector-All.html.ini b/tests/wpt/metadata/dom/nodes/ParentNode-querySelector-All.html.ini
index fee1e0a7f3c..4da980298cb 100644
--- a/tests/wpt/metadata/dom/nodes/ParentNode-querySelector-All.html.ini
+++ b/tests/wpt/metadata/dom/nodes/ParentNode-querySelector-All.html.ini
@@ -216,3 +216,159 @@
[In-document Element.querySelector: ::first-letter pseudo-element (two-colon syntax) selector, not matching any elements: #pseudo-element::first-letter]
expected: FAIL
+ [Document.querySelectorAll: Descendant combinator '>>', matching element that is a descendant of an element with id: #descendant>>div]
+ expected: FAIL
+
+ [Document.querySelector: Descendant combinator '>>', matching element that is a descendant of an element with id: #descendant>>div]
+ expected: FAIL
+
+ [Document.querySelectorAll: Descendant combinator '>>', matching element with id that is a descendant of an element: body>>#descendant-div1]
+ expected: FAIL
+
+ [Document.querySelector: Descendant combinator '>>', matching element with id that is a descendant of an element: body>>#descendant-div1]
+ expected: FAIL
+
+ [Document.querySelectorAll: Descendant combinator '>>', matching element with id that is a descendant of an element: div>>#descendant-div1]
+ expected: FAIL
+
+ [Document.querySelector: Descendant combinator '>>', matching element with id that is a descendant of an element: div>>#descendant-div1]
+ expected: FAIL
+
+ [Document.querySelectorAll: Descendant combinator '>>', matching element with id that is a descendant of an element with id: #descendant>>#descendant-div2]
+ expected: FAIL
+
+ [Document.querySelector: Descendant combinator '>>', matching element with id that is a descendant of an element with id: #descendant>>#descendant-div2]
+ expected: FAIL
+
+ [Document.querySelectorAll: Descendant combinator '>>', matching element with class that is a descendant of an element with id: #descendant>>.descendant-div2]
+ expected: FAIL
+
+ [Document.querySelector: Descendant combinator '>>', matching element with class that is a descendant of an element with id: #descendant>>.descendant-div2]
+ expected: FAIL
+
+ [Document.querySelectorAll: Descendant combinator '>>', matching element with class that is a descendant of an element with class: .descendant-div1>>.descendant-div3]
+ expected: FAIL
+
+ [Document.querySelector: Descendant combinator '>>', matching element with class that is a descendant of an element with class: .descendant-div1>>.descendant-div3]
+ expected: FAIL
+
+ [Document.querySelectorAll: Descendant combinator '>>', not matching element with id that is not a descendant of an element with id: #descendant-div1>>#descendant-div4]
+ expected: FAIL
+
+ [Document.querySelector: Descendant combinator '>>', not matching element with id that is not a descendant of an element with id: #descendant-div1>>#descendant-div4]
+ expected: FAIL
+
+ [Detached Element.querySelectorAll: Descendant combinator '>>', matching element that is a descendant of an element with id: #descendant>>div]
+ expected: FAIL
+
+ [Detached Element.querySelector: Descendant combinator '>>', matching element that is a descendant of an element with id: #descendant>>div]
+ expected: FAIL
+
+ [Detached Element.querySelectorAll: Descendant combinator '>>', matching element with id that is a descendant of an element: div>>#descendant-div1]
+ expected: FAIL
+
+ [Detached Element.querySelector: Descendant combinator '>>', matching element with id that is a descendant of an element: div>>#descendant-div1]
+ expected: FAIL
+
+ [Detached Element.querySelectorAll: Descendant combinator '>>', matching element with id that is a descendant of an element with id: #descendant>>#descendant-div2]
+ expected: FAIL
+
+ [Detached Element.querySelector: Descendant combinator '>>', matching element with id that is a descendant of an element with id: #descendant>>#descendant-div2]
+ expected: FAIL
+
+ [Detached Element.querySelectorAll: Descendant combinator '>>', matching element with class that is a descendant of an element with id: #descendant>>.descendant-div2]
+ expected: FAIL
+
+ [Detached Element.querySelector: Descendant combinator '>>', matching element with class that is a descendant of an element with id: #descendant>>.descendant-div2]
+ expected: FAIL
+
+ [Detached Element.querySelectorAll: Descendant combinator '>>', matching element with class that is a descendant of an element with class: .descendant-div1>>.descendant-div3]
+ expected: FAIL
+
+ [Detached Element.querySelector: Descendant combinator '>>', matching element with class that is a descendant of an element with class: .descendant-div1>>.descendant-div3]
+ expected: FAIL
+
+ [Detached Element.querySelectorAll: Descendant combinator '>>', not matching element with id that is not a descendant of an element with id: #descendant-div1>>#descendant-div4]
+ expected: FAIL
+
+ [Detached Element.querySelector: Descendant combinator '>>', not matching element with id that is not a descendant of an element with id: #descendant-div1>>#descendant-div4]
+ expected: FAIL
+
+ [Fragment.querySelectorAll: Descendant combinator '>>', matching element that is a descendant of an element with id: #descendant>>div]
+ expected: FAIL
+
+ [Fragment.querySelector: Descendant combinator '>>', matching element that is a descendant of an element with id: #descendant>>div]
+ expected: FAIL
+
+ [Fragment.querySelectorAll: Descendant combinator '>>', matching element with id that is a descendant of an element: div>>#descendant-div1]
+ expected: FAIL
+
+ [Fragment.querySelector: Descendant combinator '>>', matching element with id that is a descendant of an element: div>>#descendant-div1]
+ expected: FAIL
+
+ [Fragment.querySelectorAll: Descendant combinator '>>', matching element with id that is a descendant of an element with id: #descendant>>#descendant-div2]
+ expected: FAIL
+
+ [Fragment.querySelector: Descendant combinator '>>', matching element with id that is a descendant of an element with id: #descendant>>#descendant-div2]
+ expected: FAIL
+
+ [Fragment.querySelectorAll: Descendant combinator '>>', matching element with class that is a descendant of an element with id: #descendant>>.descendant-div2]
+ expected: FAIL
+
+ [Fragment.querySelector: Descendant combinator '>>', matching element with class that is a descendant of an element with id: #descendant>>.descendant-div2]
+ expected: FAIL
+
+ [Fragment.querySelectorAll: Descendant combinator '>>', matching element with class that is a descendant of an element with class: .descendant-div1>>.descendant-div3]
+ expected: FAIL
+
+ [Fragment.querySelector: Descendant combinator '>>', matching element with class that is a descendant of an element with class: .descendant-div1>>.descendant-div3]
+ expected: FAIL
+
+ [Fragment.querySelectorAll: Descendant combinator '>>', not matching element with id that is not a descendant of an element with id: #descendant-div1>>#descendant-div4]
+ expected: FAIL
+
+ [Fragment.querySelector: Descendant combinator '>>', not matching element with id that is not a descendant of an element with id: #descendant-div1>>#descendant-div4]
+ expected: FAIL
+
+ [In-document Element.querySelectorAll: Descendant combinator '>>', matching element that is a descendant of an element with id: #descendant>>div]
+ expected: FAIL
+
+ [In-document Element.querySelector: Descendant combinator '>>', matching element that is a descendant of an element with id: #descendant>>div]
+ expected: FAIL
+
+ [In-document Element.querySelectorAll: Descendant combinator '>>', matching element with id that is a descendant of an element: body>>#descendant-div1]
+ expected: FAIL
+
+ [In-document Element.querySelector: Descendant combinator '>>', matching element with id that is a descendant of an element: body>>#descendant-div1]
+ expected: FAIL
+
+ [In-document Element.querySelectorAll: Descendant combinator '>>', matching element with id that is a descendant of an element: div>>#descendant-div1]
+ expected: FAIL
+
+ [In-document Element.querySelector: Descendant combinator '>>', matching element with id that is a descendant of an element: div>>#descendant-div1]
+ expected: FAIL
+
+ [In-document Element.querySelectorAll: Descendant combinator '>>', matching element with id that is a descendant of an element with id: #descendant>>#descendant-div2]
+ expected: FAIL
+
+ [In-document Element.querySelector: Descendant combinator '>>', matching element with id that is a descendant of an element with id: #descendant>>#descendant-div2]
+ expected: FAIL
+
+ [In-document Element.querySelectorAll: Descendant combinator '>>', matching element with class that is a descendant of an element with id: #descendant>>.descendant-div2]
+ expected: FAIL
+
+ [In-document Element.querySelector: Descendant combinator '>>', matching element with class that is a descendant of an element with id: #descendant>>.descendant-div2]
+ expected: FAIL
+
+ [In-document Element.querySelectorAll: Descendant combinator '>>', matching element with class that is a descendant of an element with class: .descendant-div1>>.descendant-div3]
+ expected: FAIL
+
+ [In-document Element.querySelector: Descendant combinator '>>', matching element with class that is a descendant of an element with class: .descendant-div1>>.descendant-div3]
+ expected: FAIL
+
+ [In-document Element.querySelectorAll: Descendant combinator '>>', not matching element with id that is not a descendant of an element with id: #descendant-div1>>#descendant-div4]
+ expected: FAIL
+
+ [In-document Element.querySelector: Descendant combinator '>>', not matching element with id that is not a descendant of an element with id: #descendant-div1>>#descendant-div4]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/ranges/Range-mutations-appendChild.html.ini b/tests/wpt/metadata/dom/ranges/Range-mutations-appendChild.html.ini
new file mode 100644
index 00000000000..4cc4866cf8a
--- /dev/null
+++ b/tests/wpt/metadata/dom/ranges/Range-mutations-appendChild.html.ini
@@ -0,0 +1,107 @@
+[Range-mutations-appendChild.html]
+ type: testharness
+ [testDiv.appendChild(testDiv.lastChild), with selected range collapsed at (testDiv.lastChild, 0)]
+ expected: FAIL
+
+ [testDiv.appendChild(testDiv.lastChild), with selected range on testDiv.lastChild from 0 to 1]
+ expected: FAIL
+
+ [testDiv.appendChild(testDiv.lastChild), with selected range collapsed at (testDiv.lastChild, 1)]
+ expected: FAIL
+
+ [testDiv.appendChild(testDiv.lastChild), with selected range on testDiv from testDiv.childNodes.length - 2 to testDiv.childNodes.length]
+ expected: FAIL
+
+ [testDiv.appendChild(testDiv.lastChild), with selected range on testDiv from testDiv.childNodes.length - 2 to testDiv.childNodes.length - 1]
+ expected: FAIL
+
+ [testDiv.appendChild(testDiv.lastChild), with selected range on testDiv from testDiv.childNodes.length - 1 to testDiv.childNodes.length]
+ expected: FAIL
+
+ [testDiv.appendChild(testDiv.lastChild), with selected range collapsed at (testDiv, testDiv.childNodes.length - 1)]
+ expected: FAIL
+
+ [testDiv.appendChild(testDiv.lastChild), with selected range collapsed at (testDiv, testDiv.childNodes.length)]
+ expected: FAIL
+
+ [detachedDiv.appendChild(detachedDiv.lastChild), with selected range collapsed at (detachedDiv.lastChild, 0)]
+ expected: FAIL
+
+ [detachedDiv.appendChild(detachedDiv.lastChild), with selected range on detachedDiv.lastChild from 0 to 1]
+ expected: FAIL
+
+ [detachedDiv.appendChild(detachedDiv.lastChild), with selected range collapsed at (detachedDiv.lastChild, 1)]
+ expected: FAIL
+
+ [detachedDiv.appendChild(detachedDiv.lastChild), with selected range on detachedDiv from detachedDiv.childNodes.length - 2 to detachedDiv.childNodes.length]
+ expected: FAIL
+
+ [detachedDiv.appendChild(detachedDiv.lastChild), with selected range on detachedDiv from detachedDiv.childNodes.length - 2 to detachedDiv.childNodes.length - 1]
+ expected: FAIL
+
+ [detachedDiv.appendChild(detachedDiv.lastChild), with selected range on detachedDiv from detachedDiv.childNodes.length - 1 to detachedDiv.childNodes.length]
+ expected: FAIL
+
+ [detachedDiv.appendChild(detachedDiv.lastChild), with selected range collapsed at (detachedDiv, detachedDiv.childNodes.length - 1)]
+ expected: FAIL
+
+ [detachedDiv.appendChild(detachedDiv.lastChild), with selected range collapsed at (detachedDiv, detachedDiv.childNodes.length)]
+ expected: FAIL
+
+ [paras[0\].appendChild(paras[1\]), with selected range collapsed at (paras[0\], 0)]
+ expected: FAIL
+
+ [paras[0\].appendChild(paras[1\]), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].appendChild(paras[1\]), with selected range collapsed at (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].appendChild(paras[1\]), with selected range on testDiv from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].appendChild(paras[1\]), with selected range on testDiv from 0 to 2]
+ expected: FAIL
+
+ [paras[0\].appendChild(paras[1\]), with selected range collapsed at (testDiv, 1)]
+ expected: FAIL
+
+ [paras[0\].appendChild(paras[1\]), with selected range on testDiv from 1 to 2]
+ expected: FAIL
+
+ [foreignDoc.appendChild(detachedComment), with selected range on foreignDoc from foreignDoc.childNodes.length - 1 to foreignDoc.childNodes.length]
+ expected: FAIL
+
+ [foreignDoc.appendChild(detachedComment), with selected range collapsed at (foreignDoc, foreignDoc.childNodes.length - 1)]
+ expected: FAIL
+
+ [foreignDoc.appendChild(detachedComment), with selected range collapsed at (foreignDoc, foreignDoc.childNodes.length)]
+ expected: FAIL
+
+ [foreignDoc.appendChild(detachedComment), with selected range on detachedComment from 0 to 5]
+ expected: FAIL
+
+ [paras[0\].appendChild(xmlTextNode), with selected range collapsed at (paras[0\], 0)]
+ expected: FAIL
+
+ [paras[0\].appendChild(xmlTextNode), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].appendChild(xmlTextNode), with selected range collapsed at (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].appendChild(paras[0\]), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].appendChild(testDiv), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].appendChild(document), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].appendChild(foreignDoc), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].appendChild(document.doctype), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/ranges/Range-mutations-appendData.html.ini b/tests/wpt/metadata/dom/ranges/Range-mutations-appendData.html.ini
new file mode 100644
index 00000000000..915229970ab
--- /dev/null
+++ b/tests/wpt/metadata/dom/ranges/Range-mutations-appendData.html.ini
@@ -0,0 +1,578 @@
+[Range-mutations-appendData.html]
+ type: testharness
+ [paras[0\].firstChild.appendData("foo"), with selected range on paras[0\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData("foo"), with selected range collapsed at (paras[0\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData("foo"), with selected range collapsed at (paras[0\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData("foo"), with selected range on paras[0\].firstChild from 0 to paras[0\].firstChild.length]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData("foo"), with selected range on paras[0\].firstChild from 1 to paras[0\].firstChild.length]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData("foo"), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData("foo"), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData(""), with selected range on paras[0\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData(""), with selected range collapsed at (paras[0\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData(""), with selected range collapsed at (paras[0\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData(""), with selected range on paras[0\].firstChild from 0 to paras[0\].firstChild.length]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData(""), with selected range on paras[0\].firstChild from 1 to paras[0\].firstChild.length]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData(""), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData(""), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.appendData("foo"), with selected range on paras[1\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[1\].firstChild.appendData("foo"), with selected range collapsed at (paras[1\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[1\].firstChild.appendData("foo"), with selected range collapsed at (paras[1\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[1\].firstChild.appendData("foo"), with selected range on paras[1\].firstChild from 0 to paras[1\].firstChild.length]
+ expected: FAIL
+
+ [paras[1\].firstChild.appendData("foo"), with selected range on paras[1\].firstChild from 1 to paras[1\].firstChild.length]
+ expected: FAIL
+
+ [paras[1\].firstChild.appendData("foo"), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
+ expected: FAIL
+
+ [paras[1\].firstChild.appendData("foo"), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.appendData(""), with selected range on paras[1\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[1\].firstChild.appendData(""), with selected range collapsed at (paras[1\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[1\].firstChild.appendData(""), with selected range collapsed at (paras[1\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[1\].firstChild.appendData(""), with selected range on paras[1\].firstChild from 0 to paras[1\].firstChild.length]
+ expected: FAIL
+
+ [paras[1\].firstChild.appendData(""), with selected range on paras[1\].firstChild from 1 to paras[1\].firstChild.length]
+ expected: FAIL
+
+ [paras[1\].firstChild.appendData(""), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
+ expected: FAIL
+
+ [paras[1\].firstChild.appendData(""), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.appendData("foo"), with selected range on foreignTextNode from 0 to 1]
+ expected: FAIL
+
+ [foreignTextNode.appendData("foo"), with selected range collapsed at (foreignTextNode, 0)]
+ expected: FAIL
+
+ [foreignTextNode.appendData("foo"), with selected range collapsed at (foreignTextNode, 1)]
+ expected: FAIL
+
+ [foreignTextNode.appendData("foo"), with selected range on foreignTextNode from 0 to foreignTextNode.length]
+ expected: FAIL
+
+ [foreignTextNode.appendData("foo"), with selected range on foreignTextNode from 1 to foreignTextNode.length]
+ expected: FAIL
+
+ [foreignTextNode.appendData("foo"), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
+ expected: FAIL
+
+ [foreignTextNode.appendData("foo"), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.appendData(""), with selected range on foreignTextNode from 0 to 1]
+ expected: FAIL
+
+ [foreignTextNode.appendData(""), with selected range collapsed at (foreignTextNode, 0)]
+ expected: FAIL
+
+ [foreignTextNode.appendData(""), with selected range collapsed at (foreignTextNode, 1)]
+ expected: FAIL
+
+ [foreignTextNode.appendData(""), with selected range on foreignTextNode from 0 to foreignTextNode.length]
+ expected: FAIL
+
+ [foreignTextNode.appendData(""), with selected range on foreignTextNode from 1 to foreignTextNode.length]
+ expected: FAIL
+
+ [foreignTextNode.appendData(""), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
+ expected: FAIL
+
+ [foreignTextNode.appendData(""), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.appendData("foo"), with selected range on xmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [xmlTextNode.appendData("foo"), with selected range collapsed at (xmlTextNode, 0)]
+ expected: FAIL
+
+ [xmlTextNode.appendData("foo"), with selected range collapsed at (xmlTextNode, 1)]
+ expected: FAIL
+
+ [xmlTextNode.appendData("foo"), with selected range on xmlTextNode from 0 to xmlTextNode.length]
+ expected: FAIL
+
+ [xmlTextNode.appendData("foo"), with selected range on xmlTextNode from 1 to xmlTextNode.length]
+ expected: FAIL
+
+ [xmlTextNode.appendData("foo"), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
+ expected: FAIL
+
+ [xmlTextNode.appendData("foo"), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.appendData(""), with selected range on xmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [xmlTextNode.appendData(""), with selected range collapsed at (xmlTextNode, 0)]
+ expected: FAIL
+
+ [xmlTextNode.appendData(""), with selected range collapsed at (xmlTextNode, 1)]
+ expected: FAIL
+
+ [xmlTextNode.appendData(""), with selected range on xmlTextNode from 0 to xmlTextNode.length]
+ expected: FAIL
+
+ [xmlTextNode.appendData(""), with selected range on xmlTextNode from 1 to xmlTextNode.length]
+ expected: FAIL
+
+ [xmlTextNode.appendData(""), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
+ expected: FAIL
+
+ [xmlTextNode.appendData(""), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.appendData("foo"), with selected range on detachedTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedTextNode.appendData("foo"), with selected range collapsed at (detachedTextNode, 0)]
+ expected: FAIL
+
+ [detachedTextNode.appendData("foo"), with selected range collapsed at (detachedTextNode, 1)]
+ expected: FAIL
+
+ [detachedTextNode.appendData("foo"), with selected range on detachedTextNode from 0 to detachedTextNode.length]
+ expected: FAIL
+
+ [detachedTextNode.appendData("foo"), with selected range on detachedTextNode from 1 to detachedTextNode.length]
+ expected: FAIL
+
+ [detachedTextNode.appendData("foo"), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
+ expected: FAIL
+
+ [detachedTextNode.appendData("foo"), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.appendData(""), with selected range on detachedTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedTextNode.appendData(""), with selected range collapsed at (detachedTextNode, 0)]
+ expected: FAIL
+
+ [detachedTextNode.appendData(""), with selected range collapsed at (detachedTextNode, 1)]
+ expected: FAIL
+
+ [detachedTextNode.appendData(""), with selected range on detachedTextNode from 0 to detachedTextNode.length]
+ expected: FAIL
+
+ [detachedTextNode.appendData(""), with selected range on detachedTextNode from 1 to detachedTextNode.length]
+ expected: FAIL
+
+ [detachedTextNode.appendData(""), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
+ expected: FAIL
+
+ [detachedTextNode.appendData(""), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.appendData("foo"), with selected range on detachedForeignTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignTextNode.appendData("foo"), with selected range collapsed at (detachedForeignTextNode, 0)]
+ expected: FAIL
+
+ [detachedForeignTextNode.appendData("foo"), with selected range collapsed at (detachedForeignTextNode, 1)]
+ expected: FAIL
+
+ [detachedForeignTextNode.appendData("foo"), with selected range on detachedForeignTextNode from 0 to detachedForeignTextNode.length]
+ expected: FAIL
+
+ [detachedForeignTextNode.appendData("foo"), with selected range on detachedForeignTextNode from 1 to detachedForeignTextNode.length]
+ expected: FAIL
+
+ [detachedForeignTextNode.appendData("foo"), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
+ expected: FAIL
+
+ [detachedForeignTextNode.appendData("foo"), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.appendData(""), with selected range on detachedForeignTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignTextNode.appendData(""), with selected range collapsed at (detachedForeignTextNode, 0)]
+ expected: FAIL
+
+ [detachedForeignTextNode.appendData(""), with selected range collapsed at (detachedForeignTextNode, 1)]
+ expected: FAIL
+
+ [detachedForeignTextNode.appendData(""), with selected range on detachedForeignTextNode from 0 to detachedForeignTextNode.length]
+ expected: FAIL
+
+ [detachedForeignTextNode.appendData(""), with selected range on detachedForeignTextNode from 1 to detachedForeignTextNode.length]
+ expected: FAIL
+
+ [detachedForeignTextNode.appendData(""), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
+ expected: FAIL
+
+ [detachedForeignTextNode.appendData(""), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.appendData("foo"), with selected range on detachedXmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlTextNode.appendData("foo"), with selected range collapsed at (detachedXmlTextNode, 0)]
+ expected: FAIL
+
+ [detachedXmlTextNode.appendData("foo"), with selected range collapsed at (detachedXmlTextNode, 1)]
+ expected: FAIL
+
+ [detachedXmlTextNode.appendData("foo"), with selected range on detachedXmlTextNode from 0 to detachedXmlTextNode.length]
+ expected: FAIL
+
+ [detachedXmlTextNode.appendData("foo"), with selected range on detachedXmlTextNode from 1 to detachedXmlTextNode.length]
+ expected: FAIL
+
+ [detachedXmlTextNode.appendData("foo"), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
+ expected: FAIL
+
+ [detachedXmlTextNode.appendData("foo"), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.appendData(""), with selected range on detachedXmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlTextNode.appendData(""), with selected range collapsed at (detachedXmlTextNode, 0)]
+ expected: FAIL
+
+ [detachedXmlTextNode.appendData(""), with selected range collapsed at (detachedXmlTextNode, 1)]
+ expected: FAIL
+
+ [detachedXmlTextNode.appendData(""), with selected range on detachedXmlTextNode from 0 to detachedXmlTextNode.length]
+ expected: FAIL
+
+ [detachedXmlTextNode.appendData(""), with selected range on detachedXmlTextNode from 1 to detachedXmlTextNode.length]
+ expected: FAIL
+
+ [detachedXmlTextNode.appendData(""), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
+ expected: FAIL
+
+ [detachedXmlTextNode.appendData(""), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [comment.appendData("foo"), with selected range on comment from 0 to 1]
+ expected: FAIL
+
+ [comment.appendData("foo"), with selected range collapsed at (comment, 0)]
+ expected: FAIL
+
+ [comment.appendData("foo"), with selected range collapsed at (comment, 1)]
+ expected: FAIL
+
+ [comment.appendData("foo"), with selected range on comment from 0 to comment.length]
+ expected: FAIL
+
+ [comment.appendData("foo"), with selected range on comment from 1 to comment.length]
+ expected: FAIL
+
+ [comment.appendData("foo"), with selected range collapsed at (comment, comment.length)]
+ expected: FAIL
+
+ [comment.appendData("foo"), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.appendData(""), with selected range on comment from 0 to 1]
+ expected: FAIL
+
+ [comment.appendData(""), with selected range collapsed at (comment, 0)]
+ expected: FAIL
+
+ [comment.appendData(""), with selected range collapsed at (comment, 1)]
+ expected: FAIL
+
+ [comment.appendData(""), with selected range on comment from 0 to comment.length]
+ expected: FAIL
+
+ [comment.appendData(""), with selected range on comment from 1 to comment.length]
+ expected: FAIL
+
+ [comment.appendData(""), with selected range collapsed at (comment, comment.length)]
+ expected: FAIL
+
+ [comment.appendData(""), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.appendData("foo"), with selected range on foreignComment from 0 to 1]
+ expected: FAIL
+
+ [foreignComment.appendData("foo"), with selected range collapsed at (foreignComment, 0)]
+ expected: FAIL
+
+ [foreignComment.appendData("foo"), with selected range collapsed at (foreignComment, 1)]
+ expected: FAIL
+
+ [foreignComment.appendData("foo"), with selected range on foreignComment from 0 to foreignComment.length]
+ expected: FAIL
+
+ [foreignComment.appendData("foo"), with selected range on foreignComment from 1 to foreignComment.length]
+ expected: FAIL
+
+ [foreignComment.appendData("foo"), with selected range collapsed at (foreignComment, foreignComment.length)]
+ expected: FAIL
+
+ [foreignComment.appendData("foo"), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.appendData(""), with selected range on foreignComment from 0 to 1]
+ expected: FAIL
+
+ [foreignComment.appendData(""), with selected range collapsed at (foreignComment, 0)]
+ expected: FAIL
+
+ [foreignComment.appendData(""), with selected range collapsed at (foreignComment, 1)]
+ expected: FAIL
+
+ [foreignComment.appendData(""), with selected range on foreignComment from 0 to foreignComment.length]
+ expected: FAIL
+
+ [foreignComment.appendData(""), with selected range on foreignComment from 1 to foreignComment.length]
+ expected: FAIL
+
+ [foreignComment.appendData(""), with selected range collapsed at (foreignComment, foreignComment.length)]
+ expected: FAIL
+
+ [foreignComment.appendData(""), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.appendData("foo"), with selected range on xmlComment from 0 to 1]
+ expected: FAIL
+
+ [xmlComment.appendData("foo"), with selected range collapsed at (xmlComment, 0)]
+ expected: FAIL
+
+ [xmlComment.appendData("foo"), with selected range collapsed at (xmlComment, 1)]
+ expected: FAIL
+
+ [xmlComment.appendData("foo"), with selected range on xmlComment from 0 to xmlComment.length]
+ expected: FAIL
+
+ [xmlComment.appendData("foo"), with selected range on xmlComment from 1 to xmlComment.length]
+ expected: FAIL
+
+ [xmlComment.appendData("foo"), with selected range collapsed at (xmlComment, xmlComment.length)]
+ expected: FAIL
+
+ [xmlComment.appendData("foo"), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.appendData(""), with selected range on xmlComment from 0 to 1]
+ expected: FAIL
+
+ [xmlComment.appendData(""), with selected range collapsed at (xmlComment, 0)]
+ expected: FAIL
+
+ [xmlComment.appendData(""), with selected range collapsed at (xmlComment, 1)]
+ expected: FAIL
+
+ [xmlComment.appendData(""), with selected range on xmlComment from 0 to xmlComment.length]
+ expected: FAIL
+
+ [xmlComment.appendData(""), with selected range on xmlComment from 1 to xmlComment.length]
+ expected: FAIL
+
+ [xmlComment.appendData(""), with selected range collapsed at (xmlComment, xmlComment.length)]
+ expected: FAIL
+
+ [xmlComment.appendData(""), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.appendData("foo"), with selected range on detachedComment from 0 to 1]
+ expected: FAIL
+
+ [detachedComment.appendData("foo"), with selected range collapsed at (detachedComment, 0)]
+ expected: FAIL
+
+ [detachedComment.appendData("foo"), with selected range collapsed at (detachedComment, 1)]
+ expected: FAIL
+
+ [detachedComment.appendData("foo"), with selected range on detachedComment from 0 to detachedComment.length]
+ expected: FAIL
+
+ [detachedComment.appendData("foo"), with selected range on detachedComment from 1 to detachedComment.length]
+ expected: FAIL
+
+ [detachedComment.appendData("foo"), with selected range collapsed at (detachedComment, detachedComment.length)]
+ expected: FAIL
+
+ [detachedComment.appendData("foo"), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.appendData(""), with selected range on detachedComment from 0 to 1]
+ expected: FAIL
+
+ [detachedComment.appendData(""), with selected range collapsed at (detachedComment, 0)]
+ expected: FAIL
+
+ [detachedComment.appendData(""), with selected range collapsed at (detachedComment, 1)]
+ expected: FAIL
+
+ [detachedComment.appendData(""), with selected range on detachedComment from 0 to detachedComment.length]
+ expected: FAIL
+
+ [detachedComment.appendData(""), with selected range on detachedComment from 1 to detachedComment.length]
+ expected: FAIL
+
+ [detachedComment.appendData(""), with selected range collapsed at (detachedComment, detachedComment.length)]
+ expected: FAIL
+
+ [detachedComment.appendData(""), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.appendData("foo"), with selected range on detachedForeignComment from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignComment.appendData("foo"), with selected range collapsed at (detachedForeignComment, 0)]
+ expected: FAIL
+
+ [detachedForeignComment.appendData("foo"), with selected range collapsed at (detachedForeignComment, 1)]
+ expected: FAIL
+
+ [detachedForeignComment.appendData("foo"), with selected range on detachedForeignComment from 0 to detachedForeignComment.length]
+ expected: FAIL
+
+ [detachedForeignComment.appendData("foo"), with selected range on detachedForeignComment from 1 to detachedForeignComment.length]
+ expected: FAIL
+
+ [detachedForeignComment.appendData("foo"), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
+ expected: FAIL
+
+ [detachedForeignComment.appendData("foo"), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.appendData(""), with selected range on detachedForeignComment from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignComment.appendData(""), with selected range collapsed at (detachedForeignComment, 0)]
+ expected: FAIL
+
+ [detachedForeignComment.appendData(""), with selected range collapsed at (detachedForeignComment, 1)]
+ expected: FAIL
+
+ [detachedForeignComment.appendData(""), with selected range on detachedForeignComment from 0 to detachedForeignComment.length]
+ expected: FAIL
+
+ [detachedForeignComment.appendData(""), with selected range on detachedForeignComment from 1 to detachedForeignComment.length]
+ expected: FAIL
+
+ [detachedForeignComment.appendData(""), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
+ expected: FAIL
+
+ [detachedForeignComment.appendData(""), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.appendData("foo"), with selected range on detachedXmlComment from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlComment.appendData("foo"), with selected range collapsed at (detachedXmlComment, 0)]
+ expected: FAIL
+
+ [detachedXmlComment.appendData("foo"), with selected range collapsed at (detachedXmlComment, 1)]
+ expected: FAIL
+
+ [detachedXmlComment.appendData("foo"), with selected range on detachedXmlComment from 0 to detachedXmlComment.length]
+ expected: FAIL
+
+ [detachedXmlComment.appendData("foo"), with selected range on detachedXmlComment from 1 to detachedXmlComment.length]
+ expected: FAIL
+
+ [detachedXmlComment.appendData("foo"), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
+ expected: FAIL
+
+ [detachedXmlComment.appendData("foo"), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.appendData(""), with selected range on detachedXmlComment from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlComment.appendData(""), with selected range collapsed at (detachedXmlComment, 0)]
+ expected: FAIL
+
+ [detachedXmlComment.appendData(""), with selected range collapsed at (detachedXmlComment, 1)]
+ expected: FAIL
+
+ [detachedXmlComment.appendData(""), with selected range on detachedXmlComment from 0 to detachedXmlComment.length]
+ expected: FAIL
+
+ [detachedXmlComment.appendData(""), with selected range on detachedXmlComment from 1 to detachedXmlComment.length]
+ expected: FAIL
+
+ [detachedXmlComment.appendData(""), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
+ expected: FAIL
+
+ [detachedXmlComment.appendData(""), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData(""), with selected range collapsed at (paras[0\], 0)]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData(""), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData(""), with selected range collapsed at (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData(""), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData(""), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData("foo"), with selected range collapsed at (paras[0\], 0)]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData("foo"), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData("foo"), with selected range collapsed at (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData("foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.appendData("foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/ranges/Range-mutations.html.ini b/tests/wpt/metadata/dom/ranges/Range-mutations-dataChange.html.ini
index 7c599ca1e6f..35598a04368 100644
--- a/tests/wpt/metadata/dom/ranges/Range-mutations.html.ini
+++ b/tests/wpt/metadata/dom/ranges/Range-mutations-dataChange.html.ini
@@ -1,3893 +1,5 @@
-[Range-mutations.html]
+[Range-mutations-dataChange.html]
type: testharness
- [paras[0\].firstChild.splitText(376), with selected range on paras[0\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[0\].firstChild.splitText(0), with selected range collapsed at (paras[0\].firstChild, 0)]
- expected: FAIL
-
- [paras[0\].firstChild.splitText(1), with selected range collapsed at (paras[0\].firstChild, 1)]
- expected: FAIL
-
- [paras[0\].firstChild.splitText(paras[0\].firstChild.length), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
- expected: FAIL
-
- [paras[0\].firstChild.splitText(1), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.splitText(2), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.splitText(3), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.splitText(376), with selected range on paras[1\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[1\].firstChild.splitText(0), with selected range collapsed at (paras[1\].firstChild, 0)]
- expected: FAIL
-
- [paras[1\].firstChild.splitText(1), with selected range collapsed at (paras[1\].firstChild, 1)]
- expected: FAIL
-
- [paras[1\].firstChild.splitText(paras[1\].firstChild.length), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
- expected: FAIL
-
- [paras[1\].firstChild.splitText(1), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.splitText(2), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.splitText(3), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.splitText(376), with selected range on foreignTextNode from 0 to 1]
- expected: FAIL
-
- [foreignTextNode.splitText(0), with selected range collapsed at (foreignTextNode, 0)]
- expected: FAIL
-
- [foreignTextNode.splitText(1), with selected range collapsed at (foreignTextNode, 1)]
- expected: FAIL
-
- [foreignTextNode.splitText(foreignTextNode.length), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
- expected: FAIL
-
- [foreignTextNode.splitText(1), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.splitText(2), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.splitText(3), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.splitText(376), with selected range on xmlTextNode from 0 to 1]
- expected: FAIL
-
- [xmlTextNode.splitText(0), with selected range collapsed at (xmlTextNode, 0)]
- expected: FAIL
-
- [xmlTextNode.splitText(1), with selected range collapsed at (xmlTextNode, 1)]
- expected: FAIL
-
- [xmlTextNode.splitText(xmlTextNode.length), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
- expected: FAIL
-
- [xmlTextNode.splitText(1), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.splitText(2), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.splitText(3), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.splitText(376), with selected range on detachedTextNode from 0 to 1]
- expected: FAIL
-
- [detachedTextNode.splitText(0), with selected range collapsed at (detachedTextNode, 0)]
- expected: FAIL
-
- [detachedTextNode.splitText(1), with selected range collapsed at (detachedTextNode, 1)]
- expected: FAIL
-
- [detachedTextNode.splitText(detachedTextNode.length), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
- expected: FAIL
-
- [detachedTextNode.splitText(1), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.splitText(2), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.splitText(3), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.splitText(376), with selected range on detachedForeignTextNode from 0 to 1]
- expected: FAIL
-
- [detachedForeignTextNode.splitText(0), with selected range collapsed at (detachedForeignTextNode, 0)]
- expected: FAIL
-
- [detachedForeignTextNode.splitText(1), with selected range collapsed at (detachedForeignTextNode, 1)]
- expected: FAIL
-
- [detachedForeignTextNode.splitText(detachedForeignTextNode.length), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
- expected: FAIL
-
- [detachedForeignTextNode.splitText(1), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.splitText(2), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.splitText(3), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.splitText(376), with selected range on detachedXmlTextNode from 0 to 1]
- expected: FAIL
-
- [detachedXmlTextNode.splitText(0), with selected range collapsed at (detachedXmlTextNode, 0)]
- expected: FAIL
-
- [detachedXmlTextNode.splitText(1), with selected range collapsed at (detachedXmlTextNode, 1)]
- expected: FAIL
-
- [detachedXmlTextNode.splitText(detachedXmlTextNode.length), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
- expected: FAIL
-
- [detachedXmlTextNode.splitText(1), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.splitText(2), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.splitText(3), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.splitText(1), with selected range collapsed at (paras[0\], 0)]
- expected: FAIL
-
- [paras[0\].firstChild.splitText(1), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].firstChild.splitText(1), with selected range collapsed at (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.splitText(1), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.splitText(2), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.splitText(3), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.splitText(1), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
- expected: FAIL
-
- [paras[0\].firstChild.splitText(2), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
- expected: FAIL
-
- [paras[0\].firstChild.splitText(3), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(376, "foo"), with selected range on paras[0\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(0, "foo"), with selected range collapsed at (paras[0\].firstChild, 0)]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(1, "foo"), with selected range collapsed at (paras[0\].firstChild, 1)]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(paras[0\].firstChild.length, "foo"), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(1, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(2, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(3, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(376, ""), with selected range on paras[0\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(0, ""), with selected range collapsed at (paras[0\].firstChild, 0)]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(1, ""), with selected range collapsed at (paras[0\].firstChild, 1)]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(paras[0\].firstChild.length, ""), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(1, ""), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(2, ""), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(3, ""), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.insertData(376, "foo"), with selected range on paras[1\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[1\].firstChild.insertData(0, "foo"), with selected range collapsed at (paras[1\].firstChild, 0)]
- expected: FAIL
-
- [paras[1\].firstChild.insertData(1, "foo"), with selected range collapsed at (paras[1\].firstChild, 1)]
- expected: FAIL
-
- [paras[1\].firstChild.insertData(paras[1\].firstChild.length, "foo"), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
- expected: FAIL
-
- [paras[1\].firstChild.insertData(1, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.insertData(2, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.insertData(3, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.insertData(376, ""), with selected range on paras[1\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[1\].firstChild.insertData(0, ""), with selected range collapsed at (paras[1\].firstChild, 0)]
- expected: FAIL
-
- [paras[1\].firstChild.insertData(1, ""), with selected range collapsed at (paras[1\].firstChild, 1)]
- expected: FAIL
-
- [paras[1\].firstChild.insertData(paras[1\].firstChild.length, ""), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
- expected: FAIL
-
- [paras[1\].firstChild.insertData(1, ""), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.insertData(2, ""), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.insertData(3, ""), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.insertData(376, "foo"), with selected range on foreignTextNode from 0 to 1]
- expected: FAIL
-
- [foreignTextNode.insertData(0, "foo"), with selected range collapsed at (foreignTextNode, 0)]
- expected: FAIL
-
- [foreignTextNode.insertData(1, "foo"), with selected range collapsed at (foreignTextNode, 1)]
- expected: FAIL
-
- [foreignTextNode.insertData(foreignTextNode.length, "foo"), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
- expected: FAIL
-
- [foreignTextNode.insertData(1, "foo"), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.insertData(2, "foo"), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.insertData(3, "foo"), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.insertData(376, ""), with selected range on foreignTextNode from 0 to 1]
- expected: FAIL
-
- [foreignTextNode.insertData(0, ""), with selected range collapsed at (foreignTextNode, 0)]
- expected: FAIL
-
- [foreignTextNode.insertData(1, ""), with selected range collapsed at (foreignTextNode, 1)]
- expected: FAIL
-
- [foreignTextNode.insertData(foreignTextNode.length, ""), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
- expected: FAIL
-
- [foreignTextNode.insertData(1, ""), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.insertData(2, ""), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.insertData(3, ""), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.insertData(376, "foo"), with selected range on xmlTextNode from 0 to 1]
- expected: FAIL
-
- [xmlTextNode.insertData(0, "foo"), with selected range collapsed at (xmlTextNode, 0)]
- expected: FAIL
-
- [xmlTextNode.insertData(1, "foo"), with selected range collapsed at (xmlTextNode, 1)]
- expected: FAIL
-
- [xmlTextNode.insertData(xmlTextNode.length, "foo"), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
- expected: FAIL
-
- [xmlTextNode.insertData(1, "foo"), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.insertData(2, "foo"), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.insertData(3, "foo"), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.insertData(376, ""), with selected range on xmlTextNode from 0 to 1]
- expected: FAIL
-
- [xmlTextNode.insertData(0, ""), with selected range collapsed at (xmlTextNode, 0)]
- expected: FAIL
-
- [xmlTextNode.insertData(1, ""), with selected range collapsed at (xmlTextNode, 1)]
- expected: FAIL
-
- [xmlTextNode.insertData(xmlTextNode.length, ""), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
- expected: FAIL
-
- [xmlTextNode.insertData(1, ""), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.insertData(2, ""), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.insertData(3, ""), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.insertData(376, "foo"), with selected range on detachedTextNode from 0 to 1]
- expected: FAIL
-
- [detachedTextNode.insertData(0, "foo"), with selected range collapsed at (detachedTextNode, 0)]
- expected: FAIL
-
- [detachedTextNode.insertData(1, "foo"), with selected range collapsed at (detachedTextNode, 1)]
- expected: FAIL
-
- [detachedTextNode.insertData(detachedTextNode.length, "foo"), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
- expected: FAIL
-
- [detachedTextNode.insertData(1, "foo"), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.insertData(2, "foo"), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.insertData(3, "foo"), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.insertData(376, ""), with selected range on detachedTextNode from 0 to 1]
- expected: FAIL
-
- [detachedTextNode.insertData(0, ""), with selected range collapsed at (detachedTextNode, 0)]
- expected: FAIL
-
- [detachedTextNode.insertData(1, ""), with selected range collapsed at (detachedTextNode, 1)]
- expected: FAIL
-
- [detachedTextNode.insertData(detachedTextNode.length, ""), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
- expected: FAIL
-
- [detachedTextNode.insertData(1, ""), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.insertData(2, ""), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.insertData(3, ""), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.insertData(376, "foo"), with selected range on detachedForeignTextNode from 0 to 1]
- expected: FAIL
-
- [detachedForeignTextNode.insertData(0, "foo"), with selected range collapsed at (detachedForeignTextNode, 0)]
- expected: FAIL
-
- [detachedForeignTextNode.insertData(1, "foo"), with selected range collapsed at (detachedForeignTextNode, 1)]
- expected: FAIL
-
- [detachedForeignTextNode.insertData(detachedForeignTextNode.length, "foo"), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
- expected: FAIL
-
- [detachedForeignTextNode.insertData(1, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.insertData(2, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.insertData(3, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.insertData(376, ""), with selected range on detachedForeignTextNode from 0 to 1]
- expected: FAIL
-
- [detachedForeignTextNode.insertData(0, ""), with selected range collapsed at (detachedForeignTextNode, 0)]
- expected: FAIL
-
- [detachedForeignTextNode.insertData(1, ""), with selected range collapsed at (detachedForeignTextNode, 1)]
- expected: FAIL
-
- [detachedForeignTextNode.insertData(detachedForeignTextNode.length, ""), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
- expected: FAIL
-
- [detachedForeignTextNode.insertData(1, ""), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.insertData(2, ""), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.insertData(3, ""), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.insertData(376, "foo"), with selected range on detachedXmlTextNode from 0 to 1]
- expected: FAIL
-
- [detachedXmlTextNode.insertData(0, "foo"), with selected range collapsed at (detachedXmlTextNode, 0)]
- expected: FAIL
-
- [detachedXmlTextNode.insertData(1, "foo"), with selected range collapsed at (detachedXmlTextNode, 1)]
- expected: FAIL
-
- [detachedXmlTextNode.insertData(detachedXmlTextNode.length, "foo"), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
- expected: FAIL
-
- [detachedXmlTextNode.insertData(1, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.insertData(2, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.insertData(3, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.insertData(376, ""), with selected range on detachedXmlTextNode from 0 to 1]
- expected: FAIL
-
- [detachedXmlTextNode.insertData(0, ""), with selected range collapsed at (detachedXmlTextNode, 0)]
- expected: FAIL
-
- [detachedXmlTextNode.insertData(1, ""), with selected range collapsed at (detachedXmlTextNode, 1)]
- expected: FAIL
-
- [detachedXmlTextNode.insertData(detachedXmlTextNode.length, ""), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
- expected: FAIL
-
- [detachedXmlTextNode.insertData(1, ""), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.insertData(2, ""), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.insertData(3, ""), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [comment.insertData(376, "foo"), with selected range on comment from 0 to 1]
- expected: FAIL
-
- [comment.insertData(0, "foo"), with selected range collapsed at (comment, 0)]
- expected: FAIL
-
- [comment.insertData(1, "foo"), with selected range collapsed at (comment, 1)]
- expected: FAIL
-
- [comment.insertData(comment.length, "foo"), with selected range collapsed at (comment, comment.length)]
- expected: FAIL
-
- [comment.insertData(1, "foo"), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.insertData(2, "foo"), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.insertData(3, "foo"), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.insertData(376, ""), with selected range on comment from 0 to 1]
- expected: FAIL
-
- [comment.insertData(0, ""), with selected range collapsed at (comment, 0)]
- expected: FAIL
-
- [comment.insertData(1, ""), with selected range collapsed at (comment, 1)]
- expected: FAIL
-
- [comment.insertData(comment.length, ""), with selected range collapsed at (comment, comment.length)]
- expected: FAIL
-
- [comment.insertData(1, ""), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.insertData(2, ""), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.insertData(3, ""), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [foreignComment.insertData(376, "foo"), with selected range on foreignComment from 0 to 1]
- expected: FAIL
-
- [foreignComment.insertData(0, "foo"), with selected range collapsed at (foreignComment, 0)]
- expected: FAIL
-
- [foreignComment.insertData(1, "foo"), with selected range collapsed at (foreignComment, 1)]
- expected: FAIL
-
- [foreignComment.insertData(foreignComment.length, "foo"), with selected range collapsed at (foreignComment, foreignComment.length)]
- expected: FAIL
-
- [foreignComment.insertData(1, "foo"), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.insertData(2, "foo"), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.insertData(3, "foo"), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.insertData(376, ""), with selected range on foreignComment from 0 to 1]
- expected: FAIL
-
- [foreignComment.insertData(0, ""), with selected range collapsed at (foreignComment, 0)]
- expected: FAIL
-
- [foreignComment.insertData(1, ""), with selected range collapsed at (foreignComment, 1)]
- expected: FAIL
-
- [foreignComment.insertData(foreignComment.length, ""), with selected range collapsed at (foreignComment, foreignComment.length)]
- expected: FAIL
-
- [foreignComment.insertData(1, ""), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.insertData(2, ""), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.insertData(3, ""), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.insertData(376, "foo"), with selected range on xmlComment from 0 to 1]
- expected: FAIL
-
- [xmlComment.insertData(0, "foo"), with selected range collapsed at (xmlComment, 0)]
- expected: FAIL
-
- [xmlComment.insertData(1, "foo"), with selected range collapsed at (xmlComment, 1)]
- expected: FAIL
-
- [xmlComment.insertData(xmlComment.length, "foo"), with selected range collapsed at (xmlComment, xmlComment.length)]
- expected: FAIL
-
- [xmlComment.insertData(1, "foo"), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.insertData(2, "foo"), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.insertData(3, "foo"), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.insertData(376, ""), with selected range on xmlComment from 0 to 1]
- expected: FAIL
-
- [xmlComment.insertData(0, ""), with selected range collapsed at (xmlComment, 0)]
- expected: FAIL
-
- [xmlComment.insertData(1, ""), with selected range collapsed at (xmlComment, 1)]
- expected: FAIL
-
- [xmlComment.insertData(xmlComment.length, ""), with selected range collapsed at (xmlComment, xmlComment.length)]
- expected: FAIL
-
- [xmlComment.insertData(1, ""), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.insertData(2, ""), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.insertData(3, ""), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.insertData(376, "foo"), with selected range on detachedComment from 0 to 1]
- expected: FAIL
-
- [detachedComment.insertData(0, "foo"), with selected range collapsed at (detachedComment, 0)]
- expected: FAIL
-
- [detachedComment.insertData(1, "foo"), with selected range collapsed at (detachedComment, 1)]
- expected: FAIL
-
- [detachedComment.insertData(detachedComment.length, "foo"), with selected range collapsed at (detachedComment, detachedComment.length)]
- expected: FAIL
-
- [detachedComment.insertData(1, "foo"), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.insertData(2, "foo"), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.insertData(3, "foo"), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.insertData(376, ""), with selected range on detachedComment from 0 to 1]
- expected: FAIL
-
- [detachedComment.insertData(0, ""), with selected range collapsed at (detachedComment, 0)]
- expected: FAIL
-
- [detachedComment.insertData(1, ""), with selected range collapsed at (detachedComment, 1)]
- expected: FAIL
-
- [detachedComment.insertData(detachedComment.length, ""), with selected range collapsed at (detachedComment, detachedComment.length)]
- expected: FAIL
-
- [detachedComment.insertData(1, ""), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.insertData(2, ""), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.insertData(3, ""), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.insertData(376, "foo"), with selected range on detachedForeignComment from 0 to 1]
- expected: FAIL
-
- [detachedForeignComment.insertData(0, "foo"), with selected range collapsed at (detachedForeignComment, 0)]
- expected: FAIL
-
- [detachedForeignComment.insertData(1, "foo"), with selected range collapsed at (detachedForeignComment, 1)]
- expected: FAIL
-
- [detachedForeignComment.insertData(detachedForeignComment.length, "foo"), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
- expected: FAIL
-
- [detachedForeignComment.insertData(1, "foo"), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.insertData(2, "foo"), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.insertData(3, "foo"), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.insertData(376, ""), with selected range on detachedForeignComment from 0 to 1]
- expected: FAIL
-
- [detachedForeignComment.insertData(0, ""), with selected range collapsed at (detachedForeignComment, 0)]
- expected: FAIL
-
- [detachedForeignComment.insertData(1, ""), with selected range collapsed at (detachedForeignComment, 1)]
- expected: FAIL
-
- [detachedForeignComment.insertData(detachedForeignComment.length, ""), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
- expected: FAIL
-
- [detachedForeignComment.insertData(1, ""), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.insertData(2, ""), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.insertData(3, ""), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.insertData(376, "foo"), with selected range on detachedXmlComment from 0 to 1]
- expected: FAIL
-
- [detachedXmlComment.insertData(0, "foo"), with selected range collapsed at (detachedXmlComment, 0)]
- expected: FAIL
-
- [detachedXmlComment.insertData(1, "foo"), with selected range collapsed at (detachedXmlComment, 1)]
- expected: FAIL
-
- [detachedXmlComment.insertData(detachedXmlComment.length, "foo"), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
- expected: FAIL
-
- [detachedXmlComment.insertData(1, "foo"), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.insertData(2, "foo"), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.insertData(3, "foo"), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.insertData(376, ""), with selected range on detachedXmlComment from 0 to 1]
- expected: FAIL
-
- [detachedXmlComment.insertData(0, ""), with selected range collapsed at (detachedXmlComment, 0)]
- expected: FAIL
-
- [detachedXmlComment.insertData(1, ""), with selected range collapsed at (detachedXmlComment, 1)]
- expected: FAIL
-
- [detachedXmlComment.insertData(detachedXmlComment.length, ""), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
- expected: FAIL
-
- [detachedXmlComment.insertData(1, ""), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.insertData(2, ""), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.insertData(3, ""), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(1, "foo"), with selected range collapsed at (paras[0\], 0)]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(1, "foo"), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(1, "foo"), with selected range collapsed at (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(1, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(2, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(3, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(1, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(2, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
- expected: FAIL
-
- [paras[0\].firstChild.insertData(3, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
- expected: FAIL
-
- [paras[0\].firstChild.appendData("foo"), with selected range on paras[0\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[0\].firstChild.appendData("foo"), with selected range collapsed at (paras[0\].firstChild, 0)]
- expected: FAIL
-
- [paras[0\].firstChild.appendData("foo"), with selected range collapsed at (paras[0\].firstChild, 1)]
- expected: FAIL
-
- [paras[0\].firstChild.appendData("foo"), with selected range on paras[0\].firstChild from 0 to paras[0\].firstChild.length]
- expected: FAIL
-
- [paras[0\].firstChild.appendData("foo"), with selected range on paras[0\].firstChild from 1 to paras[0\].firstChild.length]
- expected: FAIL
-
- [paras[0\].firstChild.appendData("foo"), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
- expected: FAIL
-
- [paras[0\].firstChild.appendData("foo"), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.appendData(""), with selected range on paras[0\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[0\].firstChild.appendData(""), with selected range collapsed at (paras[0\].firstChild, 0)]
- expected: FAIL
-
- [paras[0\].firstChild.appendData(""), with selected range collapsed at (paras[0\].firstChild, 1)]
- expected: FAIL
-
- [paras[0\].firstChild.appendData(""), with selected range on paras[0\].firstChild from 0 to paras[0\].firstChild.length]
- expected: FAIL
-
- [paras[0\].firstChild.appendData(""), with selected range on paras[0\].firstChild from 1 to paras[0\].firstChild.length]
- expected: FAIL
-
- [paras[0\].firstChild.appendData(""), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
- expected: FAIL
-
- [paras[0\].firstChild.appendData(""), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.appendData("foo"), with selected range on paras[1\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[1\].firstChild.appendData("foo"), with selected range collapsed at (paras[1\].firstChild, 0)]
- expected: FAIL
-
- [paras[1\].firstChild.appendData("foo"), with selected range collapsed at (paras[1\].firstChild, 1)]
- expected: FAIL
-
- [paras[1\].firstChild.appendData("foo"), with selected range on paras[1\].firstChild from 0 to paras[1\].firstChild.length]
- expected: FAIL
-
- [paras[1\].firstChild.appendData("foo"), with selected range on paras[1\].firstChild from 1 to paras[1\].firstChild.length]
- expected: FAIL
-
- [paras[1\].firstChild.appendData("foo"), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
- expected: FAIL
-
- [paras[1\].firstChild.appendData("foo"), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.appendData(""), with selected range on paras[1\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[1\].firstChild.appendData(""), with selected range collapsed at (paras[1\].firstChild, 0)]
- expected: FAIL
-
- [paras[1\].firstChild.appendData(""), with selected range collapsed at (paras[1\].firstChild, 1)]
- expected: FAIL
-
- [paras[1\].firstChild.appendData(""), with selected range on paras[1\].firstChild from 0 to paras[1\].firstChild.length]
- expected: FAIL
-
- [paras[1\].firstChild.appendData(""), with selected range on paras[1\].firstChild from 1 to paras[1\].firstChild.length]
- expected: FAIL
-
- [paras[1\].firstChild.appendData(""), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
- expected: FAIL
-
- [paras[1\].firstChild.appendData(""), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.appendData("foo"), with selected range on foreignTextNode from 0 to 1]
- expected: FAIL
-
- [foreignTextNode.appendData("foo"), with selected range collapsed at (foreignTextNode, 0)]
- expected: FAIL
-
- [foreignTextNode.appendData("foo"), with selected range collapsed at (foreignTextNode, 1)]
- expected: FAIL
-
- [foreignTextNode.appendData("foo"), with selected range on foreignTextNode from 0 to foreignTextNode.length]
- expected: FAIL
-
- [foreignTextNode.appendData("foo"), with selected range on foreignTextNode from 1 to foreignTextNode.length]
- expected: FAIL
-
- [foreignTextNode.appendData("foo"), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
- expected: FAIL
-
- [foreignTextNode.appendData("foo"), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.appendData(""), with selected range on foreignTextNode from 0 to 1]
- expected: FAIL
-
- [foreignTextNode.appendData(""), with selected range collapsed at (foreignTextNode, 0)]
- expected: FAIL
-
- [foreignTextNode.appendData(""), with selected range collapsed at (foreignTextNode, 1)]
- expected: FAIL
-
- [foreignTextNode.appendData(""), with selected range on foreignTextNode from 0 to foreignTextNode.length]
- expected: FAIL
-
- [foreignTextNode.appendData(""), with selected range on foreignTextNode from 1 to foreignTextNode.length]
- expected: FAIL
-
- [foreignTextNode.appendData(""), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
- expected: FAIL
-
- [foreignTextNode.appendData(""), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.appendData("foo"), with selected range on xmlTextNode from 0 to 1]
- expected: FAIL
-
- [xmlTextNode.appendData("foo"), with selected range collapsed at (xmlTextNode, 0)]
- expected: FAIL
-
- [xmlTextNode.appendData("foo"), with selected range collapsed at (xmlTextNode, 1)]
- expected: FAIL
-
- [xmlTextNode.appendData("foo"), with selected range on xmlTextNode from 0 to xmlTextNode.length]
- expected: FAIL
-
- [xmlTextNode.appendData("foo"), with selected range on xmlTextNode from 1 to xmlTextNode.length]
- expected: FAIL
-
- [xmlTextNode.appendData("foo"), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
- expected: FAIL
-
- [xmlTextNode.appendData("foo"), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.appendData(""), with selected range on xmlTextNode from 0 to 1]
- expected: FAIL
-
- [xmlTextNode.appendData(""), with selected range collapsed at (xmlTextNode, 0)]
- expected: FAIL
-
- [xmlTextNode.appendData(""), with selected range collapsed at (xmlTextNode, 1)]
- expected: FAIL
-
- [xmlTextNode.appendData(""), with selected range on xmlTextNode from 0 to xmlTextNode.length]
- expected: FAIL
-
- [xmlTextNode.appendData(""), with selected range on xmlTextNode from 1 to xmlTextNode.length]
- expected: FAIL
-
- [xmlTextNode.appendData(""), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
- expected: FAIL
-
- [xmlTextNode.appendData(""), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.appendData("foo"), with selected range on detachedTextNode from 0 to 1]
- expected: FAIL
-
- [detachedTextNode.appendData("foo"), with selected range collapsed at (detachedTextNode, 0)]
- expected: FAIL
-
- [detachedTextNode.appendData("foo"), with selected range collapsed at (detachedTextNode, 1)]
- expected: FAIL
-
- [detachedTextNode.appendData("foo"), with selected range on detachedTextNode from 0 to detachedTextNode.length]
- expected: FAIL
-
- [detachedTextNode.appendData("foo"), with selected range on detachedTextNode from 1 to detachedTextNode.length]
- expected: FAIL
-
- [detachedTextNode.appendData("foo"), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
- expected: FAIL
-
- [detachedTextNode.appendData("foo"), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.appendData(""), with selected range on detachedTextNode from 0 to 1]
- expected: FAIL
-
- [detachedTextNode.appendData(""), with selected range collapsed at (detachedTextNode, 0)]
- expected: FAIL
-
- [detachedTextNode.appendData(""), with selected range collapsed at (detachedTextNode, 1)]
- expected: FAIL
-
- [detachedTextNode.appendData(""), with selected range on detachedTextNode from 0 to detachedTextNode.length]
- expected: FAIL
-
- [detachedTextNode.appendData(""), with selected range on detachedTextNode from 1 to detachedTextNode.length]
- expected: FAIL
-
- [detachedTextNode.appendData(""), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
- expected: FAIL
-
- [detachedTextNode.appendData(""), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.appendData("foo"), with selected range on detachedForeignTextNode from 0 to 1]
- expected: FAIL
-
- [detachedForeignTextNode.appendData("foo"), with selected range collapsed at (detachedForeignTextNode, 0)]
- expected: FAIL
-
- [detachedForeignTextNode.appendData("foo"), with selected range collapsed at (detachedForeignTextNode, 1)]
- expected: FAIL
-
- [detachedForeignTextNode.appendData("foo"), with selected range on detachedForeignTextNode from 0 to detachedForeignTextNode.length]
- expected: FAIL
-
- [detachedForeignTextNode.appendData("foo"), with selected range on detachedForeignTextNode from 1 to detachedForeignTextNode.length]
- expected: FAIL
-
- [detachedForeignTextNode.appendData("foo"), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
- expected: FAIL
-
- [detachedForeignTextNode.appendData("foo"), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.appendData(""), with selected range on detachedForeignTextNode from 0 to 1]
- expected: FAIL
-
- [detachedForeignTextNode.appendData(""), with selected range collapsed at (detachedForeignTextNode, 0)]
- expected: FAIL
-
- [detachedForeignTextNode.appendData(""), with selected range collapsed at (detachedForeignTextNode, 1)]
- expected: FAIL
-
- [detachedForeignTextNode.appendData(""), with selected range on detachedForeignTextNode from 0 to detachedForeignTextNode.length]
- expected: FAIL
-
- [detachedForeignTextNode.appendData(""), with selected range on detachedForeignTextNode from 1 to detachedForeignTextNode.length]
- expected: FAIL
-
- [detachedForeignTextNode.appendData(""), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
- expected: FAIL
-
- [detachedForeignTextNode.appendData(""), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.appendData("foo"), with selected range on detachedXmlTextNode from 0 to 1]
- expected: FAIL
-
- [detachedXmlTextNode.appendData("foo"), with selected range collapsed at (detachedXmlTextNode, 0)]
- expected: FAIL
-
- [detachedXmlTextNode.appendData("foo"), with selected range collapsed at (detachedXmlTextNode, 1)]
- expected: FAIL
-
- [detachedXmlTextNode.appendData("foo"), with selected range on detachedXmlTextNode from 0 to detachedXmlTextNode.length]
- expected: FAIL
-
- [detachedXmlTextNode.appendData("foo"), with selected range on detachedXmlTextNode from 1 to detachedXmlTextNode.length]
- expected: FAIL
-
- [detachedXmlTextNode.appendData("foo"), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
- expected: FAIL
-
- [detachedXmlTextNode.appendData("foo"), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.appendData(""), with selected range on detachedXmlTextNode from 0 to 1]
- expected: FAIL
-
- [detachedXmlTextNode.appendData(""), with selected range collapsed at (detachedXmlTextNode, 0)]
- expected: FAIL
-
- [detachedXmlTextNode.appendData(""), with selected range collapsed at (detachedXmlTextNode, 1)]
- expected: FAIL
-
- [detachedXmlTextNode.appendData(""), with selected range on detachedXmlTextNode from 0 to detachedXmlTextNode.length]
- expected: FAIL
-
- [detachedXmlTextNode.appendData(""), with selected range on detachedXmlTextNode from 1 to detachedXmlTextNode.length]
- expected: FAIL
-
- [detachedXmlTextNode.appendData(""), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
- expected: FAIL
-
- [detachedXmlTextNode.appendData(""), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [comment.appendData("foo"), with selected range on comment from 0 to 1]
- expected: FAIL
-
- [comment.appendData("foo"), with selected range collapsed at (comment, 0)]
- expected: FAIL
-
- [comment.appendData("foo"), with selected range collapsed at (comment, 1)]
- expected: FAIL
-
- [comment.appendData("foo"), with selected range on comment from 0 to comment.length]
- expected: FAIL
-
- [comment.appendData("foo"), with selected range on comment from 1 to comment.length]
- expected: FAIL
-
- [comment.appendData("foo"), with selected range collapsed at (comment, comment.length)]
- expected: FAIL
-
- [comment.appendData("foo"), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.appendData(""), with selected range on comment from 0 to 1]
- expected: FAIL
-
- [comment.appendData(""), with selected range collapsed at (comment, 0)]
- expected: FAIL
-
- [comment.appendData(""), with selected range collapsed at (comment, 1)]
- expected: FAIL
-
- [comment.appendData(""), with selected range on comment from 0 to comment.length]
- expected: FAIL
-
- [comment.appendData(""), with selected range on comment from 1 to comment.length]
- expected: FAIL
-
- [comment.appendData(""), with selected range collapsed at (comment, comment.length)]
- expected: FAIL
-
- [comment.appendData(""), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [foreignComment.appendData("foo"), with selected range on foreignComment from 0 to 1]
- expected: FAIL
-
- [foreignComment.appendData("foo"), with selected range collapsed at (foreignComment, 0)]
- expected: FAIL
-
- [foreignComment.appendData("foo"), with selected range collapsed at (foreignComment, 1)]
- expected: FAIL
-
- [foreignComment.appendData("foo"), with selected range on foreignComment from 0 to foreignComment.length]
- expected: FAIL
-
- [foreignComment.appendData("foo"), with selected range on foreignComment from 1 to foreignComment.length]
- expected: FAIL
-
- [foreignComment.appendData("foo"), with selected range collapsed at (foreignComment, foreignComment.length)]
- expected: FAIL
-
- [foreignComment.appendData("foo"), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.appendData(""), with selected range on foreignComment from 0 to 1]
- expected: FAIL
-
- [foreignComment.appendData(""), with selected range collapsed at (foreignComment, 0)]
- expected: FAIL
-
- [foreignComment.appendData(""), with selected range collapsed at (foreignComment, 1)]
- expected: FAIL
-
- [foreignComment.appendData(""), with selected range on foreignComment from 0 to foreignComment.length]
- expected: FAIL
-
- [foreignComment.appendData(""), with selected range on foreignComment from 1 to foreignComment.length]
- expected: FAIL
-
- [foreignComment.appendData(""), with selected range collapsed at (foreignComment, foreignComment.length)]
- expected: FAIL
-
- [foreignComment.appendData(""), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.appendData("foo"), with selected range on xmlComment from 0 to 1]
- expected: FAIL
-
- [xmlComment.appendData("foo"), with selected range collapsed at (xmlComment, 0)]
- expected: FAIL
-
- [xmlComment.appendData("foo"), with selected range collapsed at (xmlComment, 1)]
- expected: FAIL
-
- [xmlComment.appendData("foo"), with selected range on xmlComment from 0 to xmlComment.length]
- expected: FAIL
-
- [xmlComment.appendData("foo"), with selected range on xmlComment from 1 to xmlComment.length]
- expected: FAIL
-
- [xmlComment.appendData("foo"), with selected range collapsed at (xmlComment, xmlComment.length)]
- expected: FAIL
-
- [xmlComment.appendData("foo"), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.appendData(""), with selected range on xmlComment from 0 to 1]
- expected: FAIL
-
- [xmlComment.appendData(""), with selected range collapsed at (xmlComment, 0)]
- expected: FAIL
-
- [xmlComment.appendData(""), with selected range collapsed at (xmlComment, 1)]
- expected: FAIL
-
- [xmlComment.appendData(""), with selected range on xmlComment from 0 to xmlComment.length]
- expected: FAIL
-
- [xmlComment.appendData(""), with selected range on xmlComment from 1 to xmlComment.length]
- expected: FAIL
-
- [xmlComment.appendData(""), with selected range collapsed at (xmlComment, xmlComment.length)]
- expected: FAIL
-
- [xmlComment.appendData(""), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.appendData("foo"), with selected range on detachedComment from 0 to 1]
- expected: FAIL
-
- [detachedComment.appendData("foo"), with selected range collapsed at (detachedComment, 0)]
- expected: FAIL
-
- [detachedComment.appendData("foo"), with selected range collapsed at (detachedComment, 1)]
- expected: FAIL
-
- [detachedComment.appendData("foo"), with selected range on detachedComment from 0 to detachedComment.length]
- expected: FAIL
-
- [detachedComment.appendData("foo"), with selected range on detachedComment from 1 to detachedComment.length]
- expected: FAIL
-
- [detachedComment.appendData("foo"), with selected range collapsed at (detachedComment, detachedComment.length)]
- expected: FAIL
-
- [detachedComment.appendData("foo"), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.appendData(""), with selected range on detachedComment from 0 to 1]
- expected: FAIL
-
- [detachedComment.appendData(""), with selected range collapsed at (detachedComment, 0)]
- expected: FAIL
-
- [detachedComment.appendData(""), with selected range collapsed at (detachedComment, 1)]
- expected: FAIL
-
- [detachedComment.appendData(""), with selected range on detachedComment from 0 to detachedComment.length]
- expected: FAIL
-
- [detachedComment.appendData(""), with selected range on detachedComment from 1 to detachedComment.length]
- expected: FAIL
-
- [detachedComment.appendData(""), with selected range collapsed at (detachedComment, detachedComment.length)]
- expected: FAIL
-
- [detachedComment.appendData(""), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.appendData("foo"), with selected range on detachedForeignComment from 0 to 1]
- expected: FAIL
-
- [detachedForeignComment.appendData("foo"), with selected range collapsed at (detachedForeignComment, 0)]
- expected: FAIL
-
- [detachedForeignComment.appendData("foo"), with selected range collapsed at (detachedForeignComment, 1)]
- expected: FAIL
-
- [detachedForeignComment.appendData("foo"), with selected range on detachedForeignComment from 0 to detachedForeignComment.length]
- expected: FAIL
-
- [detachedForeignComment.appendData("foo"), with selected range on detachedForeignComment from 1 to detachedForeignComment.length]
- expected: FAIL
-
- [detachedForeignComment.appendData("foo"), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
- expected: FAIL
-
- [detachedForeignComment.appendData("foo"), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.appendData(""), with selected range on detachedForeignComment from 0 to 1]
- expected: FAIL
-
- [detachedForeignComment.appendData(""), with selected range collapsed at (detachedForeignComment, 0)]
- expected: FAIL
-
- [detachedForeignComment.appendData(""), with selected range collapsed at (detachedForeignComment, 1)]
- expected: FAIL
-
- [detachedForeignComment.appendData(""), with selected range on detachedForeignComment from 0 to detachedForeignComment.length]
- expected: FAIL
-
- [detachedForeignComment.appendData(""), with selected range on detachedForeignComment from 1 to detachedForeignComment.length]
- expected: FAIL
-
- [detachedForeignComment.appendData(""), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
- expected: FAIL
-
- [detachedForeignComment.appendData(""), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.appendData("foo"), with selected range on detachedXmlComment from 0 to 1]
- expected: FAIL
-
- [detachedXmlComment.appendData("foo"), with selected range collapsed at (detachedXmlComment, 0)]
- expected: FAIL
-
- [detachedXmlComment.appendData("foo"), with selected range collapsed at (detachedXmlComment, 1)]
- expected: FAIL
-
- [detachedXmlComment.appendData("foo"), with selected range on detachedXmlComment from 0 to detachedXmlComment.length]
- expected: FAIL
-
- [detachedXmlComment.appendData("foo"), with selected range on detachedXmlComment from 1 to detachedXmlComment.length]
- expected: FAIL
-
- [detachedXmlComment.appendData("foo"), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
- expected: FAIL
-
- [detachedXmlComment.appendData("foo"), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.appendData(""), with selected range on detachedXmlComment from 0 to 1]
- expected: FAIL
-
- [detachedXmlComment.appendData(""), with selected range collapsed at (detachedXmlComment, 0)]
- expected: FAIL
-
- [detachedXmlComment.appendData(""), with selected range collapsed at (detachedXmlComment, 1)]
- expected: FAIL
-
- [detachedXmlComment.appendData(""), with selected range on detachedXmlComment from 0 to detachedXmlComment.length]
- expected: FAIL
-
- [detachedXmlComment.appendData(""), with selected range on detachedXmlComment from 1 to detachedXmlComment.length]
- expected: FAIL
-
- [detachedXmlComment.appendData(""), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
- expected: FAIL
-
- [detachedXmlComment.appendData(""), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.appendData(""), with selected range collapsed at (paras[0\], 0)]
- expected: FAIL
-
- [paras[0\].firstChild.appendData(""), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].firstChild.appendData(""), with selected range collapsed at (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.appendData(""), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.appendData(""), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
- expected: FAIL
-
- [paras[0\].firstChild.appendData("foo"), with selected range collapsed at (paras[0\], 0)]
- expected: FAIL
-
- [paras[0\].firstChild.appendData("foo"), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].firstChild.appendData("foo"), with selected range collapsed at (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.appendData("foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.appendData("foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(376, 2), with selected range on paras[0\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(0, 2), with selected range collapsed at (paras[0\].firstChild, 0)]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(1, 2), with selected range collapsed at (paras[0\].firstChild, 1)]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(paras[0\].firstChild.length, 2), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(1, 2), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(2, 2), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(3, 2), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(376, 0), with selected range on paras[0\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(0, 0), with selected range collapsed at (paras[0\].firstChild, 0)]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(1, 0), with selected range collapsed at (paras[0\].firstChild, 1)]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(paras[0\].firstChild.length, 0), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(1, 0), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(2, 0), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(3, 0), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(376, 631), with selected range on paras[0\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(0, 631), with selected range collapsed at (paras[0\].firstChild, 0)]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(1, 631), with selected range collapsed at (paras[0\].firstChild, 1)]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(paras[0\].firstChild.length, 631), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(1, 631), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(2, 631), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(3, 631), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.deleteData(376, 2), with selected range on paras[1\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[1\].firstChild.deleteData(0, 2), with selected range collapsed at (paras[1\].firstChild, 0)]
- expected: FAIL
-
- [paras[1\].firstChild.deleteData(1, 2), with selected range collapsed at (paras[1\].firstChild, 1)]
- expected: FAIL
-
- [paras[1\].firstChild.deleteData(paras[1\].firstChild.length, 2), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
- expected: FAIL
-
- [paras[1\].firstChild.deleteData(1, 2), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.deleteData(2, 2), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.deleteData(3, 2), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.deleteData(376, 0), with selected range on paras[1\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[1\].firstChild.deleteData(0, 0), with selected range collapsed at (paras[1\].firstChild, 0)]
- expected: FAIL
-
- [paras[1\].firstChild.deleteData(1, 0), with selected range collapsed at (paras[1\].firstChild, 1)]
- expected: FAIL
-
- [paras[1\].firstChild.deleteData(paras[1\].firstChild.length, 0), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
- expected: FAIL
-
- [paras[1\].firstChild.deleteData(1, 0), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.deleteData(2, 0), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.deleteData(3, 0), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.deleteData(376, 631), with selected range on paras[1\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[1\].firstChild.deleteData(0, 631), with selected range collapsed at (paras[1\].firstChild, 0)]
- expected: FAIL
-
- [paras[1\].firstChild.deleteData(1, 631), with selected range collapsed at (paras[1\].firstChild, 1)]
- expected: FAIL
-
- [paras[1\].firstChild.deleteData(paras[1\].firstChild.length, 631), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
- expected: FAIL
-
- [paras[1\].firstChild.deleteData(1, 631), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.deleteData(2, 631), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.deleteData(3, 631), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.deleteData(376, 2), with selected range on foreignTextNode from 0 to 1]
- expected: FAIL
-
- [foreignTextNode.deleteData(0, 2), with selected range collapsed at (foreignTextNode, 0)]
- expected: FAIL
-
- [foreignTextNode.deleteData(1, 2), with selected range collapsed at (foreignTextNode, 1)]
- expected: FAIL
-
- [foreignTextNode.deleteData(foreignTextNode.length, 2), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
- expected: FAIL
-
- [foreignTextNode.deleteData(1, 2), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.deleteData(2, 2), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.deleteData(3, 2), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.deleteData(376, 0), with selected range on foreignTextNode from 0 to 1]
- expected: FAIL
-
- [foreignTextNode.deleteData(0, 0), with selected range collapsed at (foreignTextNode, 0)]
- expected: FAIL
-
- [foreignTextNode.deleteData(1, 0), with selected range collapsed at (foreignTextNode, 1)]
- expected: FAIL
-
- [foreignTextNode.deleteData(foreignTextNode.length, 0), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
- expected: FAIL
-
- [foreignTextNode.deleteData(1, 0), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.deleteData(2, 0), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.deleteData(3, 0), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.deleteData(376, 631), with selected range on foreignTextNode from 0 to 1]
- expected: FAIL
-
- [foreignTextNode.deleteData(0, 631), with selected range collapsed at (foreignTextNode, 0)]
- expected: FAIL
-
- [foreignTextNode.deleteData(1, 631), with selected range collapsed at (foreignTextNode, 1)]
- expected: FAIL
-
- [foreignTextNode.deleteData(foreignTextNode.length, 631), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
- expected: FAIL
-
- [foreignTextNode.deleteData(1, 631), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.deleteData(2, 631), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.deleteData(3, 631), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.deleteData(376, 2), with selected range on xmlTextNode from 0 to 1]
- expected: FAIL
-
- [xmlTextNode.deleteData(0, 2), with selected range collapsed at (xmlTextNode, 0)]
- expected: FAIL
-
- [xmlTextNode.deleteData(1, 2), with selected range collapsed at (xmlTextNode, 1)]
- expected: FAIL
-
- [xmlTextNode.deleteData(xmlTextNode.length, 2), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
- expected: FAIL
-
- [xmlTextNode.deleteData(1, 2), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.deleteData(2, 2), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.deleteData(3, 2), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.deleteData(376, 0), with selected range on xmlTextNode from 0 to 1]
- expected: FAIL
-
- [xmlTextNode.deleteData(0, 0), with selected range collapsed at (xmlTextNode, 0)]
- expected: FAIL
-
- [xmlTextNode.deleteData(1, 0), with selected range collapsed at (xmlTextNode, 1)]
- expected: FAIL
-
- [xmlTextNode.deleteData(xmlTextNode.length, 0), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
- expected: FAIL
-
- [xmlTextNode.deleteData(1, 0), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.deleteData(2, 0), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.deleteData(3, 0), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.deleteData(376, 631), with selected range on xmlTextNode from 0 to 1]
- expected: FAIL
-
- [xmlTextNode.deleteData(0, 631), with selected range collapsed at (xmlTextNode, 0)]
- expected: FAIL
-
- [xmlTextNode.deleteData(1, 631), with selected range collapsed at (xmlTextNode, 1)]
- expected: FAIL
-
- [xmlTextNode.deleteData(xmlTextNode.length, 631), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
- expected: FAIL
-
- [xmlTextNode.deleteData(1, 631), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.deleteData(2, 631), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.deleteData(3, 631), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.deleteData(376, 2), with selected range on detachedTextNode from 0 to 1]
- expected: FAIL
-
- [detachedTextNode.deleteData(0, 2), with selected range collapsed at (detachedTextNode, 0)]
- expected: FAIL
-
- [detachedTextNode.deleteData(1, 2), with selected range collapsed at (detachedTextNode, 1)]
- expected: FAIL
-
- [detachedTextNode.deleteData(detachedTextNode.length, 2), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
- expected: FAIL
-
- [detachedTextNode.deleteData(1, 2), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.deleteData(2, 2), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.deleteData(3, 2), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.deleteData(376, 0), with selected range on detachedTextNode from 0 to 1]
- expected: FAIL
-
- [detachedTextNode.deleteData(0, 0), with selected range collapsed at (detachedTextNode, 0)]
- expected: FAIL
-
- [detachedTextNode.deleteData(1, 0), with selected range collapsed at (detachedTextNode, 1)]
- expected: FAIL
-
- [detachedTextNode.deleteData(detachedTextNode.length, 0), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
- expected: FAIL
-
- [detachedTextNode.deleteData(1, 0), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.deleteData(2, 0), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.deleteData(3, 0), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.deleteData(376, 631), with selected range on detachedTextNode from 0 to 1]
- expected: FAIL
-
- [detachedTextNode.deleteData(0, 631), with selected range collapsed at (detachedTextNode, 0)]
- expected: FAIL
-
- [detachedTextNode.deleteData(1, 631), with selected range collapsed at (detachedTextNode, 1)]
- expected: FAIL
-
- [detachedTextNode.deleteData(detachedTextNode.length, 631), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
- expected: FAIL
-
- [detachedTextNode.deleteData(1, 631), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.deleteData(2, 631), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.deleteData(3, 631), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.deleteData(376, 2), with selected range on detachedForeignTextNode from 0 to 1]
- expected: FAIL
-
- [detachedForeignTextNode.deleteData(0, 2), with selected range collapsed at (detachedForeignTextNode, 0)]
- expected: FAIL
-
- [detachedForeignTextNode.deleteData(1, 2), with selected range collapsed at (detachedForeignTextNode, 1)]
- expected: FAIL
-
- [detachedForeignTextNode.deleteData(detachedForeignTextNode.length, 2), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
- expected: FAIL
-
- [detachedForeignTextNode.deleteData(1, 2), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.deleteData(2, 2), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.deleteData(3, 2), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.deleteData(376, 0), with selected range on detachedForeignTextNode from 0 to 1]
- expected: FAIL
-
- [detachedForeignTextNode.deleteData(0, 0), with selected range collapsed at (detachedForeignTextNode, 0)]
- expected: FAIL
-
- [detachedForeignTextNode.deleteData(1, 0), with selected range collapsed at (detachedForeignTextNode, 1)]
- expected: FAIL
-
- [detachedForeignTextNode.deleteData(detachedForeignTextNode.length, 0), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
- expected: FAIL
-
- [detachedForeignTextNode.deleteData(1, 0), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.deleteData(2, 0), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.deleteData(3, 0), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.deleteData(376, 631), with selected range on detachedForeignTextNode from 0 to 1]
- expected: FAIL
-
- [detachedForeignTextNode.deleteData(0, 631), with selected range collapsed at (detachedForeignTextNode, 0)]
- expected: FAIL
-
- [detachedForeignTextNode.deleteData(1, 631), with selected range collapsed at (detachedForeignTextNode, 1)]
- expected: FAIL
-
- [detachedForeignTextNode.deleteData(detachedForeignTextNode.length, 631), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
- expected: FAIL
-
- [detachedForeignTextNode.deleteData(1, 631), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.deleteData(2, 631), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.deleteData(3, 631), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.deleteData(376, 2), with selected range on detachedXmlTextNode from 0 to 1]
- expected: FAIL
-
- [detachedXmlTextNode.deleteData(0, 2), with selected range collapsed at (detachedXmlTextNode, 0)]
- expected: FAIL
-
- [detachedXmlTextNode.deleteData(1, 2), with selected range collapsed at (detachedXmlTextNode, 1)]
- expected: FAIL
-
- [detachedXmlTextNode.deleteData(detachedXmlTextNode.length, 2), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
- expected: FAIL
-
- [detachedXmlTextNode.deleteData(1, 2), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.deleteData(2, 2), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.deleteData(3, 2), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.deleteData(376, 0), with selected range on detachedXmlTextNode from 0 to 1]
- expected: FAIL
-
- [detachedXmlTextNode.deleteData(0, 0), with selected range collapsed at (detachedXmlTextNode, 0)]
- expected: FAIL
-
- [detachedXmlTextNode.deleteData(1, 0), with selected range collapsed at (detachedXmlTextNode, 1)]
- expected: FAIL
-
- [detachedXmlTextNode.deleteData(detachedXmlTextNode.length, 0), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
- expected: FAIL
-
- [detachedXmlTextNode.deleteData(1, 0), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.deleteData(2, 0), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.deleteData(3, 0), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.deleteData(376, 631), with selected range on detachedXmlTextNode from 0 to 1]
- expected: FAIL
-
- [detachedXmlTextNode.deleteData(0, 631), with selected range collapsed at (detachedXmlTextNode, 0)]
- expected: FAIL
-
- [detachedXmlTextNode.deleteData(1, 631), with selected range collapsed at (detachedXmlTextNode, 1)]
- expected: FAIL
-
- [detachedXmlTextNode.deleteData(detachedXmlTextNode.length, 631), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
- expected: FAIL
-
- [detachedXmlTextNode.deleteData(1, 631), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.deleteData(2, 631), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.deleteData(3, 631), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [comment.deleteData(376, 2), with selected range on comment from 0 to 1]
- expected: FAIL
-
- [comment.deleteData(0, 2), with selected range collapsed at (comment, 0)]
- expected: FAIL
-
- [comment.deleteData(1, 2), with selected range collapsed at (comment, 1)]
- expected: FAIL
-
- [comment.deleteData(comment.length, 2), with selected range collapsed at (comment, comment.length)]
- expected: FAIL
-
- [comment.deleteData(1, 2), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.deleteData(2, 2), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.deleteData(3, 2), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.deleteData(376, 0), with selected range on comment from 0 to 1]
- expected: FAIL
-
- [comment.deleteData(0, 0), with selected range collapsed at (comment, 0)]
- expected: FAIL
-
- [comment.deleteData(1, 0), with selected range collapsed at (comment, 1)]
- expected: FAIL
-
- [comment.deleteData(comment.length, 0), with selected range collapsed at (comment, comment.length)]
- expected: FAIL
-
- [comment.deleteData(1, 0), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.deleteData(2, 0), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.deleteData(3, 0), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.deleteData(376, 631), with selected range on comment from 0 to 1]
- expected: FAIL
-
- [comment.deleteData(0, 631), with selected range collapsed at (comment, 0)]
- expected: FAIL
-
- [comment.deleteData(1, 631), with selected range collapsed at (comment, 1)]
- expected: FAIL
-
- [comment.deleteData(comment.length, 631), with selected range collapsed at (comment, comment.length)]
- expected: FAIL
-
- [comment.deleteData(1, 631), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.deleteData(2, 631), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.deleteData(3, 631), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [foreignComment.deleteData(376, 2), with selected range on foreignComment from 0 to 1]
- expected: FAIL
-
- [foreignComment.deleteData(0, 2), with selected range collapsed at (foreignComment, 0)]
- expected: FAIL
-
- [foreignComment.deleteData(1, 2), with selected range collapsed at (foreignComment, 1)]
- expected: FAIL
-
- [foreignComment.deleteData(foreignComment.length, 2), with selected range collapsed at (foreignComment, foreignComment.length)]
- expected: FAIL
-
- [foreignComment.deleteData(1, 2), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.deleteData(2, 2), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.deleteData(3, 2), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.deleteData(376, 0), with selected range on foreignComment from 0 to 1]
- expected: FAIL
-
- [foreignComment.deleteData(0, 0), with selected range collapsed at (foreignComment, 0)]
- expected: FAIL
-
- [foreignComment.deleteData(1, 0), with selected range collapsed at (foreignComment, 1)]
- expected: FAIL
-
- [foreignComment.deleteData(foreignComment.length, 0), with selected range collapsed at (foreignComment, foreignComment.length)]
- expected: FAIL
-
- [foreignComment.deleteData(1, 0), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.deleteData(2, 0), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.deleteData(3, 0), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.deleteData(376, 631), with selected range on foreignComment from 0 to 1]
- expected: FAIL
-
- [foreignComment.deleteData(0, 631), with selected range collapsed at (foreignComment, 0)]
- expected: FAIL
-
- [foreignComment.deleteData(1, 631), with selected range collapsed at (foreignComment, 1)]
- expected: FAIL
-
- [foreignComment.deleteData(foreignComment.length, 631), with selected range collapsed at (foreignComment, foreignComment.length)]
- expected: FAIL
-
- [foreignComment.deleteData(1, 631), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.deleteData(2, 631), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.deleteData(3, 631), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.deleteData(376, 2), with selected range on xmlComment from 0 to 1]
- expected: FAIL
-
- [xmlComment.deleteData(0, 2), with selected range collapsed at (xmlComment, 0)]
- expected: FAIL
-
- [xmlComment.deleteData(1, 2), with selected range collapsed at (xmlComment, 1)]
- expected: FAIL
-
- [xmlComment.deleteData(xmlComment.length, 2), with selected range collapsed at (xmlComment, xmlComment.length)]
- expected: FAIL
-
- [xmlComment.deleteData(1, 2), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.deleteData(2, 2), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.deleteData(3, 2), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.deleteData(376, 0), with selected range on xmlComment from 0 to 1]
- expected: FAIL
-
- [xmlComment.deleteData(0, 0), with selected range collapsed at (xmlComment, 0)]
- expected: FAIL
-
- [xmlComment.deleteData(1, 0), with selected range collapsed at (xmlComment, 1)]
- expected: FAIL
-
- [xmlComment.deleteData(xmlComment.length, 0), with selected range collapsed at (xmlComment, xmlComment.length)]
- expected: FAIL
-
- [xmlComment.deleteData(1, 0), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.deleteData(2, 0), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.deleteData(3, 0), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.deleteData(376, 631), with selected range on xmlComment from 0 to 1]
- expected: FAIL
-
- [xmlComment.deleteData(0, 631), with selected range collapsed at (xmlComment, 0)]
- expected: FAIL
-
- [xmlComment.deleteData(1, 631), with selected range collapsed at (xmlComment, 1)]
- expected: FAIL
-
- [xmlComment.deleteData(xmlComment.length, 631), with selected range collapsed at (xmlComment, xmlComment.length)]
- expected: FAIL
-
- [xmlComment.deleteData(1, 631), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.deleteData(2, 631), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.deleteData(3, 631), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.deleteData(376, 2), with selected range on detachedComment from 0 to 1]
- expected: FAIL
-
- [detachedComment.deleteData(0, 2), with selected range collapsed at (detachedComment, 0)]
- expected: FAIL
-
- [detachedComment.deleteData(1, 2), with selected range collapsed at (detachedComment, 1)]
- expected: FAIL
-
- [detachedComment.deleteData(detachedComment.length, 2), with selected range collapsed at (detachedComment, detachedComment.length)]
- expected: FAIL
-
- [detachedComment.deleteData(1, 2), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.deleteData(2, 2), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.deleteData(3, 2), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.deleteData(376, 0), with selected range on detachedComment from 0 to 1]
- expected: FAIL
-
- [detachedComment.deleteData(0, 0), with selected range collapsed at (detachedComment, 0)]
- expected: FAIL
-
- [detachedComment.deleteData(1, 0), with selected range collapsed at (detachedComment, 1)]
- expected: FAIL
-
- [detachedComment.deleteData(detachedComment.length, 0), with selected range collapsed at (detachedComment, detachedComment.length)]
- expected: FAIL
-
- [detachedComment.deleteData(1, 0), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.deleteData(2, 0), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.deleteData(3, 0), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.deleteData(376, 631), with selected range on detachedComment from 0 to 1]
- expected: FAIL
-
- [detachedComment.deleteData(0, 631), with selected range collapsed at (detachedComment, 0)]
- expected: FAIL
-
- [detachedComment.deleteData(1, 631), with selected range collapsed at (detachedComment, 1)]
- expected: FAIL
-
- [detachedComment.deleteData(detachedComment.length, 631), with selected range collapsed at (detachedComment, detachedComment.length)]
- expected: FAIL
-
- [detachedComment.deleteData(1, 631), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.deleteData(2, 631), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.deleteData(3, 631), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.deleteData(376, 2), with selected range on detachedForeignComment from 0 to 1]
- expected: FAIL
-
- [detachedForeignComment.deleteData(0, 2), with selected range collapsed at (detachedForeignComment, 0)]
- expected: FAIL
-
- [detachedForeignComment.deleteData(1, 2), with selected range collapsed at (detachedForeignComment, 1)]
- expected: FAIL
-
- [detachedForeignComment.deleteData(detachedForeignComment.length, 2), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
- expected: FAIL
-
- [detachedForeignComment.deleteData(1, 2), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.deleteData(2, 2), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.deleteData(3, 2), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.deleteData(376, 0), with selected range on detachedForeignComment from 0 to 1]
- expected: FAIL
-
- [detachedForeignComment.deleteData(0, 0), with selected range collapsed at (detachedForeignComment, 0)]
- expected: FAIL
-
- [detachedForeignComment.deleteData(1, 0), with selected range collapsed at (detachedForeignComment, 1)]
- expected: FAIL
-
- [detachedForeignComment.deleteData(detachedForeignComment.length, 0), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
- expected: FAIL
-
- [detachedForeignComment.deleteData(1, 0), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.deleteData(2, 0), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.deleteData(3, 0), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.deleteData(376, 631), with selected range on detachedForeignComment from 0 to 1]
- expected: FAIL
-
- [detachedForeignComment.deleteData(0, 631), with selected range collapsed at (detachedForeignComment, 0)]
- expected: FAIL
-
- [detachedForeignComment.deleteData(1, 631), with selected range collapsed at (detachedForeignComment, 1)]
- expected: FAIL
-
- [detachedForeignComment.deleteData(detachedForeignComment.length, 631), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
- expected: FAIL
-
- [detachedForeignComment.deleteData(1, 631), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.deleteData(2, 631), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.deleteData(3, 631), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.deleteData(376, 2), with selected range on detachedXmlComment from 0 to 1]
- expected: FAIL
-
- [detachedXmlComment.deleteData(0, 2), with selected range collapsed at (detachedXmlComment, 0)]
- expected: FAIL
-
- [detachedXmlComment.deleteData(1, 2), with selected range collapsed at (detachedXmlComment, 1)]
- expected: FAIL
-
- [detachedXmlComment.deleteData(detachedXmlComment.length, 2), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
- expected: FAIL
-
- [detachedXmlComment.deleteData(1, 2), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.deleteData(2, 2), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.deleteData(3, 2), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.deleteData(376, 0), with selected range on detachedXmlComment from 0 to 1]
- expected: FAIL
-
- [detachedXmlComment.deleteData(0, 0), with selected range collapsed at (detachedXmlComment, 0)]
- expected: FAIL
-
- [detachedXmlComment.deleteData(1, 0), with selected range collapsed at (detachedXmlComment, 1)]
- expected: FAIL
-
- [detachedXmlComment.deleteData(detachedXmlComment.length, 0), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
- expected: FAIL
-
- [detachedXmlComment.deleteData(1, 0), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.deleteData(2, 0), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.deleteData(3, 0), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.deleteData(376, 631), with selected range on detachedXmlComment from 0 to 1]
- expected: FAIL
-
- [detachedXmlComment.deleteData(0, 631), with selected range collapsed at (detachedXmlComment, 0)]
- expected: FAIL
-
- [detachedXmlComment.deleteData(1, 631), with selected range collapsed at (detachedXmlComment, 1)]
- expected: FAIL
-
- [detachedXmlComment.deleteData(detachedXmlComment.length, 631), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
- expected: FAIL
-
- [detachedXmlComment.deleteData(1, 631), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.deleteData(2, 631), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.deleteData(3, 631), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(1, 2), with selected range collapsed at (paras[0\], 0)]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(1, 2), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(1, 2), with selected range collapsed at (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(1, 2), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(2, 2), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(3, 2), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(1, 2), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(2, 2), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
- expected: FAIL
-
- [paras[0\].firstChild.deleteData(3, 2), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(376, 0, "foo"), with selected range on paras[0\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(0, 0, "foo"), with selected range collapsed at (paras[0\].firstChild, 0)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 0, "foo"), with selected range collapsed at (paras[0\].firstChild, 1)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(paras[0\].firstChild.length, 0, "foo"), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 0, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(2, 0, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(3, 0, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(376, 0, ""), with selected range on paras[0\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(0, 0, ""), with selected range collapsed at (paras[0\].firstChild, 0)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 0, ""), with selected range collapsed at (paras[0\].firstChild, 1)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(paras[0\].firstChild.length, 0, ""), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 0, ""), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(2, 0, ""), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(3, 0, ""), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(376, 1, "foo"), with selected range on paras[0\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(0, 1, "foo"), with selected range collapsed at (paras[0\].firstChild, 0)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 1, "foo"), with selected range collapsed at (paras[0\].firstChild, 1)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(paras[0\].firstChild.length, 1, "foo"), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 1, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(2, 1, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(3, 1, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(376, 1, ""), with selected range on paras[0\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(0, 1, ""), with selected range collapsed at (paras[0\].firstChild, 0)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 1, ""), with selected range collapsed at (paras[0\].firstChild, 1)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(paras[0\].firstChild.length, 1, ""), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 1, ""), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(2, 1, ""), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(3, 1, ""), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(376, 47, "foo"), with selected range on paras[0\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(0, 47, "foo"), with selected range collapsed at (paras[0\].firstChild, 0)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 47, "foo"), with selected range collapsed at (paras[0\].firstChild, 1)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(paras[0\].firstChild.length, 47, "foo"), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 47, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(2, 47, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(3, 47, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(376, 47, ""), with selected range on paras[0\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(0, 47, ""), with selected range collapsed at (paras[0\].firstChild, 0)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 47, ""), with selected range collapsed at (paras[0\].firstChild, 1)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(paras[0\].firstChild.length, 47, ""), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 47, ""), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(2, 47, ""), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(3, 47, ""), with selected range on paras[0\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(376, 0, "foo"), with selected range on paras[1\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(0, 0, "foo"), with selected range collapsed at (paras[1\].firstChild, 0)]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(1, 0, "foo"), with selected range collapsed at (paras[1\].firstChild, 1)]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(paras[1\].firstChild.length, 0, "foo"), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(1, 0, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(2, 0, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(3, 0, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(376, 0, ""), with selected range on paras[1\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(0, 0, ""), with selected range collapsed at (paras[1\].firstChild, 0)]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(1, 0, ""), with selected range collapsed at (paras[1\].firstChild, 1)]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(paras[1\].firstChild.length, 0, ""), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(1, 0, ""), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(2, 0, ""), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(3, 0, ""), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(376, 1, "foo"), with selected range on paras[1\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(0, 1, "foo"), with selected range collapsed at (paras[1\].firstChild, 0)]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(1, 1, "foo"), with selected range collapsed at (paras[1\].firstChild, 1)]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(paras[1\].firstChild.length, 1, "foo"), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(1, 1, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(2, 1, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(3, 1, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(376, 1, ""), with selected range on paras[1\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(0, 1, ""), with selected range collapsed at (paras[1\].firstChild, 0)]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(1, 1, ""), with selected range collapsed at (paras[1\].firstChild, 1)]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(paras[1\].firstChild.length, 1, ""), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(1, 1, ""), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(2, 1, ""), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(3, 1, ""), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(376, 47, "foo"), with selected range on paras[1\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(0, 47, "foo"), with selected range collapsed at (paras[1\].firstChild, 0)]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(1, 47, "foo"), with selected range collapsed at (paras[1\].firstChild, 1)]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(paras[1\].firstChild.length, 47, "foo"), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(1, 47, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(2, 47, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(3, 47, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(376, 47, ""), with selected range on paras[1\].firstChild from 0 to 1]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(0, 47, ""), with selected range collapsed at (paras[1\].firstChild, 0)]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(1, 47, ""), with selected range collapsed at (paras[1\].firstChild, 1)]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(paras[1\].firstChild.length, 47, ""), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(1, 47, ""), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(2, 47, ""), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [paras[1\].firstChild.replaceData(3, 47, ""), with selected range on paras[1\].firstChild from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.replaceData(376, 0, "foo"), with selected range on foreignTextNode from 0 to 1]
- expected: FAIL
-
- [foreignTextNode.replaceData(0, 0, "foo"), with selected range collapsed at (foreignTextNode, 0)]
- expected: FAIL
-
- [foreignTextNode.replaceData(1, 0, "foo"), with selected range collapsed at (foreignTextNode, 1)]
- expected: FAIL
-
- [foreignTextNode.replaceData(foreignTextNode.length, 0, "foo"), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
- expected: FAIL
-
- [foreignTextNode.replaceData(1, 0, "foo"), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.replaceData(2, 0, "foo"), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.replaceData(3, 0, "foo"), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.replaceData(376, 0, ""), with selected range on foreignTextNode from 0 to 1]
- expected: FAIL
-
- [foreignTextNode.replaceData(0, 0, ""), with selected range collapsed at (foreignTextNode, 0)]
- expected: FAIL
-
- [foreignTextNode.replaceData(1, 0, ""), with selected range collapsed at (foreignTextNode, 1)]
- expected: FAIL
-
- [foreignTextNode.replaceData(foreignTextNode.length, 0, ""), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
- expected: FAIL
-
- [foreignTextNode.replaceData(1, 0, ""), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.replaceData(2, 0, ""), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.replaceData(3, 0, ""), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.replaceData(376, 1, "foo"), with selected range on foreignTextNode from 0 to 1]
- expected: FAIL
-
- [foreignTextNode.replaceData(0, 1, "foo"), with selected range collapsed at (foreignTextNode, 0)]
- expected: FAIL
-
- [foreignTextNode.replaceData(1, 1, "foo"), with selected range collapsed at (foreignTextNode, 1)]
- expected: FAIL
-
- [foreignTextNode.replaceData(foreignTextNode.length, 1, "foo"), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
- expected: FAIL
-
- [foreignTextNode.replaceData(1, 1, "foo"), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.replaceData(2, 1, "foo"), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.replaceData(3, 1, "foo"), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.replaceData(376, 1, ""), with selected range on foreignTextNode from 0 to 1]
- expected: FAIL
-
- [foreignTextNode.replaceData(0, 1, ""), with selected range collapsed at (foreignTextNode, 0)]
- expected: FAIL
-
- [foreignTextNode.replaceData(1, 1, ""), with selected range collapsed at (foreignTextNode, 1)]
- expected: FAIL
-
- [foreignTextNode.replaceData(foreignTextNode.length, 1, ""), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
- expected: FAIL
-
- [foreignTextNode.replaceData(1, 1, ""), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.replaceData(2, 1, ""), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.replaceData(3, 1, ""), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.replaceData(376, 47, "foo"), with selected range on foreignTextNode from 0 to 1]
- expected: FAIL
-
- [foreignTextNode.replaceData(0, 47, "foo"), with selected range collapsed at (foreignTextNode, 0)]
- expected: FAIL
-
- [foreignTextNode.replaceData(1, 47, "foo"), with selected range collapsed at (foreignTextNode, 1)]
- expected: FAIL
-
- [foreignTextNode.replaceData(foreignTextNode.length, 47, "foo"), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
- expected: FAIL
-
- [foreignTextNode.replaceData(1, 47, "foo"), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.replaceData(2, 47, "foo"), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.replaceData(3, 47, "foo"), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.replaceData(376, 47, ""), with selected range on foreignTextNode from 0 to 1]
- expected: FAIL
-
- [foreignTextNode.replaceData(0, 47, ""), with selected range collapsed at (foreignTextNode, 0)]
- expected: FAIL
-
- [foreignTextNode.replaceData(1, 47, ""), with selected range collapsed at (foreignTextNode, 1)]
- expected: FAIL
-
- [foreignTextNode.replaceData(foreignTextNode.length, 47, ""), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
- expected: FAIL
-
- [foreignTextNode.replaceData(1, 47, ""), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.replaceData(2, 47, ""), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [foreignTextNode.replaceData(3, 47, ""), with selected range on foreignTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.replaceData(376, 0, "foo"), with selected range on xmlTextNode from 0 to 1]
- expected: FAIL
-
- [xmlTextNode.replaceData(0, 0, "foo"), with selected range collapsed at (xmlTextNode, 0)]
- expected: FAIL
-
- [xmlTextNode.replaceData(1, 0, "foo"), with selected range collapsed at (xmlTextNode, 1)]
- expected: FAIL
-
- [xmlTextNode.replaceData(xmlTextNode.length, 0, "foo"), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
- expected: FAIL
-
- [xmlTextNode.replaceData(1, 0, "foo"), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.replaceData(2, 0, "foo"), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.replaceData(3, 0, "foo"), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.replaceData(376, 0, ""), with selected range on xmlTextNode from 0 to 1]
- expected: FAIL
-
- [xmlTextNode.replaceData(0, 0, ""), with selected range collapsed at (xmlTextNode, 0)]
- expected: FAIL
-
- [xmlTextNode.replaceData(1, 0, ""), with selected range collapsed at (xmlTextNode, 1)]
- expected: FAIL
-
- [xmlTextNode.replaceData(xmlTextNode.length, 0, ""), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
- expected: FAIL
-
- [xmlTextNode.replaceData(1, 0, ""), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.replaceData(2, 0, ""), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.replaceData(3, 0, ""), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.replaceData(376, 1, "foo"), with selected range on xmlTextNode from 0 to 1]
- expected: FAIL
-
- [xmlTextNode.replaceData(0, 1, "foo"), with selected range collapsed at (xmlTextNode, 0)]
- expected: FAIL
-
- [xmlTextNode.replaceData(1, 1, "foo"), with selected range collapsed at (xmlTextNode, 1)]
- expected: FAIL
-
- [xmlTextNode.replaceData(xmlTextNode.length, 1, "foo"), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
- expected: FAIL
-
- [xmlTextNode.replaceData(1, 1, "foo"), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.replaceData(2, 1, "foo"), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.replaceData(3, 1, "foo"), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.replaceData(376, 1, ""), with selected range on xmlTextNode from 0 to 1]
- expected: FAIL
-
- [xmlTextNode.replaceData(0, 1, ""), with selected range collapsed at (xmlTextNode, 0)]
- expected: FAIL
-
- [xmlTextNode.replaceData(1, 1, ""), with selected range collapsed at (xmlTextNode, 1)]
- expected: FAIL
-
- [xmlTextNode.replaceData(xmlTextNode.length, 1, ""), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
- expected: FAIL
-
- [xmlTextNode.replaceData(1, 1, ""), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.replaceData(2, 1, ""), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.replaceData(3, 1, ""), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.replaceData(376, 47, "foo"), with selected range on xmlTextNode from 0 to 1]
- expected: FAIL
-
- [xmlTextNode.replaceData(0, 47, "foo"), with selected range collapsed at (xmlTextNode, 0)]
- expected: FAIL
-
- [xmlTextNode.replaceData(1, 47, "foo"), with selected range collapsed at (xmlTextNode, 1)]
- expected: FAIL
-
- [xmlTextNode.replaceData(xmlTextNode.length, 47, "foo"), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
- expected: FAIL
-
- [xmlTextNode.replaceData(1, 47, "foo"), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.replaceData(2, 47, "foo"), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.replaceData(3, 47, "foo"), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.replaceData(376, 47, ""), with selected range on xmlTextNode from 0 to 1]
- expected: FAIL
-
- [xmlTextNode.replaceData(0, 47, ""), with selected range collapsed at (xmlTextNode, 0)]
- expected: FAIL
-
- [xmlTextNode.replaceData(1, 47, ""), with selected range collapsed at (xmlTextNode, 1)]
- expected: FAIL
-
- [xmlTextNode.replaceData(xmlTextNode.length, 47, ""), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
- expected: FAIL
-
- [xmlTextNode.replaceData(1, 47, ""), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.replaceData(2, 47, ""), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [xmlTextNode.replaceData(3, 47, ""), with selected range on xmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.replaceData(376, 0, "foo"), with selected range on detachedTextNode from 0 to 1]
- expected: FAIL
-
- [detachedTextNode.replaceData(0, 0, "foo"), with selected range collapsed at (detachedTextNode, 0)]
- expected: FAIL
-
- [detachedTextNode.replaceData(1, 0, "foo"), with selected range collapsed at (detachedTextNode, 1)]
- expected: FAIL
-
- [detachedTextNode.replaceData(detachedTextNode.length, 0, "foo"), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
- expected: FAIL
-
- [detachedTextNode.replaceData(1, 0, "foo"), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.replaceData(2, 0, "foo"), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.replaceData(3, 0, "foo"), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.replaceData(376, 0, ""), with selected range on detachedTextNode from 0 to 1]
- expected: FAIL
-
- [detachedTextNode.replaceData(0, 0, ""), with selected range collapsed at (detachedTextNode, 0)]
- expected: FAIL
-
- [detachedTextNode.replaceData(1, 0, ""), with selected range collapsed at (detachedTextNode, 1)]
- expected: FAIL
-
- [detachedTextNode.replaceData(detachedTextNode.length, 0, ""), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
- expected: FAIL
-
- [detachedTextNode.replaceData(1, 0, ""), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.replaceData(2, 0, ""), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.replaceData(3, 0, ""), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.replaceData(376, 1, "foo"), with selected range on detachedTextNode from 0 to 1]
- expected: FAIL
-
- [detachedTextNode.replaceData(0, 1, "foo"), with selected range collapsed at (detachedTextNode, 0)]
- expected: FAIL
-
- [detachedTextNode.replaceData(1, 1, "foo"), with selected range collapsed at (detachedTextNode, 1)]
- expected: FAIL
-
- [detachedTextNode.replaceData(detachedTextNode.length, 1, "foo"), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
- expected: FAIL
-
- [detachedTextNode.replaceData(1, 1, "foo"), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.replaceData(2, 1, "foo"), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.replaceData(3, 1, "foo"), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.replaceData(376, 1, ""), with selected range on detachedTextNode from 0 to 1]
- expected: FAIL
-
- [detachedTextNode.replaceData(0, 1, ""), with selected range collapsed at (detachedTextNode, 0)]
- expected: FAIL
-
- [detachedTextNode.replaceData(1, 1, ""), with selected range collapsed at (detachedTextNode, 1)]
- expected: FAIL
-
- [detachedTextNode.replaceData(detachedTextNode.length, 1, ""), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
- expected: FAIL
-
- [detachedTextNode.replaceData(1, 1, ""), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.replaceData(2, 1, ""), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.replaceData(3, 1, ""), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.replaceData(376, 47, "foo"), with selected range on detachedTextNode from 0 to 1]
- expected: FAIL
-
- [detachedTextNode.replaceData(0, 47, "foo"), with selected range collapsed at (detachedTextNode, 0)]
- expected: FAIL
-
- [detachedTextNode.replaceData(1, 47, "foo"), with selected range collapsed at (detachedTextNode, 1)]
- expected: FAIL
-
- [detachedTextNode.replaceData(detachedTextNode.length, 47, "foo"), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
- expected: FAIL
-
- [detachedTextNode.replaceData(1, 47, "foo"), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.replaceData(2, 47, "foo"), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.replaceData(3, 47, "foo"), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.replaceData(376, 47, ""), with selected range on detachedTextNode from 0 to 1]
- expected: FAIL
-
- [detachedTextNode.replaceData(0, 47, ""), with selected range collapsed at (detachedTextNode, 0)]
- expected: FAIL
-
- [detachedTextNode.replaceData(1, 47, ""), with selected range collapsed at (detachedTextNode, 1)]
- expected: FAIL
-
- [detachedTextNode.replaceData(detachedTextNode.length, 47, ""), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
- expected: FAIL
-
- [detachedTextNode.replaceData(1, 47, ""), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.replaceData(2, 47, ""), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedTextNode.replaceData(3, 47, ""), with selected range on detachedTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(376, 0, "foo"), with selected range on detachedForeignTextNode from 0 to 1]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(0, 0, "foo"), with selected range collapsed at (detachedForeignTextNode, 0)]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(1, 0, "foo"), with selected range collapsed at (detachedForeignTextNode, 1)]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(detachedForeignTextNode.length, 0, "foo"), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(1, 0, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(2, 0, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(3, 0, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(376, 0, ""), with selected range on detachedForeignTextNode from 0 to 1]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(0, 0, ""), with selected range collapsed at (detachedForeignTextNode, 0)]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(1, 0, ""), with selected range collapsed at (detachedForeignTextNode, 1)]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(detachedForeignTextNode.length, 0, ""), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(1, 0, ""), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(2, 0, ""), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(3, 0, ""), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(376, 1, "foo"), with selected range on detachedForeignTextNode from 0 to 1]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(0, 1, "foo"), with selected range collapsed at (detachedForeignTextNode, 0)]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(1, 1, "foo"), with selected range collapsed at (detachedForeignTextNode, 1)]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(detachedForeignTextNode.length, 1, "foo"), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(1, 1, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(2, 1, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(3, 1, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(376, 1, ""), with selected range on detachedForeignTextNode from 0 to 1]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(0, 1, ""), with selected range collapsed at (detachedForeignTextNode, 0)]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(1, 1, ""), with selected range collapsed at (detachedForeignTextNode, 1)]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(detachedForeignTextNode.length, 1, ""), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(1, 1, ""), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(2, 1, ""), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(3, 1, ""), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(376, 47, "foo"), with selected range on detachedForeignTextNode from 0 to 1]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(0, 47, "foo"), with selected range collapsed at (detachedForeignTextNode, 0)]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(1, 47, "foo"), with selected range collapsed at (detachedForeignTextNode, 1)]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(detachedForeignTextNode.length, 47, "foo"), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(1, 47, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(2, 47, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(3, 47, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(376, 47, ""), with selected range on detachedForeignTextNode from 0 to 1]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(0, 47, ""), with selected range collapsed at (detachedForeignTextNode, 0)]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(1, 47, ""), with selected range collapsed at (detachedForeignTextNode, 1)]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(detachedForeignTextNode.length, 47, ""), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(1, 47, ""), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(2, 47, ""), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedForeignTextNode.replaceData(3, 47, ""), with selected range on detachedForeignTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(376, 0, "foo"), with selected range on detachedXmlTextNode from 0 to 1]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(0, 0, "foo"), with selected range collapsed at (detachedXmlTextNode, 0)]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(1, 0, "foo"), with selected range collapsed at (detachedXmlTextNode, 1)]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(detachedXmlTextNode.length, 0, "foo"), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(1, 0, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(2, 0, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(3, 0, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(376, 0, ""), with selected range on detachedXmlTextNode from 0 to 1]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(0, 0, ""), with selected range collapsed at (detachedXmlTextNode, 0)]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(1, 0, ""), with selected range collapsed at (detachedXmlTextNode, 1)]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(detachedXmlTextNode.length, 0, ""), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(1, 0, ""), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(2, 0, ""), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(3, 0, ""), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(376, 1, "foo"), with selected range on detachedXmlTextNode from 0 to 1]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(0, 1, "foo"), with selected range collapsed at (detachedXmlTextNode, 0)]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(1, 1, "foo"), with selected range collapsed at (detachedXmlTextNode, 1)]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(detachedXmlTextNode.length, 1, "foo"), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(1, 1, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(2, 1, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(3, 1, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(376, 1, ""), with selected range on detachedXmlTextNode from 0 to 1]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(0, 1, ""), with selected range collapsed at (detachedXmlTextNode, 0)]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(1, 1, ""), with selected range collapsed at (detachedXmlTextNode, 1)]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(detachedXmlTextNode.length, 1, ""), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(1, 1, ""), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(2, 1, ""), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(3, 1, ""), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(376, 47, "foo"), with selected range on detachedXmlTextNode from 0 to 1]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(0, 47, "foo"), with selected range collapsed at (detachedXmlTextNode, 0)]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(1, 47, "foo"), with selected range collapsed at (detachedXmlTextNode, 1)]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(detachedXmlTextNode.length, 47, "foo"), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(1, 47, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(2, 47, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(3, 47, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(376, 47, ""), with selected range on detachedXmlTextNode from 0 to 1]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(0, 47, ""), with selected range collapsed at (detachedXmlTextNode, 0)]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(1, 47, ""), with selected range collapsed at (detachedXmlTextNode, 1)]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(detachedXmlTextNode.length, 47, ""), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(1, 47, ""), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(2, 47, ""), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [detachedXmlTextNode.replaceData(3, 47, ""), with selected range on detachedXmlTextNode from 1 to 3]
- expected: FAIL
-
- [comment.replaceData(376, 0, "foo"), with selected range on comment from 0 to 1]
- expected: FAIL
-
- [comment.replaceData(0, 0, "foo"), with selected range collapsed at (comment, 0)]
- expected: FAIL
-
- [comment.replaceData(1, 0, "foo"), with selected range collapsed at (comment, 1)]
- expected: FAIL
-
- [comment.replaceData(comment.length, 0, "foo"), with selected range collapsed at (comment, comment.length)]
- expected: FAIL
-
- [comment.replaceData(1, 0, "foo"), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.replaceData(2, 0, "foo"), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.replaceData(3, 0, "foo"), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.replaceData(376, 0, ""), with selected range on comment from 0 to 1]
- expected: FAIL
-
- [comment.replaceData(0, 0, ""), with selected range collapsed at (comment, 0)]
- expected: FAIL
-
- [comment.replaceData(1, 0, ""), with selected range collapsed at (comment, 1)]
- expected: FAIL
-
- [comment.replaceData(comment.length, 0, ""), with selected range collapsed at (comment, comment.length)]
- expected: FAIL
-
- [comment.replaceData(1, 0, ""), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.replaceData(2, 0, ""), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.replaceData(3, 0, ""), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.replaceData(376, 1, "foo"), with selected range on comment from 0 to 1]
- expected: FAIL
-
- [comment.replaceData(0, 1, "foo"), with selected range collapsed at (comment, 0)]
- expected: FAIL
-
- [comment.replaceData(1, 1, "foo"), with selected range collapsed at (comment, 1)]
- expected: FAIL
-
- [comment.replaceData(comment.length, 1, "foo"), with selected range collapsed at (comment, comment.length)]
- expected: FAIL
-
- [comment.replaceData(1, 1, "foo"), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.replaceData(2, 1, "foo"), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.replaceData(3, 1, "foo"), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.replaceData(376, 1, ""), with selected range on comment from 0 to 1]
- expected: FAIL
-
- [comment.replaceData(0, 1, ""), with selected range collapsed at (comment, 0)]
- expected: FAIL
-
- [comment.replaceData(1, 1, ""), with selected range collapsed at (comment, 1)]
- expected: FAIL
-
- [comment.replaceData(comment.length, 1, ""), with selected range collapsed at (comment, comment.length)]
- expected: FAIL
-
- [comment.replaceData(1, 1, ""), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.replaceData(2, 1, ""), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.replaceData(3, 1, ""), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.replaceData(376, 47, "foo"), with selected range on comment from 0 to 1]
- expected: FAIL
-
- [comment.replaceData(0, 47, "foo"), with selected range collapsed at (comment, 0)]
- expected: FAIL
-
- [comment.replaceData(1, 47, "foo"), with selected range collapsed at (comment, 1)]
- expected: FAIL
-
- [comment.replaceData(comment.length, 47, "foo"), with selected range collapsed at (comment, comment.length)]
- expected: FAIL
-
- [comment.replaceData(1, 47, "foo"), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.replaceData(2, 47, "foo"), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.replaceData(3, 47, "foo"), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.replaceData(376, 47, ""), with selected range on comment from 0 to 1]
- expected: FAIL
-
- [comment.replaceData(0, 47, ""), with selected range collapsed at (comment, 0)]
- expected: FAIL
-
- [comment.replaceData(1, 47, ""), with selected range collapsed at (comment, 1)]
- expected: FAIL
-
- [comment.replaceData(comment.length, 47, ""), with selected range collapsed at (comment, comment.length)]
- expected: FAIL
-
- [comment.replaceData(1, 47, ""), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.replaceData(2, 47, ""), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [comment.replaceData(3, 47, ""), with selected range on comment from 1 to 3]
- expected: FAIL
-
- [foreignComment.replaceData(376, 0, "foo"), with selected range on foreignComment from 0 to 1]
- expected: FAIL
-
- [foreignComment.replaceData(0, 0, "foo"), with selected range collapsed at (foreignComment, 0)]
- expected: FAIL
-
- [foreignComment.replaceData(1, 0, "foo"), with selected range collapsed at (foreignComment, 1)]
- expected: FAIL
-
- [foreignComment.replaceData(foreignComment.length, 0, "foo"), with selected range collapsed at (foreignComment, foreignComment.length)]
- expected: FAIL
-
- [foreignComment.replaceData(1, 0, "foo"), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.replaceData(2, 0, "foo"), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.replaceData(3, 0, "foo"), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.replaceData(376, 0, ""), with selected range on foreignComment from 0 to 1]
- expected: FAIL
-
- [foreignComment.replaceData(0, 0, ""), with selected range collapsed at (foreignComment, 0)]
- expected: FAIL
-
- [foreignComment.replaceData(1, 0, ""), with selected range collapsed at (foreignComment, 1)]
- expected: FAIL
-
- [foreignComment.replaceData(foreignComment.length, 0, ""), with selected range collapsed at (foreignComment, foreignComment.length)]
- expected: FAIL
-
- [foreignComment.replaceData(1, 0, ""), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.replaceData(2, 0, ""), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.replaceData(3, 0, ""), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.replaceData(376, 1, "foo"), with selected range on foreignComment from 0 to 1]
- expected: FAIL
-
- [foreignComment.replaceData(0, 1, "foo"), with selected range collapsed at (foreignComment, 0)]
- expected: FAIL
-
- [foreignComment.replaceData(1, 1, "foo"), with selected range collapsed at (foreignComment, 1)]
- expected: FAIL
-
- [foreignComment.replaceData(foreignComment.length, 1, "foo"), with selected range collapsed at (foreignComment, foreignComment.length)]
- expected: FAIL
-
- [foreignComment.replaceData(1, 1, "foo"), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.replaceData(2, 1, "foo"), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.replaceData(3, 1, "foo"), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.replaceData(376, 1, ""), with selected range on foreignComment from 0 to 1]
- expected: FAIL
-
- [foreignComment.replaceData(0, 1, ""), with selected range collapsed at (foreignComment, 0)]
- expected: FAIL
-
- [foreignComment.replaceData(1, 1, ""), with selected range collapsed at (foreignComment, 1)]
- expected: FAIL
-
- [foreignComment.replaceData(foreignComment.length, 1, ""), with selected range collapsed at (foreignComment, foreignComment.length)]
- expected: FAIL
-
- [foreignComment.replaceData(1, 1, ""), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.replaceData(2, 1, ""), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.replaceData(3, 1, ""), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.replaceData(376, 47, "foo"), with selected range on foreignComment from 0 to 1]
- expected: FAIL
-
- [foreignComment.replaceData(0, 47, "foo"), with selected range collapsed at (foreignComment, 0)]
- expected: FAIL
-
- [foreignComment.replaceData(1, 47, "foo"), with selected range collapsed at (foreignComment, 1)]
- expected: FAIL
-
- [foreignComment.replaceData(foreignComment.length, 47, "foo"), with selected range collapsed at (foreignComment, foreignComment.length)]
- expected: FAIL
-
- [foreignComment.replaceData(1, 47, "foo"), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.replaceData(2, 47, "foo"), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.replaceData(3, 47, "foo"), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.replaceData(376, 47, ""), with selected range on foreignComment from 0 to 1]
- expected: FAIL
-
- [foreignComment.replaceData(0, 47, ""), with selected range collapsed at (foreignComment, 0)]
- expected: FAIL
-
- [foreignComment.replaceData(1, 47, ""), with selected range collapsed at (foreignComment, 1)]
- expected: FAIL
-
- [foreignComment.replaceData(foreignComment.length, 47, ""), with selected range collapsed at (foreignComment, foreignComment.length)]
- expected: FAIL
-
- [foreignComment.replaceData(1, 47, ""), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.replaceData(2, 47, ""), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [foreignComment.replaceData(3, 47, ""), with selected range on foreignComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.replaceData(376, 0, "foo"), with selected range on xmlComment from 0 to 1]
- expected: FAIL
-
- [xmlComment.replaceData(0, 0, "foo"), with selected range collapsed at (xmlComment, 0)]
- expected: FAIL
-
- [xmlComment.replaceData(1, 0, "foo"), with selected range collapsed at (xmlComment, 1)]
- expected: FAIL
-
- [xmlComment.replaceData(xmlComment.length, 0, "foo"), with selected range collapsed at (xmlComment, xmlComment.length)]
- expected: FAIL
-
- [xmlComment.replaceData(1, 0, "foo"), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.replaceData(2, 0, "foo"), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.replaceData(3, 0, "foo"), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.replaceData(376, 0, ""), with selected range on xmlComment from 0 to 1]
- expected: FAIL
-
- [xmlComment.replaceData(0, 0, ""), with selected range collapsed at (xmlComment, 0)]
- expected: FAIL
-
- [xmlComment.replaceData(1, 0, ""), with selected range collapsed at (xmlComment, 1)]
- expected: FAIL
-
- [xmlComment.replaceData(xmlComment.length, 0, ""), with selected range collapsed at (xmlComment, xmlComment.length)]
- expected: FAIL
-
- [xmlComment.replaceData(1, 0, ""), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.replaceData(2, 0, ""), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.replaceData(3, 0, ""), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.replaceData(376, 1, "foo"), with selected range on xmlComment from 0 to 1]
- expected: FAIL
-
- [xmlComment.replaceData(0, 1, "foo"), with selected range collapsed at (xmlComment, 0)]
- expected: FAIL
-
- [xmlComment.replaceData(1, 1, "foo"), with selected range collapsed at (xmlComment, 1)]
- expected: FAIL
-
- [xmlComment.replaceData(xmlComment.length, 1, "foo"), with selected range collapsed at (xmlComment, xmlComment.length)]
- expected: FAIL
-
- [xmlComment.replaceData(1, 1, "foo"), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.replaceData(2, 1, "foo"), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.replaceData(3, 1, "foo"), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.replaceData(376, 1, ""), with selected range on xmlComment from 0 to 1]
- expected: FAIL
-
- [xmlComment.replaceData(0, 1, ""), with selected range collapsed at (xmlComment, 0)]
- expected: FAIL
-
- [xmlComment.replaceData(1, 1, ""), with selected range collapsed at (xmlComment, 1)]
- expected: FAIL
-
- [xmlComment.replaceData(xmlComment.length, 1, ""), with selected range collapsed at (xmlComment, xmlComment.length)]
- expected: FAIL
-
- [xmlComment.replaceData(1, 1, ""), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.replaceData(2, 1, ""), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.replaceData(3, 1, ""), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.replaceData(376, 47, "foo"), with selected range on xmlComment from 0 to 1]
- expected: FAIL
-
- [xmlComment.replaceData(0, 47, "foo"), with selected range collapsed at (xmlComment, 0)]
- expected: FAIL
-
- [xmlComment.replaceData(1, 47, "foo"), with selected range collapsed at (xmlComment, 1)]
- expected: FAIL
-
- [xmlComment.replaceData(xmlComment.length, 47, "foo"), with selected range collapsed at (xmlComment, xmlComment.length)]
- expected: FAIL
-
- [xmlComment.replaceData(1, 47, "foo"), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.replaceData(2, 47, "foo"), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.replaceData(3, 47, "foo"), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.replaceData(376, 47, ""), with selected range on xmlComment from 0 to 1]
- expected: FAIL
-
- [xmlComment.replaceData(0, 47, ""), with selected range collapsed at (xmlComment, 0)]
- expected: FAIL
-
- [xmlComment.replaceData(1, 47, ""), with selected range collapsed at (xmlComment, 1)]
- expected: FAIL
-
- [xmlComment.replaceData(xmlComment.length, 47, ""), with selected range collapsed at (xmlComment, xmlComment.length)]
- expected: FAIL
-
- [xmlComment.replaceData(1, 47, ""), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.replaceData(2, 47, ""), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [xmlComment.replaceData(3, 47, ""), with selected range on xmlComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.replaceData(376, 0, "foo"), with selected range on detachedComment from 0 to 1]
- expected: FAIL
-
- [detachedComment.replaceData(0, 0, "foo"), with selected range collapsed at (detachedComment, 0)]
- expected: FAIL
-
- [detachedComment.replaceData(1, 0, "foo"), with selected range collapsed at (detachedComment, 1)]
- expected: FAIL
-
- [detachedComment.replaceData(detachedComment.length, 0, "foo"), with selected range collapsed at (detachedComment, detachedComment.length)]
- expected: FAIL
-
- [detachedComment.replaceData(1, 0, "foo"), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.replaceData(2, 0, "foo"), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.replaceData(3, 0, "foo"), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.replaceData(376, 0, ""), with selected range on detachedComment from 0 to 1]
- expected: FAIL
-
- [detachedComment.replaceData(0, 0, ""), with selected range collapsed at (detachedComment, 0)]
- expected: FAIL
-
- [detachedComment.replaceData(1, 0, ""), with selected range collapsed at (detachedComment, 1)]
- expected: FAIL
-
- [detachedComment.replaceData(detachedComment.length, 0, ""), with selected range collapsed at (detachedComment, detachedComment.length)]
- expected: FAIL
-
- [detachedComment.replaceData(1, 0, ""), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.replaceData(2, 0, ""), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.replaceData(3, 0, ""), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.replaceData(376, 1, "foo"), with selected range on detachedComment from 0 to 1]
- expected: FAIL
-
- [detachedComment.replaceData(0, 1, "foo"), with selected range collapsed at (detachedComment, 0)]
- expected: FAIL
-
- [detachedComment.replaceData(1, 1, "foo"), with selected range collapsed at (detachedComment, 1)]
- expected: FAIL
-
- [detachedComment.replaceData(detachedComment.length, 1, "foo"), with selected range collapsed at (detachedComment, detachedComment.length)]
- expected: FAIL
-
- [detachedComment.replaceData(1, 1, "foo"), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.replaceData(2, 1, "foo"), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.replaceData(3, 1, "foo"), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.replaceData(376, 1, ""), with selected range on detachedComment from 0 to 1]
- expected: FAIL
-
- [detachedComment.replaceData(0, 1, ""), with selected range collapsed at (detachedComment, 0)]
- expected: FAIL
-
- [detachedComment.replaceData(1, 1, ""), with selected range collapsed at (detachedComment, 1)]
- expected: FAIL
-
- [detachedComment.replaceData(detachedComment.length, 1, ""), with selected range collapsed at (detachedComment, detachedComment.length)]
- expected: FAIL
-
- [detachedComment.replaceData(1, 1, ""), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.replaceData(2, 1, ""), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.replaceData(3, 1, ""), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.replaceData(376, 47, "foo"), with selected range on detachedComment from 0 to 1]
- expected: FAIL
-
- [detachedComment.replaceData(0, 47, "foo"), with selected range collapsed at (detachedComment, 0)]
- expected: FAIL
-
- [detachedComment.replaceData(1, 47, "foo"), with selected range collapsed at (detachedComment, 1)]
- expected: FAIL
-
- [detachedComment.replaceData(detachedComment.length, 47, "foo"), with selected range collapsed at (detachedComment, detachedComment.length)]
- expected: FAIL
-
- [detachedComment.replaceData(1, 47, "foo"), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.replaceData(2, 47, "foo"), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.replaceData(3, 47, "foo"), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.replaceData(376, 47, ""), with selected range on detachedComment from 0 to 1]
- expected: FAIL
-
- [detachedComment.replaceData(0, 47, ""), with selected range collapsed at (detachedComment, 0)]
- expected: FAIL
-
- [detachedComment.replaceData(1, 47, ""), with selected range collapsed at (detachedComment, 1)]
- expected: FAIL
-
- [detachedComment.replaceData(detachedComment.length, 47, ""), with selected range collapsed at (detachedComment, detachedComment.length)]
- expected: FAIL
-
- [detachedComment.replaceData(1, 47, ""), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.replaceData(2, 47, ""), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedComment.replaceData(3, 47, ""), with selected range on detachedComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.replaceData(376, 0, "foo"), with selected range on detachedForeignComment from 0 to 1]
- expected: FAIL
-
- [detachedForeignComment.replaceData(0, 0, "foo"), with selected range collapsed at (detachedForeignComment, 0)]
- expected: FAIL
-
- [detachedForeignComment.replaceData(1, 0, "foo"), with selected range collapsed at (detachedForeignComment, 1)]
- expected: FAIL
-
- [detachedForeignComment.replaceData(detachedForeignComment.length, 0, "foo"), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
- expected: FAIL
-
- [detachedForeignComment.replaceData(1, 0, "foo"), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.replaceData(2, 0, "foo"), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.replaceData(3, 0, "foo"), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.replaceData(376, 0, ""), with selected range on detachedForeignComment from 0 to 1]
- expected: FAIL
-
- [detachedForeignComment.replaceData(0, 0, ""), with selected range collapsed at (detachedForeignComment, 0)]
- expected: FAIL
-
- [detachedForeignComment.replaceData(1, 0, ""), with selected range collapsed at (detachedForeignComment, 1)]
- expected: FAIL
-
- [detachedForeignComment.replaceData(detachedForeignComment.length, 0, ""), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
- expected: FAIL
-
- [detachedForeignComment.replaceData(1, 0, ""), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.replaceData(2, 0, ""), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.replaceData(3, 0, ""), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.replaceData(376, 1, "foo"), with selected range on detachedForeignComment from 0 to 1]
- expected: FAIL
-
- [detachedForeignComment.replaceData(0, 1, "foo"), with selected range collapsed at (detachedForeignComment, 0)]
- expected: FAIL
-
- [detachedForeignComment.replaceData(1, 1, "foo"), with selected range collapsed at (detachedForeignComment, 1)]
- expected: FAIL
-
- [detachedForeignComment.replaceData(detachedForeignComment.length, 1, "foo"), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
- expected: FAIL
-
- [detachedForeignComment.replaceData(1, 1, "foo"), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.replaceData(2, 1, "foo"), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.replaceData(3, 1, "foo"), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.replaceData(376, 1, ""), with selected range on detachedForeignComment from 0 to 1]
- expected: FAIL
-
- [detachedForeignComment.replaceData(0, 1, ""), with selected range collapsed at (detachedForeignComment, 0)]
- expected: FAIL
-
- [detachedForeignComment.replaceData(1, 1, ""), with selected range collapsed at (detachedForeignComment, 1)]
- expected: FAIL
-
- [detachedForeignComment.replaceData(detachedForeignComment.length, 1, ""), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
- expected: FAIL
-
- [detachedForeignComment.replaceData(1, 1, ""), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.replaceData(2, 1, ""), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.replaceData(3, 1, ""), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.replaceData(376, 47, "foo"), with selected range on detachedForeignComment from 0 to 1]
- expected: FAIL
-
- [detachedForeignComment.replaceData(0, 47, "foo"), with selected range collapsed at (detachedForeignComment, 0)]
- expected: FAIL
-
- [detachedForeignComment.replaceData(1, 47, "foo"), with selected range collapsed at (detachedForeignComment, 1)]
- expected: FAIL
-
- [detachedForeignComment.replaceData(detachedForeignComment.length, 47, "foo"), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
- expected: FAIL
-
- [detachedForeignComment.replaceData(1, 47, "foo"), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.replaceData(2, 47, "foo"), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.replaceData(3, 47, "foo"), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.replaceData(376, 47, ""), with selected range on detachedForeignComment from 0 to 1]
- expected: FAIL
-
- [detachedForeignComment.replaceData(0, 47, ""), with selected range collapsed at (detachedForeignComment, 0)]
- expected: FAIL
-
- [detachedForeignComment.replaceData(1, 47, ""), with selected range collapsed at (detachedForeignComment, 1)]
- expected: FAIL
-
- [detachedForeignComment.replaceData(detachedForeignComment.length, 47, ""), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
- expected: FAIL
-
- [detachedForeignComment.replaceData(1, 47, ""), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.replaceData(2, 47, ""), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedForeignComment.replaceData(3, 47, ""), with selected range on detachedForeignComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.replaceData(376, 0, "foo"), with selected range on detachedXmlComment from 0 to 1]
- expected: FAIL
-
- [detachedXmlComment.replaceData(0, 0, "foo"), with selected range collapsed at (detachedXmlComment, 0)]
- expected: FAIL
-
- [detachedXmlComment.replaceData(1, 0, "foo"), with selected range collapsed at (detachedXmlComment, 1)]
- expected: FAIL
-
- [detachedXmlComment.replaceData(detachedXmlComment.length, 0, "foo"), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
- expected: FAIL
-
- [detachedXmlComment.replaceData(1, 0, "foo"), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.replaceData(2, 0, "foo"), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.replaceData(3, 0, "foo"), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.replaceData(376, 0, ""), with selected range on detachedXmlComment from 0 to 1]
- expected: FAIL
-
- [detachedXmlComment.replaceData(0, 0, ""), with selected range collapsed at (detachedXmlComment, 0)]
- expected: FAIL
-
- [detachedXmlComment.replaceData(1, 0, ""), with selected range collapsed at (detachedXmlComment, 1)]
- expected: FAIL
-
- [detachedXmlComment.replaceData(detachedXmlComment.length, 0, ""), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
- expected: FAIL
-
- [detachedXmlComment.replaceData(1, 0, ""), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.replaceData(2, 0, ""), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.replaceData(3, 0, ""), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.replaceData(376, 1, "foo"), with selected range on detachedXmlComment from 0 to 1]
- expected: FAIL
-
- [detachedXmlComment.replaceData(0, 1, "foo"), with selected range collapsed at (detachedXmlComment, 0)]
- expected: FAIL
-
- [detachedXmlComment.replaceData(1, 1, "foo"), with selected range collapsed at (detachedXmlComment, 1)]
- expected: FAIL
-
- [detachedXmlComment.replaceData(detachedXmlComment.length, 1, "foo"), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
- expected: FAIL
-
- [detachedXmlComment.replaceData(1, 1, "foo"), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.replaceData(2, 1, "foo"), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.replaceData(3, 1, "foo"), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.replaceData(376, 1, ""), with selected range on detachedXmlComment from 0 to 1]
- expected: FAIL
-
- [detachedXmlComment.replaceData(0, 1, ""), with selected range collapsed at (detachedXmlComment, 0)]
- expected: FAIL
-
- [detachedXmlComment.replaceData(1, 1, ""), with selected range collapsed at (detachedXmlComment, 1)]
- expected: FAIL
-
- [detachedXmlComment.replaceData(detachedXmlComment.length, 1, ""), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
- expected: FAIL
-
- [detachedXmlComment.replaceData(1, 1, ""), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.replaceData(2, 1, ""), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.replaceData(3, 1, ""), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.replaceData(376, 47, "foo"), with selected range on detachedXmlComment from 0 to 1]
- expected: FAIL
-
- [detachedXmlComment.replaceData(0, 47, "foo"), with selected range collapsed at (detachedXmlComment, 0)]
- expected: FAIL
-
- [detachedXmlComment.replaceData(1, 47, "foo"), with selected range collapsed at (detachedXmlComment, 1)]
- expected: FAIL
-
- [detachedXmlComment.replaceData(detachedXmlComment.length, 47, "foo"), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
- expected: FAIL
-
- [detachedXmlComment.replaceData(1, 47, "foo"), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.replaceData(2, 47, "foo"), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.replaceData(3, 47, "foo"), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.replaceData(376, 47, ""), with selected range on detachedXmlComment from 0 to 1]
- expected: FAIL
-
- [detachedXmlComment.replaceData(0, 47, ""), with selected range collapsed at (detachedXmlComment, 0)]
- expected: FAIL
-
- [detachedXmlComment.replaceData(1, 47, ""), with selected range collapsed at (detachedXmlComment, 1)]
- expected: FAIL
-
- [detachedXmlComment.replaceData(detachedXmlComment.length, 47, ""), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
- expected: FAIL
-
- [detachedXmlComment.replaceData(1, 47, ""), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.replaceData(2, 47, ""), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [detachedXmlComment.replaceData(3, 47, ""), with selected range on detachedXmlComment from 1 to 3]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 0, "foo"), with selected range collapsed at (paras[0\], 0)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 0, "foo"), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 0, "foo"), with selected range collapsed at (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 0, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(2, 0, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(3, 0, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 0, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(2, 0, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(3, 0, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 1, "foo"), with selected range collapsed at (paras[0\], 0)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 1, "foo"), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 1, "foo"), with selected range collapsed at (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 1, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(2, 1, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(3, 1, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 1, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(2, 1, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(3, 1, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 47, "foo"), with selected range collapsed at (paras[0\], 0)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 47, "foo"), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 47, "foo"), with selected range collapsed at (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 47, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(2, 47, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(3, 47, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(1, 47, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(2, 47, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
- expected: FAIL
-
- [paras[0\].firstChild.replaceData(3, 47, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
- expected: FAIL
-
[paras[0\].firstChild.data = "", with selected range collapsed at (paras[0\].firstChild, 0)]
expected: FAIL
@@ -8100,342 +4212,3 @@
[detachedXmlComment.nodeValue += detachedXmlComment.nodeValue, with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
expected: FAIL
- [testDiv.insertBefore(paras[0\], paras[1\]), with selected range collapsed at (paras[0\], 0)]
- expected: FAIL
-
- [testDiv.insertBefore(paras[0\], paras[1\]), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [testDiv.insertBefore(paras[0\], paras[1\]), with selected range collapsed at (paras[0\], 1)]
- expected: FAIL
-
- [testDiv.insertBefore(paras[0\], paras[1\]), with selected range on testDiv from 0 to 2]
- expected: FAIL
-
- [testDiv.insertBefore(paras[0\], paras[1\]), with selected range collapsed at (testDiv, 1)]
- expected: FAIL
-
- [testDiv.insertBefore(paras[0\], paras[1\]), with selected range on testDiv from 1 to 2]
- expected: FAIL
-
- [testDiv.insertBefore(paras[0\], paras[1\]), with selected range collapsed at (testDiv, 2)]
- expected: FAIL
-
- [paras[0\].insertBefore(paras[1\], paras[0\].firstChild), with selected range collapsed at (paras[0\], 0)]
- expected: FAIL
-
- [paras[0\].insertBefore(paras[1\], paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].insertBefore(paras[1\], paras[0\].firstChild), with selected range collapsed at (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].insertBefore(paras[1\], paras[0\].firstChild), with selected range on testDiv from 0 to 1]
- expected: FAIL
-
- [paras[0\].insertBefore(paras[1\], paras[0\].firstChild), with selected range on testDiv from 0 to 2]
- expected: FAIL
-
- [paras[0\].insertBefore(paras[1\], paras[0\].firstChild), with selected range collapsed at (testDiv, 1)]
- expected: FAIL
-
- [paras[0\].insertBefore(paras[1\], paras[0\].firstChild), with selected range on testDiv from 1 to 2]
- expected: FAIL
-
- [paras[0\].insertBefore(paras[1\], null), with selected range collapsed at (paras[0\], 0)]
- expected: FAIL
-
- [paras[0\].insertBefore(paras[1\], null), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].insertBefore(paras[1\], null), with selected range collapsed at (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].insertBefore(paras[1\], null), with selected range on testDiv from 0 to 1]
- expected: FAIL
-
- [paras[0\].insertBefore(paras[1\], null), with selected range on testDiv from 0 to 2]
- expected: FAIL
-
- [paras[0\].insertBefore(paras[1\], null), with selected range collapsed at (testDiv, 1)]
- expected: FAIL
-
- [paras[0\].insertBefore(paras[1\], null), with selected range on testDiv from 1 to 2]
- expected: FAIL
-
- [foreignDoc.insertBefore(detachedComment, foreignDoc.documentElement), with selected range collapsed at (foreignDoc, 0)]
- expected: FAIL
-
- [foreignDoc.insertBefore(detachedComment, foreignDoc.documentElement), with selected range on foreignDoc from 0 to 1]
- expected: FAIL
-
- [foreignDoc.insertBefore(detachedComment, foreignDoc.documentElement), with selected range on foreignDoc from 0 to 2]
- expected: FAIL
-
- [foreignDoc.insertBefore(detachedComment, foreignDoc.documentElement), with selected range collapsed at (foreignDoc, 1)]
- expected: FAIL
-
- [foreignDoc.insertBefore(detachedComment, foreignDoc.doctype), with selected range collapsed at (foreignDoc, 0)]
- expected: FAIL
-
- [foreignDoc.insertBefore(detachedComment, foreignDoc.doctype), with selected range on foreignDoc from 0 to 1]
- expected: FAIL
-
- [foreignDoc.insertBefore(detachedComment, foreignDoc.doctype), with selected range on foreignDoc from 0 to 2]
- expected: FAIL
-
- [foreignDoc.insertBefore(detachedComment, foreignDoc.doctype), with selected range collapsed at (foreignDoc, 1)]
- expected: FAIL
-
- [foreignDoc.insertBefore(detachedComment, null), with selected range on foreignDoc from 0 to 1]
- expected: FAIL
-
- [paras[0\].insertBefore(xmlTextNode, paras[0\].firstChild), with selected range collapsed at (paras[0\], 0)]
- expected: FAIL
-
- [paras[0\].insertBefore(xmlTextNode, paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].insertBefore(xmlTextNode, paras[0\].firstChild), with selected range collapsed at (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].insertBefore(paras[0\], paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].insertBefore(testDiv, paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].insertBefore(document, paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].insertBefore(foreignDoc, paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].insertBefore(document.doctype, paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [testDiv.replaceChild(paras[0\], paras[0\]), with selected range collapsed at (paras[0\], 0)]
- expected: FAIL
-
- [testDiv.replaceChild(paras[0\], paras[0\]), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [testDiv.replaceChild(paras[0\], paras[0\]), with selected range collapsed at (paras[0\], 1)]
- expected: FAIL
-
- [testDiv.replaceChild(paras[0\], paras[0\]), with selected range on testDiv from 0 to 2]
- expected: FAIL
-
- [testDiv.replaceChild(paras[0\], paras[0\]), with selected range collapsed at (testDiv, 1)]
- expected: FAIL
-
- [testDiv.replaceChild(paras[0\], paras[0\]), with selected range on testDiv from 1 to 2]
- expected: FAIL
-
- [testDiv.replaceChild(paras[0\], paras[0\]), with selected range collapsed at (testDiv, 2)]
- expected: FAIL
-
- [paras[0\].replaceChild(paras[1\], paras[0\].firstChild), with selected range collapsed at (paras[0\], 0)]
- expected: FAIL
-
- [paras[0\].replaceChild(paras[1\], paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].replaceChild(paras[1\], paras[0\].firstChild), with selected range collapsed at (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].replaceChild(paras[1\], paras[0\].firstChild), with selected range on testDiv from 0 to 1]
- expected: FAIL
-
- [paras[0\].replaceChild(paras[1\], paras[0\].firstChild), with selected range on testDiv from 0 to 2]
- expected: FAIL
-
- [paras[0\].replaceChild(paras[1\], paras[0\].firstChild), with selected range collapsed at (testDiv, 1)]
- expected: FAIL
-
- [paras[0\].replaceChild(paras[1\], paras[0\].firstChild), with selected range on testDiv from 1 to 2]
- expected: FAIL
-
- [foreignDoc.replaceChild(detachedComment, foreignDoc.documentElement), with selected range collapsed at (foreignDoc, 0)]
- expected: FAIL
-
- [foreignDoc.replaceChild(detachedComment, foreignDoc.documentElement), with selected range on foreignDoc from 0 to 1]
- expected: FAIL
-
- [foreignDoc.replaceChild(detachedComment, foreignDoc.documentElement), with selected range on foreignDoc from 0 to 2]
- expected: FAIL
-
- [foreignDoc.replaceChild(detachedComment, foreignDoc.documentElement), with selected range collapsed at (foreignDoc, 1)]
- expected: FAIL
-
- [foreignDoc.replaceChild(detachedComment, foreignDoc.doctype), with selected range collapsed at (foreignDoc, 0)]
- expected: FAIL
-
- [foreignDoc.replaceChild(detachedComment, foreignDoc.doctype), with selected range on foreignDoc from 0 to 1]
- expected: FAIL
-
- [foreignDoc.replaceChild(detachedComment, foreignDoc.doctype), with selected range on foreignDoc from 0 to 2]
- expected: FAIL
-
- [foreignDoc.replaceChild(detachedComment, foreignDoc.doctype), with selected range collapsed at (foreignDoc, 1)]
- expected: FAIL
-
- [paras[0\].replaceChild(xmlTextNode, paras[0\].firstChild), with selected range collapsed at (paras[0\], 0)]
- expected: FAIL
-
- [paras[0\].replaceChild(xmlTextNode, paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].replaceChild(xmlTextNode, paras[0\].firstChild), with selected range collapsed at (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].replaceChild(paras[0\], paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].replaceChild(testDiv, paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].replaceChild(document, paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].replaceChild(foreignDoc, paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].replaceChild(document.doctype, paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [testDiv.appendChild(testDiv.lastChild), with selected range collapsed at (testDiv.lastChild, 0)]
- expected: FAIL
-
- [testDiv.appendChild(testDiv.lastChild), with selected range on testDiv.lastChild from 0 to 1]
- expected: FAIL
-
- [testDiv.appendChild(testDiv.lastChild), with selected range collapsed at (testDiv.lastChild, 1)]
- expected: FAIL
-
- [testDiv.appendChild(testDiv.lastChild), with selected range on testDiv from testDiv.childNodes.length - 2 to testDiv.childNodes.length]
- expected: FAIL
-
- [testDiv.appendChild(testDiv.lastChild), with selected range on testDiv from testDiv.childNodes.length - 2 to testDiv.childNodes.length - 1]
- expected: FAIL
-
- [testDiv.appendChild(testDiv.lastChild), with selected range on testDiv from testDiv.childNodes.length - 1 to testDiv.childNodes.length]
- expected: FAIL
-
- [testDiv.appendChild(testDiv.lastChild), with selected range collapsed at (testDiv, testDiv.childNodes.length - 1)]
- expected: FAIL
-
- [testDiv.appendChild(testDiv.lastChild), with selected range collapsed at (testDiv, testDiv.childNodes.length)]
- expected: FAIL
-
- [detachedDiv.appendChild(detachedDiv.lastChild), with selected range collapsed at (detachedDiv.lastChild, 0)]
- expected: FAIL
-
- [detachedDiv.appendChild(detachedDiv.lastChild), with selected range on detachedDiv.lastChild from 0 to 1]
- expected: FAIL
-
- [detachedDiv.appendChild(detachedDiv.lastChild), with selected range collapsed at (detachedDiv.lastChild, 1)]
- expected: FAIL
-
- [detachedDiv.appendChild(detachedDiv.lastChild), with selected range on detachedDiv from detachedDiv.childNodes.length - 2 to detachedDiv.childNodes.length]
- expected: FAIL
-
- [detachedDiv.appendChild(detachedDiv.lastChild), with selected range on detachedDiv from detachedDiv.childNodes.length - 2 to detachedDiv.childNodes.length - 1]
- expected: FAIL
-
- [detachedDiv.appendChild(detachedDiv.lastChild), with selected range on detachedDiv from detachedDiv.childNodes.length - 1 to detachedDiv.childNodes.length]
- expected: FAIL
-
- [detachedDiv.appendChild(detachedDiv.lastChild), with selected range collapsed at (detachedDiv, detachedDiv.childNodes.length - 1)]
- expected: FAIL
-
- [detachedDiv.appendChild(detachedDiv.lastChild), with selected range collapsed at (detachedDiv, detachedDiv.childNodes.length)]
- expected: FAIL
-
- [paras[0\].appendChild(paras[1\]), with selected range collapsed at (paras[0\], 0)]
- expected: FAIL
-
- [paras[0\].appendChild(paras[1\]), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].appendChild(paras[1\]), with selected range collapsed at (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].appendChild(paras[1\]), with selected range on testDiv from 0 to 1]
- expected: FAIL
-
- [paras[0\].appendChild(paras[1\]), with selected range on testDiv from 0 to 2]
- expected: FAIL
-
- [paras[0\].appendChild(paras[1\]), with selected range collapsed at (testDiv, 1)]
- expected: FAIL
-
- [paras[0\].appendChild(paras[1\]), with selected range on testDiv from 1 to 2]
- expected: FAIL
-
- [foreignDoc.appendChild(detachedComment), with selected range on foreignDoc from foreignDoc.childNodes.length - 1 to foreignDoc.childNodes.length]
- expected: FAIL
-
- [foreignDoc.appendChild(detachedComment), with selected range collapsed at (foreignDoc, foreignDoc.childNodes.length - 1)]
- expected: FAIL
-
- [foreignDoc.appendChild(detachedComment), with selected range collapsed at (foreignDoc, foreignDoc.childNodes.length)]
- expected: FAIL
-
- [foreignDoc.appendChild(detachedComment), with selected range on detachedComment from 0 to 5]
- expected: FAIL
-
- [paras[0\].appendChild(xmlTextNode), with selected range collapsed at (paras[0\], 0)]
- expected: FAIL
-
- [paras[0\].appendChild(xmlTextNode), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].appendChild(xmlTextNode), with selected range collapsed at (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].appendChild(paras[0\]), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].appendChild(testDiv), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].appendChild(document), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].appendChild(foreignDoc), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].appendChild(document.doctype), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].parentNode.removeChild(paras[0\]), with selected range collapsed at (paras[0\], 0)]
- expected: FAIL
-
- [paras[0\].parentNode.removeChild(paras[0\]), with selected range on paras[0\] from 0 to 1]
- expected: FAIL
-
- [paras[0\].parentNode.removeChild(paras[0\]), with selected range collapsed at (paras[0\], 1)]
- expected: FAIL
-
- [paras[0\].parentNode.removeChild(paras[0\]), with selected range collapsed at (testDiv, 0)]
- expected: FAIL
-
- [paras[0\].parentNode.removeChild(paras[0\]), with selected range on testDiv from 0 to 1]
- expected: FAIL
-
- [paras[0\].parentNode.removeChild(paras[0\]), with selected range collapsed at (testDiv, 1)]
- expected: FAIL
-
- [paras[0\].parentNode.removeChild(paras[0\]), with selected range on testDiv from 0 to 2]
- expected: FAIL
-
- [paras[0\].parentNode.removeChild(paras[0\]), with selected range on testDiv from 1 to 2]
- expected: FAIL
-
- [paras[0\].parentNode.removeChild(paras[0\]), with selected range collapsed at (testDiv, 2)]
- expected: FAIL
-
- [foreignDoc.documentElement.parentNode.removeChild(foreignDoc.documentElement), with selected range on foreignDoc from 0 to foreignDoc.childNodes.length]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/dom/ranges/Range-mutations-deleteData.html.ini b/tests/wpt/metadata/dom/ranges/Range-mutations-deleteData.html.ini
new file mode 100644
index 00000000000..b6bcbd09ce8
--- /dev/null
+++ b/tests/wpt/metadata/dom/ranges/Range-mutations-deleteData.html.ini
@@ -0,0 +1,848 @@
+[Range-mutations-deleteData.html]
+ type: testharness
+ [paras[0\].firstChild.deleteData(376, 2), with selected range on paras[0\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(0, 2), with selected range collapsed at (paras[0\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(1, 2), with selected range collapsed at (paras[0\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(paras[0\].firstChild.length, 2), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(1, 2), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(2, 2), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(3, 2), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(376, 0), with selected range on paras[0\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(0, 0), with selected range collapsed at (paras[0\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(1, 0), with selected range collapsed at (paras[0\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(paras[0\].firstChild.length, 0), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(1, 0), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(2, 0), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(3, 0), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(376, 631), with selected range on paras[0\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(0, 631), with selected range collapsed at (paras[0\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(1, 631), with selected range collapsed at (paras[0\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(paras[0\].firstChild.length, 631), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(1, 631), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(2, 631), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(3, 631), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.deleteData(376, 2), with selected range on paras[1\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[1\].firstChild.deleteData(0, 2), with selected range collapsed at (paras[1\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[1\].firstChild.deleteData(1, 2), with selected range collapsed at (paras[1\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[1\].firstChild.deleteData(paras[1\].firstChild.length, 2), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
+ expected: FAIL
+
+ [paras[1\].firstChild.deleteData(1, 2), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.deleteData(2, 2), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.deleteData(3, 2), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.deleteData(376, 0), with selected range on paras[1\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[1\].firstChild.deleteData(0, 0), with selected range collapsed at (paras[1\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[1\].firstChild.deleteData(1, 0), with selected range collapsed at (paras[1\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[1\].firstChild.deleteData(paras[1\].firstChild.length, 0), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
+ expected: FAIL
+
+ [paras[1\].firstChild.deleteData(1, 0), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.deleteData(2, 0), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.deleteData(3, 0), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.deleteData(376, 631), with selected range on paras[1\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[1\].firstChild.deleteData(0, 631), with selected range collapsed at (paras[1\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[1\].firstChild.deleteData(1, 631), with selected range collapsed at (paras[1\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[1\].firstChild.deleteData(paras[1\].firstChild.length, 631), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
+ expected: FAIL
+
+ [paras[1\].firstChild.deleteData(1, 631), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.deleteData(2, 631), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.deleteData(3, 631), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.deleteData(376, 2), with selected range on foreignTextNode from 0 to 1]
+ expected: FAIL
+
+ [foreignTextNode.deleteData(0, 2), with selected range collapsed at (foreignTextNode, 0)]
+ expected: FAIL
+
+ [foreignTextNode.deleteData(1, 2), with selected range collapsed at (foreignTextNode, 1)]
+ expected: FAIL
+
+ [foreignTextNode.deleteData(foreignTextNode.length, 2), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
+ expected: FAIL
+
+ [foreignTextNode.deleteData(1, 2), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.deleteData(2, 2), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.deleteData(3, 2), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.deleteData(376, 0), with selected range on foreignTextNode from 0 to 1]
+ expected: FAIL
+
+ [foreignTextNode.deleteData(0, 0), with selected range collapsed at (foreignTextNode, 0)]
+ expected: FAIL
+
+ [foreignTextNode.deleteData(1, 0), with selected range collapsed at (foreignTextNode, 1)]
+ expected: FAIL
+
+ [foreignTextNode.deleteData(foreignTextNode.length, 0), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
+ expected: FAIL
+
+ [foreignTextNode.deleteData(1, 0), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.deleteData(2, 0), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.deleteData(3, 0), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.deleteData(376, 631), with selected range on foreignTextNode from 0 to 1]
+ expected: FAIL
+
+ [foreignTextNode.deleteData(0, 631), with selected range collapsed at (foreignTextNode, 0)]
+ expected: FAIL
+
+ [foreignTextNode.deleteData(1, 631), with selected range collapsed at (foreignTextNode, 1)]
+ expected: FAIL
+
+ [foreignTextNode.deleteData(foreignTextNode.length, 631), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
+ expected: FAIL
+
+ [foreignTextNode.deleteData(1, 631), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.deleteData(2, 631), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.deleteData(3, 631), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.deleteData(376, 2), with selected range on xmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [xmlTextNode.deleteData(0, 2), with selected range collapsed at (xmlTextNode, 0)]
+ expected: FAIL
+
+ [xmlTextNode.deleteData(1, 2), with selected range collapsed at (xmlTextNode, 1)]
+ expected: FAIL
+
+ [xmlTextNode.deleteData(xmlTextNode.length, 2), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
+ expected: FAIL
+
+ [xmlTextNode.deleteData(1, 2), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.deleteData(2, 2), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.deleteData(3, 2), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.deleteData(376, 0), with selected range on xmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [xmlTextNode.deleteData(0, 0), with selected range collapsed at (xmlTextNode, 0)]
+ expected: FAIL
+
+ [xmlTextNode.deleteData(1, 0), with selected range collapsed at (xmlTextNode, 1)]
+ expected: FAIL
+
+ [xmlTextNode.deleteData(xmlTextNode.length, 0), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
+ expected: FAIL
+
+ [xmlTextNode.deleteData(1, 0), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.deleteData(2, 0), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.deleteData(3, 0), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.deleteData(376, 631), with selected range on xmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [xmlTextNode.deleteData(0, 631), with selected range collapsed at (xmlTextNode, 0)]
+ expected: FAIL
+
+ [xmlTextNode.deleteData(1, 631), with selected range collapsed at (xmlTextNode, 1)]
+ expected: FAIL
+
+ [xmlTextNode.deleteData(xmlTextNode.length, 631), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
+ expected: FAIL
+
+ [xmlTextNode.deleteData(1, 631), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.deleteData(2, 631), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.deleteData(3, 631), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.deleteData(376, 2), with selected range on detachedTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedTextNode.deleteData(0, 2), with selected range collapsed at (detachedTextNode, 0)]
+ expected: FAIL
+
+ [detachedTextNode.deleteData(1, 2), with selected range collapsed at (detachedTextNode, 1)]
+ expected: FAIL
+
+ [detachedTextNode.deleteData(detachedTextNode.length, 2), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
+ expected: FAIL
+
+ [detachedTextNode.deleteData(1, 2), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.deleteData(2, 2), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.deleteData(3, 2), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.deleteData(376, 0), with selected range on detachedTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedTextNode.deleteData(0, 0), with selected range collapsed at (detachedTextNode, 0)]
+ expected: FAIL
+
+ [detachedTextNode.deleteData(1, 0), with selected range collapsed at (detachedTextNode, 1)]
+ expected: FAIL
+
+ [detachedTextNode.deleteData(detachedTextNode.length, 0), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
+ expected: FAIL
+
+ [detachedTextNode.deleteData(1, 0), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.deleteData(2, 0), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.deleteData(3, 0), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.deleteData(376, 631), with selected range on detachedTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedTextNode.deleteData(0, 631), with selected range collapsed at (detachedTextNode, 0)]
+ expected: FAIL
+
+ [detachedTextNode.deleteData(1, 631), with selected range collapsed at (detachedTextNode, 1)]
+ expected: FAIL
+
+ [detachedTextNode.deleteData(detachedTextNode.length, 631), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
+ expected: FAIL
+
+ [detachedTextNode.deleteData(1, 631), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.deleteData(2, 631), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.deleteData(3, 631), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.deleteData(376, 2), with selected range on detachedForeignTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignTextNode.deleteData(0, 2), with selected range collapsed at (detachedForeignTextNode, 0)]
+ expected: FAIL
+
+ [detachedForeignTextNode.deleteData(1, 2), with selected range collapsed at (detachedForeignTextNode, 1)]
+ expected: FAIL
+
+ [detachedForeignTextNode.deleteData(detachedForeignTextNode.length, 2), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
+ expected: FAIL
+
+ [detachedForeignTextNode.deleteData(1, 2), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.deleteData(2, 2), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.deleteData(3, 2), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.deleteData(376, 0), with selected range on detachedForeignTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignTextNode.deleteData(0, 0), with selected range collapsed at (detachedForeignTextNode, 0)]
+ expected: FAIL
+
+ [detachedForeignTextNode.deleteData(1, 0), with selected range collapsed at (detachedForeignTextNode, 1)]
+ expected: FAIL
+
+ [detachedForeignTextNode.deleteData(detachedForeignTextNode.length, 0), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
+ expected: FAIL
+
+ [detachedForeignTextNode.deleteData(1, 0), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.deleteData(2, 0), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.deleteData(3, 0), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.deleteData(376, 631), with selected range on detachedForeignTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignTextNode.deleteData(0, 631), with selected range collapsed at (detachedForeignTextNode, 0)]
+ expected: FAIL
+
+ [detachedForeignTextNode.deleteData(1, 631), with selected range collapsed at (detachedForeignTextNode, 1)]
+ expected: FAIL
+
+ [detachedForeignTextNode.deleteData(detachedForeignTextNode.length, 631), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
+ expected: FAIL
+
+ [detachedForeignTextNode.deleteData(1, 631), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.deleteData(2, 631), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.deleteData(3, 631), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.deleteData(376, 2), with selected range on detachedXmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlTextNode.deleteData(0, 2), with selected range collapsed at (detachedXmlTextNode, 0)]
+ expected: FAIL
+
+ [detachedXmlTextNode.deleteData(1, 2), with selected range collapsed at (detachedXmlTextNode, 1)]
+ expected: FAIL
+
+ [detachedXmlTextNode.deleteData(detachedXmlTextNode.length, 2), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
+ expected: FAIL
+
+ [detachedXmlTextNode.deleteData(1, 2), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.deleteData(2, 2), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.deleteData(3, 2), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.deleteData(376, 0), with selected range on detachedXmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlTextNode.deleteData(0, 0), with selected range collapsed at (detachedXmlTextNode, 0)]
+ expected: FAIL
+
+ [detachedXmlTextNode.deleteData(1, 0), with selected range collapsed at (detachedXmlTextNode, 1)]
+ expected: FAIL
+
+ [detachedXmlTextNode.deleteData(detachedXmlTextNode.length, 0), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
+ expected: FAIL
+
+ [detachedXmlTextNode.deleteData(1, 0), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.deleteData(2, 0), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.deleteData(3, 0), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.deleteData(376, 631), with selected range on detachedXmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlTextNode.deleteData(0, 631), with selected range collapsed at (detachedXmlTextNode, 0)]
+ expected: FAIL
+
+ [detachedXmlTextNode.deleteData(1, 631), with selected range collapsed at (detachedXmlTextNode, 1)]
+ expected: FAIL
+
+ [detachedXmlTextNode.deleteData(detachedXmlTextNode.length, 631), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
+ expected: FAIL
+
+ [detachedXmlTextNode.deleteData(1, 631), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.deleteData(2, 631), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.deleteData(3, 631), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [comment.deleteData(376, 2), with selected range on comment from 0 to 1]
+ expected: FAIL
+
+ [comment.deleteData(0, 2), with selected range collapsed at (comment, 0)]
+ expected: FAIL
+
+ [comment.deleteData(1, 2), with selected range collapsed at (comment, 1)]
+ expected: FAIL
+
+ [comment.deleteData(comment.length, 2), with selected range collapsed at (comment, comment.length)]
+ expected: FAIL
+
+ [comment.deleteData(1, 2), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.deleteData(2, 2), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.deleteData(3, 2), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.deleteData(376, 0), with selected range on comment from 0 to 1]
+ expected: FAIL
+
+ [comment.deleteData(0, 0), with selected range collapsed at (comment, 0)]
+ expected: FAIL
+
+ [comment.deleteData(1, 0), with selected range collapsed at (comment, 1)]
+ expected: FAIL
+
+ [comment.deleteData(comment.length, 0), with selected range collapsed at (comment, comment.length)]
+ expected: FAIL
+
+ [comment.deleteData(1, 0), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.deleteData(2, 0), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.deleteData(3, 0), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.deleteData(376, 631), with selected range on comment from 0 to 1]
+ expected: FAIL
+
+ [comment.deleteData(0, 631), with selected range collapsed at (comment, 0)]
+ expected: FAIL
+
+ [comment.deleteData(1, 631), with selected range collapsed at (comment, 1)]
+ expected: FAIL
+
+ [comment.deleteData(comment.length, 631), with selected range collapsed at (comment, comment.length)]
+ expected: FAIL
+
+ [comment.deleteData(1, 631), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.deleteData(2, 631), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.deleteData(3, 631), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.deleteData(376, 2), with selected range on foreignComment from 0 to 1]
+ expected: FAIL
+
+ [foreignComment.deleteData(0, 2), with selected range collapsed at (foreignComment, 0)]
+ expected: FAIL
+
+ [foreignComment.deleteData(1, 2), with selected range collapsed at (foreignComment, 1)]
+ expected: FAIL
+
+ [foreignComment.deleteData(foreignComment.length, 2), with selected range collapsed at (foreignComment, foreignComment.length)]
+ expected: FAIL
+
+ [foreignComment.deleteData(1, 2), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.deleteData(2, 2), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.deleteData(3, 2), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.deleteData(376, 0), with selected range on foreignComment from 0 to 1]
+ expected: FAIL
+
+ [foreignComment.deleteData(0, 0), with selected range collapsed at (foreignComment, 0)]
+ expected: FAIL
+
+ [foreignComment.deleteData(1, 0), with selected range collapsed at (foreignComment, 1)]
+ expected: FAIL
+
+ [foreignComment.deleteData(foreignComment.length, 0), with selected range collapsed at (foreignComment, foreignComment.length)]
+ expected: FAIL
+
+ [foreignComment.deleteData(1, 0), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.deleteData(2, 0), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.deleteData(3, 0), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.deleteData(376, 631), with selected range on foreignComment from 0 to 1]
+ expected: FAIL
+
+ [foreignComment.deleteData(0, 631), with selected range collapsed at (foreignComment, 0)]
+ expected: FAIL
+
+ [foreignComment.deleteData(1, 631), with selected range collapsed at (foreignComment, 1)]
+ expected: FAIL
+
+ [foreignComment.deleteData(foreignComment.length, 631), with selected range collapsed at (foreignComment, foreignComment.length)]
+ expected: FAIL
+
+ [foreignComment.deleteData(1, 631), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.deleteData(2, 631), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.deleteData(3, 631), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.deleteData(376, 2), with selected range on xmlComment from 0 to 1]
+ expected: FAIL
+
+ [xmlComment.deleteData(0, 2), with selected range collapsed at (xmlComment, 0)]
+ expected: FAIL
+
+ [xmlComment.deleteData(1, 2), with selected range collapsed at (xmlComment, 1)]
+ expected: FAIL
+
+ [xmlComment.deleteData(xmlComment.length, 2), with selected range collapsed at (xmlComment, xmlComment.length)]
+ expected: FAIL
+
+ [xmlComment.deleteData(1, 2), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.deleteData(2, 2), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.deleteData(3, 2), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.deleteData(376, 0), with selected range on xmlComment from 0 to 1]
+ expected: FAIL
+
+ [xmlComment.deleteData(0, 0), with selected range collapsed at (xmlComment, 0)]
+ expected: FAIL
+
+ [xmlComment.deleteData(1, 0), with selected range collapsed at (xmlComment, 1)]
+ expected: FAIL
+
+ [xmlComment.deleteData(xmlComment.length, 0), with selected range collapsed at (xmlComment, xmlComment.length)]
+ expected: FAIL
+
+ [xmlComment.deleteData(1, 0), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.deleteData(2, 0), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.deleteData(3, 0), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.deleteData(376, 631), with selected range on xmlComment from 0 to 1]
+ expected: FAIL
+
+ [xmlComment.deleteData(0, 631), with selected range collapsed at (xmlComment, 0)]
+ expected: FAIL
+
+ [xmlComment.deleteData(1, 631), with selected range collapsed at (xmlComment, 1)]
+ expected: FAIL
+
+ [xmlComment.deleteData(xmlComment.length, 631), with selected range collapsed at (xmlComment, xmlComment.length)]
+ expected: FAIL
+
+ [xmlComment.deleteData(1, 631), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.deleteData(2, 631), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.deleteData(3, 631), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.deleteData(376, 2), with selected range on detachedComment from 0 to 1]
+ expected: FAIL
+
+ [detachedComment.deleteData(0, 2), with selected range collapsed at (detachedComment, 0)]
+ expected: FAIL
+
+ [detachedComment.deleteData(1, 2), with selected range collapsed at (detachedComment, 1)]
+ expected: FAIL
+
+ [detachedComment.deleteData(detachedComment.length, 2), with selected range collapsed at (detachedComment, detachedComment.length)]
+ expected: FAIL
+
+ [detachedComment.deleteData(1, 2), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.deleteData(2, 2), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.deleteData(3, 2), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.deleteData(376, 0), with selected range on detachedComment from 0 to 1]
+ expected: FAIL
+
+ [detachedComment.deleteData(0, 0), with selected range collapsed at (detachedComment, 0)]
+ expected: FAIL
+
+ [detachedComment.deleteData(1, 0), with selected range collapsed at (detachedComment, 1)]
+ expected: FAIL
+
+ [detachedComment.deleteData(detachedComment.length, 0), with selected range collapsed at (detachedComment, detachedComment.length)]
+ expected: FAIL
+
+ [detachedComment.deleteData(1, 0), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.deleteData(2, 0), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.deleteData(3, 0), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.deleteData(376, 631), with selected range on detachedComment from 0 to 1]
+ expected: FAIL
+
+ [detachedComment.deleteData(0, 631), with selected range collapsed at (detachedComment, 0)]
+ expected: FAIL
+
+ [detachedComment.deleteData(1, 631), with selected range collapsed at (detachedComment, 1)]
+ expected: FAIL
+
+ [detachedComment.deleteData(detachedComment.length, 631), with selected range collapsed at (detachedComment, detachedComment.length)]
+ expected: FAIL
+
+ [detachedComment.deleteData(1, 631), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.deleteData(2, 631), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.deleteData(3, 631), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.deleteData(376, 2), with selected range on detachedForeignComment from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignComment.deleteData(0, 2), with selected range collapsed at (detachedForeignComment, 0)]
+ expected: FAIL
+
+ [detachedForeignComment.deleteData(1, 2), with selected range collapsed at (detachedForeignComment, 1)]
+ expected: FAIL
+
+ [detachedForeignComment.deleteData(detachedForeignComment.length, 2), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
+ expected: FAIL
+
+ [detachedForeignComment.deleteData(1, 2), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.deleteData(2, 2), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.deleteData(3, 2), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.deleteData(376, 0), with selected range on detachedForeignComment from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignComment.deleteData(0, 0), with selected range collapsed at (detachedForeignComment, 0)]
+ expected: FAIL
+
+ [detachedForeignComment.deleteData(1, 0), with selected range collapsed at (detachedForeignComment, 1)]
+ expected: FAIL
+
+ [detachedForeignComment.deleteData(detachedForeignComment.length, 0), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
+ expected: FAIL
+
+ [detachedForeignComment.deleteData(1, 0), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.deleteData(2, 0), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.deleteData(3, 0), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.deleteData(376, 631), with selected range on detachedForeignComment from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignComment.deleteData(0, 631), with selected range collapsed at (detachedForeignComment, 0)]
+ expected: FAIL
+
+ [detachedForeignComment.deleteData(1, 631), with selected range collapsed at (detachedForeignComment, 1)]
+ expected: FAIL
+
+ [detachedForeignComment.deleteData(detachedForeignComment.length, 631), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
+ expected: FAIL
+
+ [detachedForeignComment.deleteData(1, 631), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.deleteData(2, 631), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.deleteData(3, 631), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.deleteData(376, 2), with selected range on detachedXmlComment from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlComment.deleteData(0, 2), with selected range collapsed at (detachedXmlComment, 0)]
+ expected: FAIL
+
+ [detachedXmlComment.deleteData(1, 2), with selected range collapsed at (detachedXmlComment, 1)]
+ expected: FAIL
+
+ [detachedXmlComment.deleteData(detachedXmlComment.length, 2), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
+ expected: FAIL
+
+ [detachedXmlComment.deleteData(1, 2), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.deleteData(2, 2), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.deleteData(3, 2), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.deleteData(376, 0), with selected range on detachedXmlComment from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlComment.deleteData(0, 0), with selected range collapsed at (detachedXmlComment, 0)]
+ expected: FAIL
+
+ [detachedXmlComment.deleteData(1, 0), with selected range collapsed at (detachedXmlComment, 1)]
+ expected: FAIL
+
+ [detachedXmlComment.deleteData(detachedXmlComment.length, 0), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
+ expected: FAIL
+
+ [detachedXmlComment.deleteData(1, 0), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.deleteData(2, 0), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.deleteData(3, 0), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.deleteData(376, 631), with selected range on detachedXmlComment from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlComment.deleteData(0, 631), with selected range collapsed at (detachedXmlComment, 0)]
+ expected: FAIL
+
+ [detachedXmlComment.deleteData(1, 631), with selected range collapsed at (detachedXmlComment, 1)]
+ expected: FAIL
+
+ [detachedXmlComment.deleteData(detachedXmlComment.length, 631), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
+ expected: FAIL
+
+ [detachedXmlComment.deleteData(1, 631), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.deleteData(2, 631), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.deleteData(3, 631), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(1, 2), with selected range collapsed at (paras[0\], 0)]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(1, 2), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(1, 2), with selected range collapsed at (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(1, 2), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(2, 2), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(3, 2), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(1, 2), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(2, 2), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
+ expected: FAIL
+
+ [paras[0\].firstChild.deleteData(3, 2), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/ranges/Range-mutations-insertBefore.html.ini b/tests/wpt/metadata/dom/ranges/Range-mutations-insertBefore.html.ini
new file mode 100644
index 00000000000..1f4099d07b6
--- /dev/null
+++ b/tests/wpt/metadata/dom/ranges/Range-mutations-insertBefore.html.ini
@@ -0,0 +1,116 @@
+[Range-mutations-insertBefore.html]
+ type: testharness
+ [testDiv.insertBefore(paras[0\], paras[1\]), with selected range collapsed at (paras[0\], 0)]
+ expected: FAIL
+
+ [testDiv.insertBefore(paras[0\], paras[1\]), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [testDiv.insertBefore(paras[0\], paras[1\]), with selected range collapsed at (paras[0\], 1)]
+ expected: FAIL
+
+ [testDiv.insertBefore(paras[0\], paras[1\]), with selected range on testDiv from 0 to 2]
+ expected: FAIL
+
+ [testDiv.insertBefore(paras[0\], paras[1\]), with selected range collapsed at (testDiv, 1)]
+ expected: FAIL
+
+ [testDiv.insertBefore(paras[0\], paras[1\]), with selected range on testDiv from 1 to 2]
+ expected: FAIL
+
+ [testDiv.insertBefore(paras[0\], paras[1\]), with selected range collapsed at (testDiv, 2)]
+ expected: FAIL
+
+ [paras[0\].insertBefore(paras[1\], paras[0\].firstChild), with selected range collapsed at (paras[0\], 0)]
+ expected: FAIL
+
+ [paras[0\].insertBefore(paras[1\], paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].insertBefore(paras[1\], paras[0\].firstChild), with selected range collapsed at (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].insertBefore(paras[1\], paras[0\].firstChild), with selected range on testDiv from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].insertBefore(paras[1\], paras[0\].firstChild), with selected range on testDiv from 0 to 2]
+ expected: FAIL
+
+ [paras[0\].insertBefore(paras[1\], paras[0\].firstChild), with selected range collapsed at (testDiv, 1)]
+ expected: FAIL
+
+ [paras[0\].insertBefore(paras[1\], paras[0\].firstChild), with selected range on testDiv from 1 to 2]
+ expected: FAIL
+
+ [paras[0\].insertBefore(paras[1\], null), with selected range collapsed at (paras[0\], 0)]
+ expected: FAIL
+
+ [paras[0\].insertBefore(paras[1\], null), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].insertBefore(paras[1\], null), with selected range collapsed at (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].insertBefore(paras[1\], null), with selected range on testDiv from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].insertBefore(paras[1\], null), with selected range on testDiv from 0 to 2]
+ expected: FAIL
+
+ [paras[0\].insertBefore(paras[1\], null), with selected range collapsed at (testDiv, 1)]
+ expected: FAIL
+
+ [paras[0\].insertBefore(paras[1\], null), with selected range on testDiv from 1 to 2]
+ expected: FAIL
+
+ [foreignDoc.insertBefore(detachedComment, foreignDoc.documentElement), with selected range collapsed at (foreignDoc, 0)]
+ expected: FAIL
+
+ [foreignDoc.insertBefore(detachedComment, foreignDoc.documentElement), with selected range on foreignDoc from 0 to 1]
+ expected: FAIL
+
+ [foreignDoc.insertBefore(detachedComment, foreignDoc.documentElement), with selected range on foreignDoc from 0 to 2]
+ expected: FAIL
+
+ [foreignDoc.insertBefore(detachedComment, foreignDoc.documentElement), with selected range collapsed at (foreignDoc, 1)]
+ expected: FAIL
+
+ [foreignDoc.insertBefore(detachedComment, foreignDoc.doctype), with selected range collapsed at (foreignDoc, 0)]
+ expected: FAIL
+
+ [foreignDoc.insertBefore(detachedComment, foreignDoc.doctype), with selected range on foreignDoc from 0 to 1]
+ expected: FAIL
+
+ [foreignDoc.insertBefore(detachedComment, foreignDoc.doctype), with selected range on foreignDoc from 0 to 2]
+ expected: FAIL
+
+ [foreignDoc.insertBefore(detachedComment, foreignDoc.doctype), with selected range collapsed at (foreignDoc, 1)]
+ expected: FAIL
+
+ [foreignDoc.insertBefore(detachedComment, null), with selected range on foreignDoc from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].insertBefore(xmlTextNode, paras[0\].firstChild), with selected range collapsed at (paras[0\], 0)]
+ expected: FAIL
+
+ [paras[0\].insertBefore(xmlTextNode, paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].insertBefore(xmlTextNode, paras[0\].firstChild), with selected range collapsed at (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].insertBefore(paras[0\], paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].insertBefore(testDiv, paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].insertBefore(document, paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].insertBefore(foreignDoc, paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].insertBefore(document.doctype, paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/ranges/Range-mutations-insertData.html.ini b/tests/wpt/metadata/dom/ranges/Range-mutations-insertData.html.ini
new file mode 100644
index 00000000000..c003d9ddcff
--- /dev/null
+++ b/tests/wpt/metadata/dom/ranges/Range-mutations-insertData.html.ini
@@ -0,0 +1,575 @@
+[Range-mutations-insertData.html]
+ type: testharness
+ [paras[0\].firstChild.insertData(376, "foo"), with selected range on paras[0\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].firstChild.insertData(0, "foo"), with selected range collapsed at (paras[0\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[0\].firstChild.insertData(1, "foo"), with selected range collapsed at (paras[0\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.insertData(paras[0\].firstChild.length, "foo"), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
+ expected: FAIL
+
+ [paras[0\].firstChild.insertData(1, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.insertData(2, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.insertData(3, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.insertData(376, ""), with selected range on paras[0\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].firstChild.insertData(0, ""), with selected range collapsed at (paras[0\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[0\].firstChild.insertData(1, ""), with selected range collapsed at (paras[0\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.insertData(paras[0\].firstChild.length, ""), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
+ expected: FAIL
+
+ [paras[0\].firstChild.insertData(1, ""), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.insertData(2, ""), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.insertData(3, ""), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.insertData(376, "foo"), with selected range on paras[1\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[1\].firstChild.insertData(0, "foo"), with selected range collapsed at (paras[1\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[1\].firstChild.insertData(1, "foo"), with selected range collapsed at (paras[1\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[1\].firstChild.insertData(paras[1\].firstChild.length, "foo"), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
+ expected: FAIL
+
+ [paras[1\].firstChild.insertData(1, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.insertData(2, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.insertData(3, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.insertData(376, ""), with selected range on paras[1\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[1\].firstChild.insertData(0, ""), with selected range collapsed at (paras[1\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[1\].firstChild.insertData(1, ""), with selected range collapsed at (paras[1\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[1\].firstChild.insertData(paras[1\].firstChild.length, ""), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
+ expected: FAIL
+
+ [paras[1\].firstChild.insertData(1, ""), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.insertData(2, ""), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.insertData(3, ""), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.insertData(376, "foo"), with selected range on foreignTextNode from 0 to 1]
+ expected: FAIL
+
+ [foreignTextNode.insertData(0, "foo"), with selected range collapsed at (foreignTextNode, 0)]
+ expected: FAIL
+
+ [foreignTextNode.insertData(1, "foo"), with selected range collapsed at (foreignTextNode, 1)]
+ expected: FAIL
+
+ [foreignTextNode.insertData(foreignTextNode.length, "foo"), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
+ expected: FAIL
+
+ [foreignTextNode.insertData(1, "foo"), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.insertData(2, "foo"), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.insertData(3, "foo"), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.insertData(376, ""), with selected range on foreignTextNode from 0 to 1]
+ expected: FAIL
+
+ [foreignTextNode.insertData(0, ""), with selected range collapsed at (foreignTextNode, 0)]
+ expected: FAIL
+
+ [foreignTextNode.insertData(1, ""), with selected range collapsed at (foreignTextNode, 1)]
+ expected: FAIL
+
+ [foreignTextNode.insertData(foreignTextNode.length, ""), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
+ expected: FAIL
+
+ [foreignTextNode.insertData(1, ""), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.insertData(2, ""), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.insertData(3, ""), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.insertData(376, "foo"), with selected range on xmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [xmlTextNode.insertData(0, "foo"), with selected range collapsed at (xmlTextNode, 0)]
+ expected: FAIL
+
+ [xmlTextNode.insertData(1, "foo"), with selected range collapsed at (xmlTextNode, 1)]
+ expected: FAIL
+
+ [xmlTextNode.insertData(xmlTextNode.length, "foo"), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
+ expected: FAIL
+
+ [xmlTextNode.insertData(1, "foo"), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.insertData(2, "foo"), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.insertData(3, "foo"), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.insertData(376, ""), with selected range on xmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [xmlTextNode.insertData(0, ""), with selected range collapsed at (xmlTextNode, 0)]
+ expected: FAIL
+
+ [xmlTextNode.insertData(1, ""), with selected range collapsed at (xmlTextNode, 1)]
+ expected: FAIL
+
+ [xmlTextNode.insertData(xmlTextNode.length, ""), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
+ expected: FAIL
+
+ [xmlTextNode.insertData(1, ""), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.insertData(2, ""), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.insertData(3, ""), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.insertData(376, "foo"), with selected range on detachedTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedTextNode.insertData(0, "foo"), with selected range collapsed at (detachedTextNode, 0)]
+ expected: FAIL
+
+ [detachedTextNode.insertData(1, "foo"), with selected range collapsed at (detachedTextNode, 1)]
+ expected: FAIL
+
+ [detachedTextNode.insertData(detachedTextNode.length, "foo"), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
+ expected: FAIL
+
+ [detachedTextNode.insertData(1, "foo"), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.insertData(2, "foo"), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.insertData(3, "foo"), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.insertData(376, ""), with selected range on detachedTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedTextNode.insertData(0, ""), with selected range collapsed at (detachedTextNode, 0)]
+ expected: FAIL
+
+ [detachedTextNode.insertData(1, ""), with selected range collapsed at (detachedTextNode, 1)]
+ expected: FAIL
+
+ [detachedTextNode.insertData(detachedTextNode.length, ""), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
+ expected: FAIL
+
+ [detachedTextNode.insertData(1, ""), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.insertData(2, ""), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.insertData(3, ""), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.insertData(376, "foo"), with selected range on detachedForeignTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignTextNode.insertData(0, "foo"), with selected range collapsed at (detachedForeignTextNode, 0)]
+ expected: FAIL
+
+ [detachedForeignTextNode.insertData(1, "foo"), with selected range collapsed at (detachedForeignTextNode, 1)]
+ expected: FAIL
+
+ [detachedForeignTextNode.insertData(detachedForeignTextNode.length, "foo"), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
+ expected: FAIL
+
+ [detachedForeignTextNode.insertData(1, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.insertData(2, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.insertData(3, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.insertData(376, ""), with selected range on detachedForeignTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignTextNode.insertData(0, ""), with selected range collapsed at (detachedForeignTextNode, 0)]
+ expected: FAIL
+
+ [detachedForeignTextNode.insertData(1, ""), with selected range collapsed at (detachedForeignTextNode, 1)]
+ expected: FAIL
+
+ [detachedForeignTextNode.insertData(detachedForeignTextNode.length, ""), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
+ expected: FAIL
+
+ [detachedForeignTextNode.insertData(1, ""), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.insertData(2, ""), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.insertData(3, ""), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.insertData(376, "foo"), with selected range on detachedXmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlTextNode.insertData(0, "foo"), with selected range collapsed at (detachedXmlTextNode, 0)]
+ expected: FAIL
+
+ [detachedXmlTextNode.insertData(1, "foo"), with selected range collapsed at (detachedXmlTextNode, 1)]
+ expected: FAIL
+
+ [detachedXmlTextNode.insertData(detachedXmlTextNode.length, "foo"), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
+ expected: FAIL
+
+ [detachedXmlTextNode.insertData(1, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.insertData(2, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.insertData(3, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.insertData(376, ""), with selected range on detachedXmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlTextNode.insertData(0, ""), with selected range collapsed at (detachedXmlTextNode, 0)]
+ expected: FAIL
+
+ [detachedXmlTextNode.insertData(1, ""), with selected range collapsed at (detachedXmlTextNode, 1)]
+ expected: FAIL
+
+ [detachedXmlTextNode.insertData(detachedXmlTextNode.length, ""), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
+ expected: FAIL
+
+ [detachedXmlTextNode.insertData(1, ""), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.insertData(2, ""), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.insertData(3, ""), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [comment.insertData(376, "foo"), with selected range on comment from 0 to 1]
+ expected: FAIL
+
+ [comment.insertData(0, "foo"), with selected range collapsed at (comment, 0)]
+ expected: FAIL
+
+ [comment.insertData(1, "foo"), with selected range collapsed at (comment, 1)]
+ expected: FAIL
+
+ [comment.insertData(comment.length, "foo"), with selected range collapsed at (comment, comment.length)]
+ expected: FAIL
+
+ [comment.insertData(1, "foo"), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.insertData(2, "foo"), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.insertData(3, "foo"), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.insertData(376, ""), with selected range on comment from 0 to 1]
+ expected: FAIL
+
+ [comment.insertData(0, ""), with selected range collapsed at (comment, 0)]
+ expected: FAIL
+
+ [comment.insertData(1, ""), with selected range collapsed at (comment, 1)]
+ expected: FAIL
+
+ [comment.insertData(comment.length, ""), with selected range collapsed at (comment, comment.length)]
+ expected: FAIL
+
+ [comment.insertData(1, ""), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.insertData(2, ""), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.insertData(3, ""), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.insertData(376, "foo"), with selected range on foreignComment from 0 to 1]
+ expected: FAIL
+
+ [foreignComment.insertData(0, "foo"), with selected range collapsed at (foreignComment, 0)]
+ expected: FAIL
+
+ [foreignComment.insertData(1, "foo"), with selected range collapsed at (foreignComment, 1)]
+ expected: FAIL
+
+ [foreignComment.insertData(foreignComment.length, "foo"), with selected range collapsed at (foreignComment, foreignComment.length)]
+ expected: FAIL
+
+ [foreignComment.insertData(1, "foo"), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.insertData(2, "foo"), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.insertData(3, "foo"), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.insertData(376, ""), with selected range on foreignComment from 0 to 1]
+ expected: FAIL
+
+ [foreignComment.insertData(0, ""), with selected range collapsed at (foreignComment, 0)]
+ expected: FAIL
+
+ [foreignComment.insertData(1, ""), with selected range collapsed at (foreignComment, 1)]
+ expected: FAIL
+
+ [foreignComment.insertData(foreignComment.length, ""), with selected range collapsed at (foreignComment, foreignComment.length)]
+ expected: FAIL
+
+ [foreignComment.insertData(1, ""), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.insertData(2, ""), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.insertData(3, ""), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.insertData(376, "foo"), with selected range on xmlComment from 0 to 1]
+ expected: FAIL
+
+ [xmlComment.insertData(0, "foo"), with selected range collapsed at (xmlComment, 0)]
+ expected: FAIL
+
+ [xmlComment.insertData(1, "foo"), with selected range collapsed at (xmlComment, 1)]
+ expected: FAIL
+
+ [xmlComment.insertData(xmlComment.length, "foo"), with selected range collapsed at (xmlComment, xmlComment.length)]
+ expected: FAIL
+
+ [xmlComment.insertData(1, "foo"), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.insertData(2, "foo"), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.insertData(3, "foo"), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.insertData(376, ""), with selected range on xmlComment from 0 to 1]
+ expected: FAIL
+
+ [xmlComment.insertData(0, ""), with selected range collapsed at (xmlComment, 0)]
+ expected: FAIL
+
+ [xmlComment.insertData(1, ""), with selected range collapsed at (xmlComment, 1)]
+ expected: FAIL
+
+ [xmlComment.insertData(xmlComment.length, ""), with selected range collapsed at (xmlComment, xmlComment.length)]
+ expected: FAIL
+
+ [xmlComment.insertData(1, ""), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.insertData(2, ""), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.insertData(3, ""), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.insertData(376, "foo"), with selected range on detachedComment from 0 to 1]
+ expected: FAIL
+
+ [detachedComment.insertData(0, "foo"), with selected range collapsed at (detachedComment, 0)]
+ expected: FAIL
+
+ [detachedComment.insertData(1, "foo"), with selected range collapsed at (detachedComment, 1)]
+ expected: FAIL
+
+ [detachedComment.insertData(detachedComment.length, "foo"), with selected range collapsed at (detachedComment, detachedComment.length)]
+ expected: FAIL
+
+ [detachedComment.insertData(1, "foo"), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.insertData(2, "foo"), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.insertData(3, "foo"), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.insertData(376, ""), with selected range on detachedComment from 0 to 1]
+ expected: FAIL
+
+ [detachedComment.insertData(0, ""), with selected range collapsed at (detachedComment, 0)]
+ expected: FAIL
+
+ [detachedComment.insertData(1, ""), with selected range collapsed at (detachedComment, 1)]
+ expected: FAIL
+
+ [detachedComment.insertData(detachedComment.length, ""), with selected range collapsed at (detachedComment, detachedComment.length)]
+ expected: FAIL
+
+ [detachedComment.insertData(1, ""), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.insertData(2, ""), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.insertData(3, ""), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.insertData(376, "foo"), with selected range on detachedForeignComment from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignComment.insertData(0, "foo"), with selected range collapsed at (detachedForeignComment, 0)]
+ expected: FAIL
+
+ [detachedForeignComment.insertData(1, "foo"), with selected range collapsed at (detachedForeignComment, 1)]
+ expected: FAIL
+
+ [detachedForeignComment.insertData(detachedForeignComment.length, "foo"), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
+ expected: FAIL
+
+ [detachedForeignComment.insertData(1, "foo"), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.insertData(2, "foo"), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.insertData(3, "foo"), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.insertData(376, ""), with selected range on detachedForeignComment from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignComment.insertData(0, ""), with selected range collapsed at (detachedForeignComment, 0)]
+ expected: FAIL
+
+ [detachedForeignComment.insertData(1, ""), with selected range collapsed at (detachedForeignComment, 1)]
+ expected: FAIL
+
+ [detachedForeignComment.insertData(detachedForeignComment.length, ""), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
+ expected: FAIL
+
+ [detachedForeignComment.insertData(1, ""), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.insertData(2, ""), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.insertData(3, ""), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.insertData(376, "foo"), with selected range on detachedXmlComment from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlComment.insertData(0, "foo"), with selected range collapsed at (detachedXmlComment, 0)]
+ expected: FAIL
+
+ [detachedXmlComment.insertData(1, "foo"), with selected range collapsed at (detachedXmlComment, 1)]
+ expected: FAIL
+
+ [detachedXmlComment.insertData(detachedXmlComment.length, "foo"), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
+ expected: FAIL
+
+ [detachedXmlComment.insertData(1, "foo"), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.insertData(2, "foo"), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.insertData(3, "foo"), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.insertData(376, ""), with selected range on detachedXmlComment from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlComment.insertData(0, ""), with selected range collapsed at (detachedXmlComment, 0)]
+ expected: FAIL
+
+ [detachedXmlComment.insertData(1, ""), with selected range collapsed at (detachedXmlComment, 1)]
+ expected: FAIL
+
+ [detachedXmlComment.insertData(detachedXmlComment.length, ""), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
+ expected: FAIL
+
+ [detachedXmlComment.insertData(1, ""), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.insertData(2, ""), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.insertData(3, ""), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.insertData(1, "foo"), with selected range collapsed at (paras[0\], 0)]
+ expected: FAIL
+
+ [paras[0\].firstChild.insertData(1, "foo"), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].firstChild.insertData(1, "foo"), with selected range collapsed at (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.insertData(1, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.insertData(2, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.insertData(3, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.insertData(1, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
+ expected: FAIL
+
+ [paras[0\].firstChild.insertData(2, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
+ expected: FAIL
+
+ [paras[0\].firstChild.insertData(3, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/ranges/Range-mutations-removeChild.html.ini b/tests/wpt/metadata/dom/ranges/Range-mutations-removeChild.html.ini
new file mode 100644
index 00000000000..375bc388a0e
--- /dev/null
+++ b/tests/wpt/metadata/dom/ranges/Range-mutations-removeChild.html.ini
@@ -0,0 +1,32 @@
+[Range-mutations-removeChild.html]
+ type: testharness
+ [paras[0\].parentNode.removeChild(paras[0\]), with selected range collapsed at (paras[0\], 0)]
+ expected: FAIL
+
+ [paras[0\].parentNode.removeChild(paras[0\]), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].parentNode.removeChild(paras[0\]), with selected range collapsed at (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].parentNode.removeChild(paras[0\]), with selected range collapsed at (testDiv, 0)]
+ expected: FAIL
+
+ [paras[0\].parentNode.removeChild(paras[0\]), with selected range on testDiv from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].parentNode.removeChild(paras[0\]), with selected range collapsed at (testDiv, 1)]
+ expected: FAIL
+
+ [paras[0\].parentNode.removeChild(paras[0\]), with selected range on testDiv from 0 to 2]
+ expected: FAIL
+
+ [paras[0\].parentNode.removeChild(paras[0\]), with selected range on testDiv from 1 to 2]
+ expected: FAIL
+
+ [paras[0\].parentNode.removeChild(paras[0\]), with selected range collapsed at (testDiv, 2)]
+ expected: FAIL
+
+ [foreignDoc.documentElement.parentNode.removeChild(foreignDoc.documentElement), with selected range on foreignDoc from 0 to foreignDoc.childNodes.length]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/ranges/Range-mutations-replaceChild.html.ini b/tests/wpt/metadata/dom/ranges/Range-mutations-replaceChild.html.ini
new file mode 100644
index 00000000000..46bed5e4565
--- /dev/null
+++ b/tests/wpt/metadata/dom/ranges/Range-mutations-replaceChild.html.ini
@@ -0,0 +1,92 @@
+[Range-mutations-replaceChild.html]
+ type: testharness
+ [testDiv.replaceChild(paras[0\], paras[0\]), with selected range collapsed at (paras[0\], 0)]
+ expected: FAIL
+
+ [testDiv.replaceChild(paras[0\], paras[0\]), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [testDiv.replaceChild(paras[0\], paras[0\]), with selected range collapsed at (paras[0\], 1)]
+ expected: FAIL
+
+ [testDiv.replaceChild(paras[0\], paras[0\]), with selected range on testDiv from 0 to 2]
+ expected: FAIL
+
+ [testDiv.replaceChild(paras[0\], paras[0\]), with selected range collapsed at (testDiv, 1)]
+ expected: FAIL
+
+ [testDiv.replaceChild(paras[0\], paras[0\]), with selected range on testDiv from 1 to 2]
+ expected: FAIL
+
+ [testDiv.replaceChild(paras[0\], paras[0\]), with selected range collapsed at (testDiv, 2)]
+ expected: FAIL
+
+ [paras[0\].replaceChild(paras[1\], paras[0\].firstChild), with selected range collapsed at (paras[0\], 0)]
+ expected: FAIL
+
+ [paras[0\].replaceChild(paras[1\], paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].replaceChild(paras[1\], paras[0\].firstChild), with selected range collapsed at (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].replaceChild(paras[1\], paras[0\].firstChild), with selected range on testDiv from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].replaceChild(paras[1\], paras[0\].firstChild), with selected range on testDiv from 0 to 2]
+ expected: FAIL
+
+ [paras[0\].replaceChild(paras[1\], paras[0\].firstChild), with selected range collapsed at (testDiv, 1)]
+ expected: FAIL
+
+ [paras[0\].replaceChild(paras[1\], paras[0\].firstChild), with selected range on testDiv from 1 to 2]
+ expected: FAIL
+
+ [foreignDoc.replaceChild(detachedComment, foreignDoc.documentElement), with selected range collapsed at (foreignDoc, 0)]
+ expected: FAIL
+
+ [foreignDoc.replaceChild(detachedComment, foreignDoc.documentElement), with selected range on foreignDoc from 0 to 1]
+ expected: FAIL
+
+ [foreignDoc.replaceChild(detachedComment, foreignDoc.documentElement), with selected range on foreignDoc from 0 to 2]
+ expected: FAIL
+
+ [foreignDoc.replaceChild(detachedComment, foreignDoc.documentElement), with selected range collapsed at (foreignDoc, 1)]
+ expected: FAIL
+
+ [foreignDoc.replaceChild(detachedComment, foreignDoc.doctype), with selected range collapsed at (foreignDoc, 0)]
+ expected: FAIL
+
+ [foreignDoc.replaceChild(detachedComment, foreignDoc.doctype), with selected range on foreignDoc from 0 to 1]
+ expected: FAIL
+
+ [foreignDoc.replaceChild(detachedComment, foreignDoc.doctype), with selected range on foreignDoc from 0 to 2]
+ expected: FAIL
+
+ [foreignDoc.replaceChild(detachedComment, foreignDoc.doctype), with selected range collapsed at (foreignDoc, 1)]
+ expected: FAIL
+
+ [paras[0\].replaceChild(xmlTextNode, paras[0\].firstChild), with selected range collapsed at (paras[0\], 0)]
+ expected: FAIL
+
+ [paras[0\].replaceChild(xmlTextNode, paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].replaceChild(xmlTextNode, paras[0\].firstChild), with selected range collapsed at (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].replaceChild(paras[0\], paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].replaceChild(testDiv, paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].replaceChild(document, paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].replaceChild(foreignDoc, paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].replaceChild(document.doctype, paras[0\].firstChild), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/ranges/Range-mutations-replaceData.html.ini b/tests/wpt/metadata/dom/ranges/Range-mutations-replaceData.html.ini
new file mode 100644
index 00000000000..8d565de4cef
--- /dev/null
+++ b/tests/wpt/metadata/dom/ranges/Range-mutations-replaceData.html.ini
@@ -0,0 +1,1721 @@
+[Range-mutations-replaceData.html]
+ type: testharness
+ [paras[0\].firstChild.replaceData(376, 0, "foo"), with selected range on paras[0\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(0, 0, "foo"), with selected range collapsed at (paras[0\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 0, "foo"), with selected range collapsed at (paras[0\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(paras[0\].firstChild.length, 0, "foo"), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 0, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(2, 0, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(3, 0, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(376, 0, ""), with selected range on paras[0\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(0, 0, ""), with selected range collapsed at (paras[0\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 0, ""), with selected range collapsed at (paras[0\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(paras[0\].firstChild.length, 0, ""), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 0, ""), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(2, 0, ""), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(3, 0, ""), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(376, 1, "foo"), with selected range on paras[0\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(0, 1, "foo"), with selected range collapsed at (paras[0\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 1, "foo"), with selected range collapsed at (paras[0\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(paras[0\].firstChild.length, 1, "foo"), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 1, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(2, 1, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(3, 1, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(376, 1, ""), with selected range on paras[0\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(0, 1, ""), with selected range collapsed at (paras[0\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 1, ""), with selected range collapsed at (paras[0\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(paras[0\].firstChild.length, 1, ""), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 1, ""), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(2, 1, ""), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(3, 1, ""), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(376, 47, "foo"), with selected range on paras[0\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(0, 47, "foo"), with selected range collapsed at (paras[0\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 47, "foo"), with selected range collapsed at (paras[0\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(paras[0\].firstChild.length, 47, "foo"), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 47, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(2, 47, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(3, 47, "foo"), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(376, 47, ""), with selected range on paras[0\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(0, 47, ""), with selected range collapsed at (paras[0\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 47, ""), with selected range collapsed at (paras[0\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(paras[0\].firstChild.length, 47, ""), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 47, ""), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(2, 47, ""), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(3, 47, ""), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(376, 0, "foo"), with selected range on paras[1\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(0, 0, "foo"), with selected range collapsed at (paras[1\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(1, 0, "foo"), with selected range collapsed at (paras[1\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(paras[1\].firstChild.length, 0, "foo"), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(1, 0, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(2, 0, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(3, 0, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(376, 0, ""), with selected range on paras[1\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(0, 0, ""), with selected range collapsed at (paras[1\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(1, 0, ""), with selected range collapsed at (paras[1\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(paras[1\].firstChild.length, 0, ""), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(1, 0, ""), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(2, 0, ""), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(3, 0, ""), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(376, 1, "foo"), with selected range on paras[1\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(0, 1, "foo"), with selected range collapsed at (paras[1\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(1, 1, "foo"), with selected range collapsed at (paras[1\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(paras[1\].firstChild.length, 1, "foo"), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(1, 1, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(2, 1, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(3, 1, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(376, 1, ""), with selected range on paras[1\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(0, 1, ""), with selected range collapsed at (paras[1\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(1, 1, ""), with selected range collapsed at (paras[1\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(paras[1\].firstChild.length, 1, ""), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(1, 1, ""), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(2, 1, ""), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(3, 1, ""), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(376, 47, "foo"), with selected range on paras[1\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(0, 47, "foo"), with selected range collapsed at (paras[1\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(1, 47, "foo"), with selected range collapsed at (paras[1\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(paras[1\].firstChild.length, 47, "foo"), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(1, 47, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(2, 47, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(3, 47, "foo"), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(376, 47, ""), with selected range on paras[1\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(0, 47, ""), with selected range collapsed at (paras[1\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(1, 47, ""), with selected range collapsed at (paras[1\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(paras[1\].firstChild.length, 47, ""), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(1, 47, ""), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(2, 47, ""), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.replaceData(3, 47, ""), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(376, 0, "foo"), with selected range on foreignTextNode from 0 to 1]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(0, 0, "foo"), with selected range collapsed at (foreignTextNode, 0)]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(1, 0, "foo"), with selected range collapsed at (foreignTextNode, 1)]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(foreignTextNode.length, 0, "foo"), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(1, 0, "foo"), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(2, 0, "foo"), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(3, 0, "foo"), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(376, 0, ""), with selected range on foreignTextNode from 0 to 1]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(0, 0, ""), with selected range collapsed at (foreignTextNode, 0)]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(1, 0, ""), with selected range collapsed at (foreignTextNode, 1)]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(foreignTextNode.length, 0, ""), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(1, 0, ""), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(2, 0, ""), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(3, 0, ""), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(376, 1, "foo"), with selected range on foreignTextNode from 0 to 1]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(0, 1, "foo"), with selected range collapsed at (foreignTextNode, 0)]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(1, 1, "foo"), with selected range collapsed at (foreignTextNode, 1)]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(foreignTextNode.length, 1, "foo"), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(1, 1, "foo"), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(2, 1, "foo"), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(3, 1, "foo"), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(376, 1, ""), with selected range on foreignTextNode from 0 to 1]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(0, 1, ""), with selected range collapsed at (foreignTextNode, 0)]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(1, 1, ""), with selected range collapsed at (foreignTextNode, 1)]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(foreignTextNode.length, 1, ""), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(1, 1, ""), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(2, 1, ""), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(3, 1, ""), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(376, 47, "foo"), with selected range on foreignTextNode from 0 to 1]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(0, 47, "foo"), with selected range collapsed at (foreignTextNode, 0)]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(1, 47, "foo"), with selected range collapsed at (foreignTextNode, 1)]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(foreignTextNode.length, 47, "foo"), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(1, 47, "foo"), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(2, 47, "foo"), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(3, 47, "foo"), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(376, 47, ""), with selected range on foreignTextNode from 0 to 1]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(0, 47, ""), with selected range collapsed at (foreignTextNode, 0)]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(1, 47, ""), with selected range collapsed at (foreignTextNode, 1)]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(foreignTextNode.length, 47, ""), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(1, 47, ""), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(2, 47, ""), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.replaceData(3, 47, ""), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(376, 0, "foo"), with selected range on xmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(0, 0, "foo"), with selected range collapsed at (xmlTextNode, 0)]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(1, 0, "foo"), with selected range collapsed at (xmlTextNode, 1)]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(xmlTextNode.length, 0, "foo"), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(1, 0, "foo"), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(2, 0, "foo"), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(3, 0, "foo"), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(376, 0, ""), with selected range on xmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(0, 0, ""), with selected range collapsed at (xmlTextNode, 0)]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(1, 0, ""), with selected range collapsed at (xmlTextNode, 1)]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(xmlTextNode.length, 0, ""), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(1, 0, ""), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(2, 0, ""), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(3, 0, ""), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(376, 1, "foo"), with selected range on xmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(0, 1, "foo"), with selected range collapsed at (xmlTextNode, 0)]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(1, 1, "foo"), with selected range collapsed at (xmlTextNode, 1)]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(xmlTextNode.length, 1, "foo"), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(1, 1, "foo"), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(2, 1, "foo"), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(3, 1, "foo"), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(376, 1, ""), with selected range on xmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(0, 1, ""), with selected range collapsed at (xmlTextNode, 0)]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(1, 1, ""), with selected range collapsed at (xmlTextNode, 1)]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(xmlTextNode.length, 1, ""), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(1, 1, ""), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(2, 1, ""), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(3, 1, ""), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(376, 47, "foo"), with selected range on xmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(0, 47, "foo"), with selected range collapsed at (xmlTextNode, 0)]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(1, 47, "foo"), with selected range collapsed at (xmlTextNode, 1)]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(xmlTextNode.length, 47, "foo"), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(1, 47, "foo"), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(2, 47, "foo"), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(3, 47, "foo"), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(376, 47, ""), with selected range on xmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(0, 47, ""), with selected range collapsed at (xmlTextNode, 0)]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(1, 47, ""), with selected range collapsed at (xmlTextNode, 1)]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(xmlTextNode.length, 47, ""), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(1, 47, ""), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(2, 47, ""), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.replaceData(3, 47, ""), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(376, 0, "foo"), with selected range on detachedTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(0, 0, "foo"), with selected range collapsed at (detachedTextNode, 0)]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(1, 0, "foo"), with selected range collapsed at (detachedTextNode, 1)]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(detachedTextNode.length, 0, "foo"), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(1, 0, "foo"), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(2, 0, "foo"), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(3, 0, "foo"), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(376, 0, ""), with selected range on detachedTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(0, 0, ""), with selected range collapsed at (detachedTextNode, 0)]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(1, 0, ""), with selected range collapsed at (detachedTextNode, 1)]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(detachedTextNode.length, 0, ""), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(1, 0, ""), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(2, 0, ""), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(3, 0, ""), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(376, 1, "foo"), with selected range on detachedTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(0, 1, "foo"), with selected range collapsed at (detachedTextNode, 0)]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(1, 1, "foo"), with selected range collapsed at (detachedTextNode, 1)]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(detachedTextNode.length, 1, "foo"), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(1, 1, "foo"), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(2, 1, "foo"), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(3, 1, "foo"), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(376, 1, ""), with selected range on detachedTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(0, 1, ""), with selected range collapsed at (detachedTextNode, 0)]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(1, 1, ""), with selected range collapsed at (detachedTextNode, 1)]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(detachedTextNode.length, 1, ""), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(1, 1, ""), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(2, 1, ""), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(3, 1, ""), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(376, 47, "foo"), with selected range on detachedTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(0, 47, "foo"), with selected range collapsed at (detachedTextNode, 0)]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(1, 47, "foo"), with selected range collapsed at (detachedTextNode, 1)]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(detachedTextNode.length, 47, "foo"), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(1, 47, "foo"), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(2, 47, "foo"), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(3, 47, "foo"), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(376, 47, ""), with selected range on detachedTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(0, 47, ""), with selected range collapsed at (detachedTextNode, 0)]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(1, 47, ""), with selected range collapsed at (detachedTextNode, 1)]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(detachedTextNode.length, 47, ""), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(1, 47, ""), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(2, 47, ""), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.replaceData(3, 47, ""), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(376, 0, "foo"), with selected range on detachedForeignTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(0, 0, "foo"), with selected range collapsed at (detachedForeignTextNode, 0)]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(1, 0, "foo"), with selected range collapsed at (detachedForeignTextNode, 1)]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(detachedForeignTextNode.length, 0, "foo"), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(1, 0, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(2, 0, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(3, 0, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(376, 0, ""), with selected range on detachedForeignTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(0, 0, ""), with selected range collapsed at (detachedForeignTextNode, 0)]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(1, 0, ""), with selected range collapsed at (detachedForeignTextNode, 1)]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(detachedForeignTextNode.length, 0, ""), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(1, 0, ""), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(2, 0, ""), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(3, 0, ""), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(376, 1, "foo"), with selected range on detachedForeignTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(0, 1, "foo"), with selected range collapsed at (detachedForeignTextNode, 0)]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(1, 1, "foo"), with selected range collapsed at (detachedForeignTextNode, 1)]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(detachedForeignTextNode.length, 1, "foo"), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(1, 1, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(2, 1, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(3, 1, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(376, 1, ""), with selected range on detachedForeignTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(0, 1, ""), with selected range collapsed at (detachedForeignTextNode, 0)]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(1, 1, ""), with selected range collapsed at (detachedForeignTextNode, 1)]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(detachedForeignTextNode.length, 1, ""), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(1, 1, ""), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(2, 1, ""), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(3, 1, ""), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(376, 47, "foo"), with selected range on detachedForeignTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(0, 47, "foo"), with selected range collapsed at (detachedForeignTextNode, 0)]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(1, 47, "foo"), with selected range collapsed at (detachedForeignTextNode, 1)]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(detachedForeignTextNode.length, 47, "foo"), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(1, 47, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(2, 47, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(3, 47, "foo"), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(376, 47, ""), with selected range on detachedForeignTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(0, 47, ""), with selected range collapsed at (detachedForeignTextNode, 0)]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(1, 47, ""), with selected range collapsed at (detachedForeignTextNode, 1)]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(detachedForeignTextNode.length, 47, ""), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(1, 47, ""), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(2, 47, ""), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.replaceData(3, 47, ""), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(376, 0, "foo"), with selected range on detachedXmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(0, 0, "foo"), with selected range collapsed at (detachedXmlTextNode, 0)]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(1, 0, "foo"), with selected range collapsed at (detachedXmlTextNode, 1)]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(detachedXmlTextNode.length, 0, "foo"), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(1, 0, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(2, 0, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(3, 0, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(376, 0, ""), with selected range on detachedXmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(0, 0, ""), with selected range collapsed at (detachedXmlTextNode, 0)]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(1, 0, ""), with selected range collapsed at (detachedXmlTextNode, 1)]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(detachedXmlTextNode.length, 0, ""), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(1, 0, ""), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(2, 0, ""), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(3, 0, ""), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(376, 1, "foo"), with selected range on detachedXmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(0, 1, "foo"), with selected range collapsed at (detachedXmlTextNode, 0)]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(1, 1, "foo"), with selected range collapsed at (detachedXmlTextNode, 1)]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(detachedXmlTextNode.length, 1, "foo"), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(1, 1, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(2, 1, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(3, 1, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(376, 1, ""), with selected range on detachedXmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(0, 1, ""), with selected range collapsed at (detachedXmlTextNode, 0)]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(1, 1, ""), with selected range collapsed at (detachedXmlTextNode, 1)]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(detachedXmlTextNode.length, 1, ""), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(1, 1, ""), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(2, 1, ""), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(3, 1, ""), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(376, 47, "foo"), with selected range on detachedXmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(0, 47, "foo"), with selected range collapsed at (detachedXmlTextNode, 0)]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(1, 47, "foo"), with selected range collapsed at (detachedXmlTextNode, 1)]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(detachedXmlTextNode.length, 47, "foo"), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(1, 47, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(2, 47, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(3, 47, "foo"), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(376, 47, ""), with selected range on detachedXmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(0, 47, ""), with selected range collapsed at (detachedXmlTextNode, 0)]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(1, 47, ""), with selected range collapsed at (detachedXmlTextNode, 1)]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(detachedXmlTextNode.length, 47, ""), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(1, 47, ""), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(2, 47, ""), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.replaceData(3, 47, ""), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [comment.replaceData(376, 0, "foo"), with selected range on comment from 0 to 1]
+ expected: FAIL
+
+ [comment.replaceData(0, 0, "foo"), with selected range collapsed at (comment, 0)]
+ expected: FAIL
+
+ [comment.replaceData(1, 0, "foo"), with selected range collapsed at (comment, 1)]
+ expected: FAIL
+
+ [comment.replaceData(comment.length, 0, "foo"), with selected range collapsed at (comment, comment.length)]
+ expected: FAIL
+
+ [comment.replaceData(1, 0, "foo"), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.replaceData(2, 0, "foo"), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.replaceData(3, 0, "foo"), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.replaceData(376, 0, ""), with selected range on comment from 0 to 1]
+ expected: FAIL
+
+ [comment.replaceData(0, 0, ""), with selected range collapsed at (comment, 0)]
+ expected: FAIL
+
+ [comment.replaceData(1, 0, ""), with selected range collapsed at (comment, 1)]
+ expected: FAIL
+
+ [comment.replaceData(comment.length, 0, ""), with selected range collapsed at (comment, comment.length)]
+ expected: FAIL
+
+ [comment.replaceData(1, 0, ""), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.replaceData(2, 0, ""), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.replaceData(3, 0, ""), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.replaceData(376, 1, "foo"), with selected range on comment from 0 to 1]
+ expected: FAIL
+
+ [comment.replaceData(0, 1, "foo"), with selected range collapsed at (comment, 0)]
+ expected: FAIL
+
+ [comment.replaceData(1, 1, "foo"), with selected range collapsed at (comment, 1)]
+ expected: FAIL
+
+ [comment.replaceData(comment.length, 1, "foo"), with selected range collapsed at (comment, comment.length)]
+ expected: FAIL
+
+ [comment.replaceData(1, 1, "foo"), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.replaceData(2, 1, "foo"), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.replaceData(3, 1, "foo"), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.replaceData(376, 1, ""), with selected range on comment from 0 to 1]
+ expected: FAIL
+
+ [comment.replaceData(0, 1, ""), with selected range collapsed at (comment, 0)]
+ expected: FAIL
+
+ [comment.replaceData(1, 1, ""), with selected range collapsed at (comment, 1)]
+ expected: FAIL
+
+ [comment.replaceData(comment.length, 1, ""), with selected range collapsed at (comment, comment.length)]
+ expected: FAIL
+
+ [comment.replaceData(1, 1, ""), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.replaceData(2, 1, ""), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.replaceData(3, 1, ""), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.replaceData(376, 47, "foo"), with selected range on comment from 0 to 1]
+ expected: FAIL
+
+ [comment.replaceData(0, 47, "foo"), with selected range collapsed at (comment, 0)]
+ expected: FAIL
+
+ [comment.replaceData(1, 47, "foo"), with selected range collapsed at (comment, 1)]
+ expected: FAIL
+
+ [comment.replaceData(comment.length, 47, "foo"), with selected range collapsed at (comment, comment.length)]
+ expected: FAIL
+
+ [comment.replaceData(1, 47, "foo"), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.replaceData(2, 47, "foo"), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.replaceData(3, 47, "foo"), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.replaceData(376, 47, ""), with selected range on comment from 0 to 1]
+ expected: FAIL
+
+ [comment.replaceData(0, 47, ""), with selected range collapsed at (comment, 0)]
+ expected: FAIL
+
+ [comment.replaceData(1, 47, ""), with selected range collapsed at (comment, 1)]
+ expected: FAIL
+
+ [comment.replaceData(comment.length, 47, ""), with selected range collapsed at (comment, comment.length)]
+ expected: FAIL
+
+ [comment.replaceData(1, 47, ""), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.replaceData(2, 47, ""), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [comment.replaceData(3, 47, ""), with selected range on comment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.replaceData(376, 0, "foo"), with selected range on foreignComment from 0 to 1]
+ expected: FAIL
+
+ [foreignComment.replaceData(0, 0, "foo"), with selected range collapsed at (foreignComment, 0)]
+ expected: FAIL
+
+ [foreignComment.replaceData(1, 0, "foo"), with selected range collapsed at (foreignComment, 1)]
+ expected: FAIL
+
+ [foreignComment.replaceData(foreignComment.length, 0, "foo"), with selected range collapsed at (foreignComment, foreignComment.length)]
+ expected: FAIL
+
+ [foreignComment.replaceData(1, 0, "foo"), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.replaceData(2, 0, "foo"), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.replaceData(3, 0, "foo"), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.replaceData(376, 0, ""), with selected range on foreignComment from 0 to 1]
+ expected: FAIL
+
+ [foreignComment.replaceData(0, 0, ""), with selected range collapsed at (foreignComment, 0)]
+ expected: FAIL
+
+ [foreignComment.replaceData(1, 0, ""), with selected range collapsed at (foreignComment, 1)]
+ expected: FAIL
+
+ [foreignComment.replaceData(foreignComment.length, 0, ""), with selected range collapsed at (foreignComment, foreignComment.length)]
+ expected: FAIL
+
+ [foreignComment.replaceData(1, 0, ""), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.replaceData(2, 0, ""), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.replaceData(3, 0, ""), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.replaceData(376, 1, "foo"), with selected range on foreignComment from 0 to 1]
+ expected: FAIL
+
+ [foreignComment.replaceData(0, 1, "foo"), with selected range collapsed at (foreignComment, 0)]
+ expected: FAIL
+
+ [foreignComment.replaceData(1, 1, "foo"), with selected range collapsed at (foreignComment, 1)]
+ expected: FAIL
+
+ [foreignComment.replaceData(foreignComment.length, 1, "foo"), with selected range collapsed at (foreignComment, foreignComment.length)]
+ expected: FAIL
+
+ [foreignComment.replaceData(1, 1, "foo"), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.replaceData(2, 1, "foo"), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.replaceData(3, 1, "foo"), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.replaceData(376, 1, ""), with selected range on foreignComment from 0 to 1]
+ expected: FAIL
+
+ [foreignComment.replaceData(0, 1, ""), with selected range collapsed at (foreignComment, 0)]
+ expected: FAIL
+
+ [foreignComment.replaceData(1, 1, ""), with selected range collapsed at (foreignComment, 1)]
+ expected: FAIL
+
+ [foreignComment.replaceData(foreignComment.length, 1, ""), with selected range collapsed at (foreignComment, foreignComment.length)]
+ expected: FAIL
+
+ [foreignComment.replaceData(1, 1, ""), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.replaceData(2, 1, ""), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.replaceData(3, 1, ""), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.replaceData(376, 47, "foo"), with selected range on foreignComment from 0 to 1]
+ expected: FAIL
+
+ [foreignComment.replaceData(0, 47, "foo"), with selected range collapsed at (foreignComment, 0)]
+ expected: FAIL
+
+ [foreignComment.replaceData(1, 47, "foo"), with selected range collapsed at (foreignComment, 1)]
+ expected: FAIL
+
+ [foreignComment.replaceData(foreignComment.length, 47, "foo"), with selected range collapsed at (foreignComment, foreignComment.length)]
+ expected: FAIL
+
+ [foreignComment.replaceData(1, 47, "foo"), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.replaceData(2, 47, "foo"), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.replaceData(3, 47, "foo"), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.replaceData(376, 47, ""), with selected range on foreignComment from 0 to 1]
+ expected: FAIL
+
+ [foreignComment.replaceData(0, 47, ""), with selected range collapsed at (foreignComment, 0)]
+ expected: FAIL
+
+ [foreignComment.replaceData(1, 47, ""), with selected range collapsed at (foreignComment, 1)]
+ expected: FAIL
+
+ [foreignComment.replaceData(foreignComment.length, 47, ""), with selected range collapsed at (foreignComment, foreignComment.length)]
+ expected: FAIL
+
+ [foreignComment.replaceData(1, 47, ""), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.replaceData(2, 47, ""), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [foreignComment.replaceData(3, 47, ""), with selected range on foreignComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.replaceData(376, 0, "foo"), with selected range on xmlComment from 0 to 1]
+ expected: FAIL
+
+ [xmlComment.replaceData(0, 0, "foo"), with selected range collapsed at (xmlComment, 0)]
+ expected: FAIL
+
+ [xmlComment.replaceData(1, 0, "foo"), with selected range collapsed at (xmlComment, 1)]
+ expected: FAIL
+
+ [xmlComment.replaceData(xmlComment.length, 0, "foo"), with selected range collapsed at (xmlComment, xmlComment.length)]
+ expected: FAIL
+
+ [xmlComment.replaceData(1, 0, "foo"), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.replaceData(2, 0, "foo"), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.replaceData(3, 0, "foo"), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.replaceData(376, 0, ""), with selected range on xmlComment from 0 to 1]
+ expected: FAIL
+
+ [xmlComment.replaceData(0, 0, ""), with selected range collapsed at (xmlComment, 0)]
+ expected: FAIL
+
+ [xmlComment.replaceData(1, 0, ""), with selected range collapsed at (xmlComment, 1)]
+ expected: FAIL
+
+ [xmlComment.replaceData(xmlComment.length, 0, ""), with selected range collapsed at (xmlComment, xmlComment.length)]
+ expected: FAIL
+
+ [xmlComment.replaceData(1, 0, ""), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.replaceData(2, 0, ""), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.replaceData(3, 0, ""), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.replaceData(376, 1, "foo"), with selected range on xmlComment from 0 to 1]
+ expected: FAIL
+
+ [xmlComment.replaceData(0, 1, "foo"), with selected range collapsed at (xmlComment, 0)]
+ expected: FAIL
+
+ [xmlComment.replaceData(1, 1, "foo"), with selected range collapsed at (xmlComment, 1)]
+ expected: FAIL
+
+ [xmlComment.replaceData(xmlComment.length, 1, "foo"), with selected range collapsed at (xmlComment, xmlComment.length)]
+ expected: FAIL
+
+ [xmlComment.replaceData(1, 1, "foo"), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.replaceData(2, 1, "foo"), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.replaceData(3, 1, "foo"), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.replaceData(376, 1, ""), with selected range on xmlComment from 0 to 1]
+ expected: FAIL
+
+ [xmlComment.replaceData(0, 1, ""), with selected range collapsed at (xmlComment, 0)]
+ expected: FAIL
+
+ [xmlComment.replaceData(1, 1, ""), with selected range collapsed at (xmlComment, 1)]
+ expected: FAIL
+
+ [xmlComment.replaceData(xmlComment.length, 1, ""), with selected range collapsed at (xmlComment, xmlComment.length)]
+ expected: FAIL
+
+ [xmlComment.replaceData(1, 1, ""), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.replaceData(2, 1, ""), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.replaceData(3, 1, ""), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.replaceData(376, 47, "foo"), with selected range on xmlComment from 0 to 1]
+ expected: FAIL
+
+ [xmlComment.replaceData(0, 47, "foo"), with selected range collapsed at (xmlComment, 0)]
+ expected: FAIL
+
+ [xmlComment.replaceData(1, 47, "foo"), with selected range collapsed at (xmlComment, 1)]
+ expected: FAIL
+
+ [xmlComment.replaceData(xmlComment.length, 47, "foo"), with selected range collapsed at (xmlComment, xmlComment.length)]
+ expected: FAIL
+
+ [xmlComment.replaceData(1, 47, "foo"), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.replaceData(2, 47, "foo"), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.replaceData(3, 47, "foo"), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.replaceData(376, 47, ""), with selected range on xmlComment from 0 to 1]
+ expected: FAIL
+
+ [xmlComment.replaceData(0, 47, ""), with selected range collapsed at (xmlComment, 0)]
+ expected: FAIL
+
+ [xmlComment.replaceData(1, 47, ""), with selected range collapsed at (xmlComment, 1)]
+ expected: FAIL
+
+ [xmlComment.replaceData(xmlComment.length, 47, ""), with selected range collapsed at (xmlComment, xmlComment.length)]
+ expected: FAIL
+
+ [xmlComment.replaceData(1, 47, ""), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.replaceData(2, 47, ""), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [xmlComment.replaceData(3, 47, ""), with selected range on xmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.replaceData(376, 0, "foo"), with selected range on detachedComment from 0 to 1]
+ expected: FAIL
+
+ [detachedComment.replaceData(0, 0, "foo"), with selected range collapsed at (detachedComment, 0)]
+ expected: FAIL
+
+ [detachedComment.replaceData(1, 0, "foo"), with selected range collapsed at (detachedComment, 1)]
+ expected: FAIL
+
+ [detachedComment.replaceData(detachedComment.length, 0, "foo"), with selected range collapsed at (detachedComment, detachedComment.length)]
+ expected: FAIL
+
+ [detachedComment.replaceData(1, 0, "foo"), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.replaceData(2, 0, "foo"), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.replaceData(3, 0, "foo"), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.replaceData(376, 0, ""), with selected range on detachedComment from 0 to 1]
+ expected: FAIL
+
+ [detachedComment.replaceData(0, 0, ""), with selected range collapsed at (detachedComment, 0)]
+ expected: FAIL
+
+ [detachedComment.replaceData(1, 0, ""), with selected range collapsed at (detachedComment, 1)]
+ expected: FAIL
+
+ [detachedComment.replaceData(detachedComment.length, 0, ""), with selected range collapsed at (detachedComment, detachedComment.length)]
+ expected: FAIL
+
+ [detachedComment.replaceData(1, 0, ""), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.replaceData(2, 0, ""), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.replaceData(3, 0, ""), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.replaceData(376, 1, "foo"), with selected range on detachedComment from 0 to 1]
+ expected: FAIL
+
+ [detachedComment.replaceData(0, 1, "foo"), with selected range collapsed at (detachedComment, 0)]
+ expected: FAIL
+
+ [detachedComment.replaceData(1, 1, "foo"), with selected range collapsed at (detachedComment, 1)]
+ expected: FAIL
+
+ [detachedComment.replaceData(detachedComment.length, 1, "foo"), with selected range collapsed at (detachedComment, detachedComment.length)]
+ expected: FAIL
+
+ [detachedComment.replaceData(1, 1, "foo"), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.replaceData(2, 1, "foo"), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.replaceData(3, 1, "foo"), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.replaceData(376, 1, ""), with selected range on detachedComment from 0 to 1]
+ expected: FAIL
+
+ [detachedComment.replaceData(0, 1, ""), with selected range collapsed at (detachedComment, 0)]
+ expected: FAIL
+
+ [detachedComment.replaceData(1, 1, ""), with selected range collapsed at (detachedComment, 1)]
+ expected: FAIL
+
+ [detachedComment.replaceData(detachedComment.length, 1, ""), with selected range collapsed at (detachedComment, detachedComment.length)]
+ expected: FAIL
+
+ [detachedComment.replaceData(1, 1, ""), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.replaceData(2, 1, ""), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.replaceData(3, 1, ""), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.replaceData(376, 47, "foo"), with selected range on detachedComment from 0 to 1]
+ expected: FAIL
+
+ [detachedComment.replaceData(0, 47, "foo"), with selected range collapsed at (detachedComment, 0)]
+ expected: FAIL
+
+ [detachedComment.replaceData(1, 47, "foo"), with selected range collapsed at (detachedComment, 1)]
+ expected: FAIL
+
+ [detachedComment.replaceData(detachedComment.length, 47, "foo"), with selected range collapsed at (detachedComment, detachedComment.length)]
+ expected: FAIL
+
+ [detachedComment.replaceData(1, 47, "foo"), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.replaceData(2, 47, "foo"), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.replaceData(3, 47, "foo"), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.replaceData(376, 47, ""), with selected range on detachedComment from 0 to 1]
+ expected: FAIL
+
+ [detachedComment.replaceData(0, 47, ""), with selected range collapsed at (detachedComment, 0)]
+ expected: FAIL
+
+ [detachedComment.replaceData(1, 47, ""), with selected range collapsed at (detachedComment, 1)]
+ expected: FAIL
+
+ [detachedComment.replaceData(detachedComment.length, 47, ""), with selected range collapsed at (detachedComment, detachedComment.length)]
+ expected: FAIL
+
+ [detachedComment.replaceData(1, 47, ""), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.replaceData(2, 47, ""), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedComment.replaceData(3, 47, ""), with selected range on detachedComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(376, 0, "foo"), with selected range on detachedForeignComment from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(0, 0, "foo"), with selected range collapsed at (detachedForeignComment, 0)]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(1, 0, "foo"), with selected range collapsed at (detachedForeignComment, 1)]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(detachedForeignComment.length, 0, "foo"), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(1, 0, "foo"), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(2, 0, "foo"), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(3, 0, "foo"), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(376, 0, ""), with selected range on detachedForeignComment from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(0, 0, ""), with selected range collapsed at (detachedForeignComment, 0)]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(1, 0, ""), with selected range collapsed at (detachedForeignComment, 1)]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(detachedForeignComment.length, 0, ""), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(1, 0, ""), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(2, 0, ""), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(3, 0, ""), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(376, 1, "foo"), with selected range on detachedForeignComment from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(0, 1, "foo"), with selected range collapsed at (detachedForeignComment, 0)]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(1, 1, "foo"), with selected range collapsed at (detachedForeignComment, 1)]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(detachedForeignComment.length, 1, "foo"), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(1, 1, "foo"), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(2, 1, "foo"), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(3, 1, "foo"), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(376, 1, ""), with selected range on detachedForeignComment from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(0, 1, ""), with selected range collapsed at (detachedForeignComment, 0)]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(1, 1, ""), with selected range collapsed at (detachedForeignComment, 1)]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(detachedForeignComment.length, 1, ""), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(1, 1, ""), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(2, 1, ""), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(3, 1, ""), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(376, 47, "foo"), with selected range on detachedForeignComment from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(0, 47, "foo"), with selected range collapsed at (detachedForeignComment, 0)]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(1, 47, "foo"), with selected range collapsed at (detachedForeignComment, 1)]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(detachedForeignComment.length, 47, "foo"), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(1, 47, "foo"), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(2, 47, "foo"), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(3, 47, "foo"), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(376, 47, ""), with selected range on detachedForeignComment from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(0, 47, ""), with selected range collapsed at (detachedForeignComment, 0)]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(1, 47, ""), with selected range collapsed at (detachedForeignComment, 1)]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(detachedForeignComment.length, 47, ""), with selected range collapsed at (detachedForeignComment, detachedForeignComment.length)]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(1, 47, ""), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(2, 47, ""), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignComment.replaceData(3, 47, ""), with selected range on detachedForeignComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(376, 0, "foo"), with selected range on detachedXmlComment from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(0, 0, "foo"), with selected range collapsed at (detachedXmlComment, 0)]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(1, 0, "foo"), with selected range collapsed at (detachedXmlComment, 1)]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(detachedXmlComment.length, 0, "foo"), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(1, 0, "foo"), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(2, 0, "foo"), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(3, 0, "foo"), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(376, 0, ""), with selected range on detachedXmlComment from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(0, 0, ""), with selected range collapsed at (detachedXmlComment, 0)]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(1, 0, ""), with selected range collapsed at (detachedXmlComment, 1)]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(detachedXmlComment.length, 0, ""), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(1, 0, ""), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(2, 0, ""), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(3, 0, ""), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(376, 1, "foo"), with selected range on detachedXmlComment from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(0, 1, "foo"), with selected range collapsed at (detachedXmlComment, 0)]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(1, 1, "foo"), with selected range collapsed at (detachedXmlComment, 1)]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(detachedXmlComment.length, 1, "foo"), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(1, 1, "foo"), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(2, 1, "foo"), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(3, 1, "foo"), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(376, 1, ""), with selected range on detachedXmlComment from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(0, 1, ""), with selected range collapsed at (detachedXmlComment, 0)]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(1, 1, ""), with selected range collapsed at (detachedXmlComment, 1)]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(detachedXmlComment.length, 1, ""), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(1, 1, ""), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(2, 1, ""), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(3, 1, ""), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(376, 47, "foo"), with selected range on detachedXmlComment from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(0, 47, "foo"), with selected range collapsed at (detachedXmlComment, 0)]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(1, 47, "foo"), with selected range collapsed at (detachedXmlComment, 1)]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(detachedXmlComment.length, 47, "foo"), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(1, 47, "foo"), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(2, 47, "foo"), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(3, 47, "foo"), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(376, 47, ""), with selected range on detachedXmlComment from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(0, 47, ""), with selected range collapsed at (detachedXmlComment, 0)]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(1, 47, ""), with selected range collapsed at (detachedXmlComment, 1)]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(detachedXmlComment.length, 47, ""), with selected range collapsed at (detachedXmlComment, detachedXmlComment.length)]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(1, 47, ""), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(2, 47, ""), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlComment.replaceData(3, 47, ""), with selected range on detachedXmlComment from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 0, "foo"), with selected range collapsed at (paras[0\], 0)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 0, "foo"), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 0, "foo"), with selected range collapsed at (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 0, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(2, 0, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(3, 0, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 0, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(2, 0, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(3, 0, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 1, "foo"), with selected range collapsed at (paras[0\], 0)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 1, "foo"), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 1, "foo"), with selected range collapsed at (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 1, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(2, 1, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(3, 1, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 1, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(2, 1, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(3, 1, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 47, "foo"), with selected range collapsed at (paras[0\], 0)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 47, "foo"), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 47, "foo"), with selected range collapsed at (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 47, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(2, 47, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(3, 47, "foo"), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(1, 47, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(2, 47, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
+ expected: FAIL
+
+ [paras[0\].firstChild.replaceData(3, 47, "foo"), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/ranges/Range-mutations-splitText.html.ini b/tests/wpt/metadata/dom/ranges/Range-mutations-splitText.html.ini
new file mode 100644
index 00000000000..efb3dd56e35
--- /dev/null
+++ b/tests/wpt/metadata/dom/ranges/Range-mutations-splitText.html.ini
@@ -0,0 +1,176 @@
+[Range-mutations-splitText.html]
+ type: testharness
+ [paras[0\].firstChild.splitText(376), with selected range on paras[0\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].firstChild.splitText(0), with selected range collapsed at (paras[0\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[0\].firstChild.splitText(1), with selected range collapsed at (paras[0\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.splitText(paras[0\].firstChild.length), with selected range collapsed at (paras[0\].firstChild, paras[0\].firstChild.length)]
+ expected: FAIL
+
+ [paras[0\].firstChild.splitText(1), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.splitText(2), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.splitText(3), with selected range on paras[0\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.splitText(376), with selected range on paras[1\].firstChild from 0 to 1]
+ expected: FAIL
+
+ [paras[1\].firstChild.splitText(0), with selected range collapsed at (paras[1\].firstChild, 0)]
+ expected: FAIL
+
+ [paras[1\].firstChild.splitText(1), with selected range collapsed at (paras[1\].firstChild, 1)]
+ expected: FAIL
+
+ [paras[1\].firstChild.splitText(paras[1\].firstChild.length), with selected range collapsed at (paras[1\].firstChild, paras[1\].firstChild.length)]
+ expected: FAIL
+
+ [paras[1\].firstChild.splitText(1), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.splitText(2), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [paras[1\].firstChild.splitText(3), with selected range on paras[1\].firstChild from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.splitText(376), with selected range on foreignTextNode from 0 to 1]
+ expected: FAIL
+
+ [foreignTextNode.splitText(0), with selected range collapsed at (foreignTextNode, 0)]
+ expected: FAIL
+
+ [foreignTextNode.splitText(1), with selected range collapsed at (foreignTextNode, 1)]
+ expected: FAIL
+
+ [foreignTextNode.splitText(foreignTextNode.length), with selected range collapsed at (foreignTextNode, foreignTextNode.length)]
+ expected: FAIL
+
+ [foreignTextNode.splitText(1), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.splitText(2), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [foreignTextNode.splitText(3), with selected range on foreignTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.splitText(376), with selected range on xmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [xmlTextNode.splitText(0), with selected range collapsed at (xmlTextNode, 0)]
+ expected: FAIL
+
+ [xmlTextNode.splitText(1), with selected range collapsed at (xmlTextNode, 1)]
+ expected: FAIL
+
+ [xmlTextNode.splitText(xmlTextNode.length), with selected range collapsed at (xmlTextNode, xmlTextNode.length)]
+ expected: FAIL
+
+ [xmlTextNode.splitText(1), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.splitText(2), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [xmlTextNode.splitText(3), with selected range on xmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.splitText(376), with selected range on detachedTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedTextNode.splitText(0), with selected range collapsed at (detachedTextNode, 0)]
+ expected: FAIL
+
+ [detachedTextNode.splitText(1), with selected range collapsed at (detachedTextNode, 1)]
+ expected: FAIL
+
+ [detachedTextNode.splitText(detachedTextNode.length), with selected range collapsed at (detachedTextNode, detachedTextNode.length)]
+ expected: FAIL
+
+ [detachedTextNode.splitText(1), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.splitText(2), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedTextNode.splitText(3), with selected range on detachedTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.splitText(376), with selected range on detachedForeignTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedForeignTextNode.splitText(0), with selected range collapsed at (detachedForeignTextNode, 0)]
+ expected: FAIL
+
+ [detachedForeignTextNode.splitText(1), with selected range collapsed at (detachedForeignTextNode, 1)]
+ expected: FAIL
+
+ [detachedForeignTextNode.splitText(detachedForeignTextNode.length), with selected range collapsed at (detachedForeignTextNode, detachedForeignTextNode.length)]
+ expected: FAIL
+
+ [detachedForeignTextNode.splitText(1), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.splitText(2), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedForeignTextNode.splitText(3), with selected range on detachedForeignTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.splitText(376), with selected range on detachedXmlTextNode from 0 to 1]
+ expected: FAIL
+
+ [detachedXmlTextNode.splitText(0), with selected range collapsed at (detachedXmlTextNode, 0)]
+ expected: FAIL
+
+ [detachedXmlTextNode.splitText(1), with selected range collapsed at (detachedXmlTextNode, 1)]
+ expected: FAIL
+
+ [detachedXmlTextNode.splitText(detachedXmlTextNode.length), with selected range collapsed at (detachedXmlTextNode, detachedXmlTextNode.length)]
+ expected: FAIL
+
+ [detachedXmlTextNode.splitText(1), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.splitText(2), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [detachedXmlTextNode.splitText(3), with selected range on detachedXmlTextNode from 1 to 3]
+ expected: FAIL
+
+ [paras[0\].firstChild.splitText(1), with selected range collapsed at (paras[0\], 0)]
+ expected: FAIL
+
+ [paras[0\].firstChild.splitText(1), with selected range on paras[0\] from 0 to 1]
+ expected: FAIL
+
+ [paras[0\].firstChild.splitText(1), with selected range collapsed at (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.splitText(1), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.splitText(2), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.splitText(3), with selected range from (paras[0\].firstChild, 1) to (paras[0\], 1)]
+ expected: FAIL
+
+ [paras[0\].firstChild.splitText(1), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
+ expected: FAIL
+
+ [paras[0\].firstChild.splitText(2), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
+ expected: FAIL
+
+ [paras[0\].firstChild.splitText(3), with selected range from (paras[0\], 0) to (paras[0\].firstChild, 3)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/domparsing/createContextualFragment.html.ini b/tests/wpt/metadata/domparsing/createContextualFragment.html.ini
index 7e563a9b869..7602299fb12 100644
--- a/tests/wpt/metadata/domparsing/createContextualFragment.html.ini
+++ b/tests/wpt/metadata/domparsing/createContextualFragment.html.ini
@@ -9,3 +9,6 @@
[<html> in a different namespace shouldn't be special]
expected: FAIL
+ [SVG namespace shouldn't be special]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/domparsing/innerhtml-02.html.ini b/tests/wpt/metadata/domparsing/innerhtml-02.html.ini
deleted file mode 100644
index 6528bc716b8..00000000000
--- a/tests/wpt/metadata/domparsing/innerhtml-02.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[innerhtml-02.html]
- type: testharness
- [Expected innerHTML: "<" for xmp.]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/encoding/textdecoder-fatal-single-byte.html.ini b/tests/wpt/metadata/encoding/textdecoder-fatal-single-byte.html.ini
new file mode 100644
index 00000000000..34e966e4e73
--- /dev/null
+++ b/tests/wpt/metadata/encoding/textdecoder-fatal-single-byte.html.ini
@@ -0,0 +1,5 @@
+[textdecoder-fatal-single-byte.html]
+ type: testharness
+ [Not throw: windows-1255 has a pointer 202]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/eventsource/eventsource-onmessage-realm.htm.ini b/tests/wpt/metadata/eventsource/eventsource-onmessage-realm.htm.ini
new file mode 100644
index 00000000000..852a78fd8ce
--- /dev/null
+++ b/tests/wpt/metadata/eventsource/eventsource-onmessage-realm.htm.ini
@@ -0,0 +1,5 @@
+[eventsource-onmessage-realm.htm]
+ type: testharness
+ [the MessageEvent must be created in the Realm of the EventSource]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/eventsource/interfaces.html.ini b/tests/wpt/metadata/eventsource/interfaces.html.ini
index 99706ee7d67..66e64261789 100644
--- a/tests/wpt/metadata/eventsource/interfaces.html.ini
+++ b/tests/wpt/metadata/eventsource/interfaces.html.ini
@@ -8,3 +8,4 @@
[Stringification of new EventSource("http://foo")]
expected: FAIL
+
diff --git a/tests/wpt/metadata/eventsource/request-cache-control.htm.ini b/tests/wpt/metadata/eventsource/request-cache-control.htm.ini
index 9d7703c7521..5e79e2360a7 100644
--- a/tests/wpt/metadata/eventsource/request-cache-control.htm.ini
+++ b/tests/wpt/metadata/eventsource/request-cache-control.htm.ini
@@ -6,3 +6,4 @@
[EventSource: Cache-Control 1]
expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/fetch/api/basic/conditional-get.html.ini b/tests/wpt/metadata/fetch/api/basic/conditional-get.html.ini
new file mode 100644
index 00000000000..ea1384f3fab
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/basic/conditional-get.html.ini
@@ -0,0 +1,5 @@
+[conditional-get.html]
+ type: testharness
+ [Testing conditional GET with ETags]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/basic/error-after-response.html.ini b/tests/wpt/metadata/fetch/api/basic/error-after-response.html.ini
new file mode 100644
index 00000000000..3bde546c958
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/basic/error-after-response.html.ini
@@ -0,0 +1,8 @@
+[error-after-response.html]
+ type: testharness
+ [Response reader read() promise should reject after a network error happening after resolving fetch promise]
+ expected: FAIL
+
+ [Response reader closed promise should reject after a network error happening after resolving fetch promise]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/basic/integrity-sharedworker.html.ini b/tests/wpt/metadata/fetch/api/basic/integrity-sharedworker.html.ini
new file mode 100644
index 00000000000..674933e884c
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/basic/integrity-sharedworker.html.ini
@@ -0,0 +1,3 @@
+[integrity-sharedworker.html]
+ type: testharness
+ expected: ERROR
diff --git a/tests/wpt/metadata/fetch/api/basic/request-headers-worker.html.ini b/tests/wpt/metadata/fetch/api/basic/request-headers-worker.html.ini
index d301daf8a17..4c228581bae 100644
--- a/tests/wpt/metadata/fetch/api/basic/request-headers-worker.html.ini
+++ b/tests/wpt/metadata/fetch/api/basic/request-headers-worker.html.ini
@@ -51,3 +51,6 @@
[Fetch with Chicken with body]
expected: FAIL
+ [Fetch with POST with URLSearchParams body]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/basic/request-headers.html.ini b/tests/wpt/metadata/fetch/api/basic/request-headers.html.ini
index 62c74c222f0..4361ade4d59 100644
--- a/tests/wpt/metadata/fetch/api/basic/request-headers.html.ini
+++ b/tests/wpt/metadata/fetch/api/basic/request-headers.html.ini
@@ -51,3 +51,6 @@
[Fetch with Chicken with body]
expected: FAIL
+ [Fetch with POST with URLSearchParams body]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/basic/request-upload-worker.html.ini b/tests/wpt/metadata/fetch/api/basic/request-upload-worker.html.ini
new file mode 100644
index 00000000000..9ce17b3eafe
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/basic/request-upload-worker.html.ini
@@ -0,0 +1,20 @@
+[request-upload-worker.html]
+ type: testharness
+ [Fetch with POST with ArrayBuffer body]
+ expected: FAIL
+
+ [Fetch with POST with Uint8Array body]
+ expected: FAIL
+
+ [Fetch with POST with Int8Array body]
+ expected: FAIL
+
+ [Fetch with POST with Float32Array body]
+ expected: FAIL
+
+ [Fetch with POST with Float64Array body]
+ expected: FAIL
+
+ [Fetch with POST with DataView body]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/basic/request-upload.html.ini b/tests/wpt/metadata/fetch/api/basic/request-upload.html.ini
new file mode 100644
index 00000000000..31957e3a0c9
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/basic/request-upload.html.ini
@@ -0,0 +1,20 @@
+[request-upload.html]
+ type: testharness
+ [Fetch with POST with ArrayBuffer body]
+ expected: FAIL
+
+ [Fetch with POST with Uint8Array body]
+ expected: FAIL
+
+ [Fetch with POST with Int8Array body]
+ expected: FAIL
+
+ [Fetch with POST with Float32Array body]
+ expected: FAIL
+
+ [Fetch with POST with Float64Array body]
+ expected: FAIL
+
+ [Fetch with POST with DataView body]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/basic/scheme-data-worker.html.ini b/tests/wpt/metadata/fetch/api/basic/scheme-data-worker.html.ini
index 07bdf4caaaa..d025cd9bfee 100644
--- a/tests/wpt/metadata/fetch/api/basic/scheme-data-worker.html.ini
+++ b/tests/wpt/metadata/fetch/api/basic/scheme-data-worker.html.ini
@@ -15,3 +15,9 @@
[Fetching data:image/png;base64,cmVzcG9uc2UncyBib2[...\] is OK]
expected: FAIL
+ [Fetching [POST\] data:,response%27s%20body is OK]
+ expected: FAIL
+
+ [Fetching [HEAD\] data:,response%27s%20body is OK]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/basic/scheme-data.html.ini b/tests/wpt/metadata/fetch/api/basic/scheme-data.html.ini
index 2e78bab0e48..f69b8bea324 100644
--- a/tests/wpt/metadata/fetch/api/basic/scheme-data.html.ini
+++ b/tests/wpt/metadata/fetch/api/basic/scheme-data.html.ini
@@ -15,3 +15,9 @@
[Fetching data:image/png;base64,cmVzcG9uc2UncyBib2[...\] is OK]
expected: FAIL
+ [Fetching [POST\] data:,response%27s%20body is OK]
+ expected: FAIL
+
+ [Fetching [HEAD\] data:,response%27s%20body is OK]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/basic/text-utf8.html.ini b/tests/wpt/metadata/fetch/api/basic/text-utf8.html.ini
index 1bdc4f3f39d..890e7cd7f3c 100644
--- a/tests/wpt/metadata/fetch/api/basic/text-utf8.html.ini
+++ b/tests/wpt/metadata/fetch/api/basic/text-utf8.html.ini
@@ -36,3 +36,33 @@
[UTF-16 without BOM decoded as UTF-8 with Response.text()]
expected: FAIL
+ [UTF-8 with BOM (Response object)]
+ expected: FAIL
+
+ [UTF-8 with BOM (Request object)]
+ expected: FAIL
+
+ [UTF-8 without BOM (Response object)]
+ expected: FAIL
+
+ [UTF-8 without BOM (Request object)]
+ expected: FAIL
+
+ [UTF-16BE with BOM decoded as UTF-8 (Response object)]
+ expected: FAIL
+
+ [UTF-16BE with BOM decoded as UTF-8 (Request object)]
+ expected: FAIL
+
+ [UTF-16LE with BOM decoded as UTF-8 (Response object)]
+ expected: FAIL
+
+ [UTF-16LE with BOM decoded as UTF-8 (Request object)]
+ expected: FAIL
+
+ [UTF-16 without BOM decoded as UTF-8 (Response object)]
+ expected: FAIL
+
+ [UTF-16 without BOM decoded as UTF-8 (Request object)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/cors/cors-cookies-worker.html.ini b/tests/wpt/metadata/fetch/api/cors/cors-cookies-worker.html.ini
index b920d985715..ebbfb60928d 100644
--- a/tests/wpt/metadata/fetch/api/cors/cors-cookies-worker.html.ini
+++ b/tests/wpt/metadata/fetch/api/cors/cors-cookies-worker.html.ini
@@ -8,3 +8,4 @@
[Same-origin mode: cookies are discarded in cors request]
expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/cors/cors-cookies.html.ini b/tests/wpt/metadata/fetch/api/cors/cors-cookies.html.ini
index be7b5c4ef84..a33b5f832b1 100644
--- a/tests/wpt/metadata/fetch/api/cors/cors-cookies.html.ini
+++ b/tests/wpt/metadata/fetch/api/cors/cors-cookies.html.ini
@@ -8,3 +8,4 @@
[Same-origin mode: cookies are discarded in cors request]
expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/cors/cors-preflight-redirect-worker.html.ini b/tests/wpt/metadata/fetch/api/cors/cors-preflight-redirect-worker.html.ini
new file mode 100644
index 00000000000..a067c067a2a
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/cors/cors-preflight-redirect-worker.html.ini
@@ -0,0 +1,32 @@
+[cors-preflight-redirect-worker.html]
+ type: testharness
+ [Redirection 301 on preflight failed]
+ expected: FAIL
+
+ [Redirection 301 after preflight failed]
+ expected: FAIL
+
+ [Redirection 302 on preflight failed]
+ expected: FAIL
+
+ [Redirection 302 after preflight failed]
+ expected: FAIL
+
+ [Redirection 303 on preflight failed]
+ expected: FAIL
+
+ [Redirection 303 after preflight failed]
+ expected: FAIL
+
+ [Redirection 307 on preflight failed]
+ expected: FAIL
+
+ [Redirection 307 after preflight failed]
+ expected: FAIL
+
+ [Redirection 308 on preflight failed]
+ expected: FAIL
+
+ [Redirection 308 after preflight failed]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/cors/cors-preflight-redirect.html.ini b/tests/wpt/metadata/fetch/api/cors/cors-preflight-redirect.html.ini
new file mode 100644
index 00000000000..e5b48918e8e
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/cors/cors-preflight-redirect.html.ini
@@ -0,0 +1,32 @@
+[cors-preflight-redirect.html]
+ type: testharness
+ [Redirection 301 on preflight failed]
+ expected: FAIL
+
+ [Redirection 301 after preflight failed]
+ expected: FAIL
+
+ [Redirection 302 on preflight failed]
+ expected: FAIL
+
+ [Redirection 302 after preflight failed]
+ expected: FAIL
+
+ [Redirection 303 on preflight failed]
+ expected: FAIL
+
+ [Redirection 303 after preflight failed]
+ expected: FAIL
+
+ [Redirection 307 on preflight failed]
+ expected: FAIL
+
+ [Redirection 307 after preflight failed]
+ expected: FAIL
+
+ [Redirection 308 on preflight failed]
+ expected: FAIL
+
+ [Redirection 308 after preflight failed]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/cors/cors-preflight-status-worker.html.ini b/tests/wpt/metadata/fetch/api/cors/cors-preflight-status-worker.html.ini
new file mode 100644
index 00000000000..9f9d2eab795
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/cors/cors-preflight-status-worker.html.ini
@@ -0,0 +1,83 @@
+[cors-preflight-status-worker.html]
+ type: testharness
+ [Preflight answered with status 200]
+ expected: FAIL
+
+ [Preflight answered with status 201]
+ expected: FAIL
+
+ [Preflight answered with status 202]
+ expected: FAIL
+
+ [Preflight answered with status 203]
+ expected: FAIL
+
+ [Preflight answered with status 204]
+ expected: FAIL
+
+ [Preflight answered with status 205]
+ expected: FAIL
+
+ [Preflight answered with status 206]
+ expected: FAIL
+
+ [Preflight answered with status 300]
+ expected: FAIL
+
+ [Preflight answered with status 301]
+ expected: FAIL
+
+ [Preflight answered with status 302]
+ expected: FAIL
+
+ [Preflight answered with status 303]
+ expected: FAIL
+
+ [Preflight answered with status 304]
+ expected: FAIL
+
+ [Preflight answered with status 305]
+ expected: FAIL
+
+ [Preflight answered with status 306]
+ expected: FAIL
+
+ [Preflight answered with status 307]
+ expected: FAIL
+
+ [Preflight answered with status 308]
+ expected: FAIL
+
+ [Preflight answered with status 400]
+ expected: FAIL
+
+ [Preflight answered with status 401]
+ expected: FAIL
+
+ [Preflight answered with status 402]
+ expected: FAIL
+
+ [Preflight answered with status 403]
+ expected: FAIL
+
+ [Preflight answered with status 404]
+ expected: FAIL
+
+ [Preflight answered with status 405]
+ expected: FAIL
+
+ [Preflight answered with status 501]
+ expected: FAIL
+
+ [Preflight answered with status 502]
+ expected: FAIL
+
+ [Preflight answered with status 503]
+ expected: FAIL
+
+ [Preflight answered with status 504]
+ expected: FAIL
+
+ [Preflight answered with status 505]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/cors/cors-preflight-status.html.ini b/tests/wpt/metadata/fetch/api/cors/cors-preflight-status.html.ini
new file mode 100644
index 00000000000..12bb9ecf2e1
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/cors/cors-preflight-status.html.ini
@@ -0,0 +1,83 @@
+[cors-preflight-status.html]
+ type: testharness
+ [Preflight answered with status 200]
+ expected: FAIL
+
+ [Preflight answered with status 201]
+ expected: FAIL
+
+ [Preflight answered with status 202]
+ expected: FAIL
+
+ [Preflight answered with status 203]
+ expected: FAIL
+
+ [Preflight answered with status 204]
+ expected: FAIL
+
+ [Preflight answered with status 205]
+ expected: FAIL
+
+ [Preflight answered with status 206]
+ expected: FAIL
+
+ [Preflight answered with status 300]
+ expected: FAIL
+
+ [Preflight answered with status 301]
+ expected: FAIL
+
+ [Preflight answered with status 302]
+ expected: FAIL
+
+ [Preflight answered with status 303]
+ expected: FAIL
+
+ [Preflight answered with status 304]
+ expected: FAIL
+
+ [Preflight answered with status 305]
+ expected: FAIL
+
+ [Preflight answered with status 306]
+ expected: FAIL
+
+ [Preflight answered with status 307]
+ expected: FAIL
+
+ [Preflight answered with status 308]
+ expected: FAIL
+
+ [Preflight answered with status 400]
+ expected: FAIL
+
+ [Preflight answered with status 401]
+ expected: FAIL
+
+ [Preflight answered with status 402]
+ expected: FAIL
+
+ [Preflight answered with status 403]
+ expected: FAIL
+
+ [Preflight answered with status 404]
+ expected: FAIL
+
+ [Preflight answered with status 405]
+ expected: FAIL
+
+ [Preflight answered with status 501]
+ expected: FAIL
+
+ [Preflight answered with status 502]
+ expected: FAIL
+
+ [Preflight answered with status 503]
+ expected: FAIL
+
+ [Preflight answered with status 504]
+ expected: FAIL
+
+ [Preflight answered with status 505]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/cors/cors-redirect-worker.html.ini b/tests/wpt/metadata/fetch/api/cors/cors-redirect-worker.html.ini
new file mode 100644
index 00000000000..1ba0a14daac
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/cors/cors-redirect-worker.html.ini
@@ -0,0 +1,4 @@
+[cors-redirect-worker.html]
+ type: testharness
+ disabled: https://github.com/servo/servo/issues/13441
+
diff --git a/tests/wpt/metadata/fetch/api/cors/cors-redirect.html.ini b/tests/wpt/metadata/fetch/api/cors/cors-redirect.html.ini
new file mode 100644
index 00000000000..506643337e5
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/cors/cors-redirect.html.ini
@@ -0,0 +1,4 @@
+[cors-redirect.html]
+ type: testharness
+ disabled: https://github.com/servo/servo/issues/13441
+
diff --git a/tests/wpt/metadata/fetch/api/redirect/redirect-count-worker.html.ini b/tests/wpt/metadata/fetch/api/redirect/redirect-count-worker.html.ini
new file mode 100644
index 00000000000..c670b300644
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/redirect/redirect-count-worker.html.ini
@@ -0,0 +1,4 @@
+[redirect-count-worker.html]
+ type: testharness
+ disabled: https://github.com/servo/servo/issues/13441
+
diff --git a/tests/wpt/metadata/fetch/api/redirect/redirect-count.html.ini b/tests/wpt/metadata/fetch/api/redirect/redirect-count.html.ini
new file mode 100644
index 00000000000..97bdf14e6ce
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/redirect/redirect-count.html.ini
@@ -0,0 +1,4 @@
+[redirect-count.html]
+ type: testharness
+ disabled: https://github.com/servo/servo/issues/13441
+
diff --git a/tests/wpt/metadata/fetch/api/redirect/redirect-origin-worker.html.ini b/tests/wpt/metadata/fetch/api/redirect/redirect-origin-worker.html.ini
index 4dbf5882893..fcd93545ec1 100644
--- a/tests/wpt/metadata/fetch/api/redirect/redirect-origin-worker.html.ini
+++ b/tests/wpt/metadata/fetch/api/redirect/redirect-origin-worker.html.ini
@@ -1,47 +1,4 @@
[redirect-origin-worker.html]
type: testharness
- [Same origin to other origin redirection 301]
- expected: FAIL
-
- [Other origin to other origin redirection 301]
- expected: FAIL
-
- [Other origin to same origin redirection 301]
- expected: FAIL
-
- [Same origin to other origin redirection 302]
- expected: FAIL
-
- [Other origin to other origin redirection 302]
- expected: FAIL
-
- [Other origin to same origin redirection 302]
- expected: FAIL
-
- [Same origin to other origin redirection 303]
- expected: FAIL
-
- [Other origin to other origin redirection 303]
- expected: FAIL
-
- [Other origin to same origin redirection 303]
- expected: FAIL
-
- [Same origin to other origin redirection 307]
- expected: FAIL
-
- [Other origin to other origin redirection 307]
- expected: FAIL
-
- [Other origin to same origin redirection 307]
- expected: FAIL
-
- [Same origin to other origin redirection 308]
- expected: FAIL
-
- [Other origin to other origin redirection 308]
- expected: FAIL
-
- [Other origin to same origin redirection 308]
- expected: FAIL
+ disabled: https://github.com/servo/servo/issues/13441
diff --git a/tests/wpt/metadata/fetch/api/redirect/redirect-origin.html.ini b/tests/wpt/metadata/fetch/api/redirect/redirect-origin.html.ini
index f9d4621134c..a82435325cb 100644
--- a/tests/wpt/metadata/fetch/api/redirect/redirect-origin.html.ini
+++ b/tests/wpt/metadata/fetch/api/redirect/redirect-origin.html.ini
@@ -1,47 +1,4 @@
[redirect-origin.html]
type: testharness
- [Same origin to other origin redirection 301]
- expected: FAIL
-
- [Other origin to other origin redirection 301]
- expected: FAIL
-
- [Other origin to same origin redirection 301]
- expected: FAIL
-
- [Same origin to other origin redirection 302]
- expected: FAIL
-
- [Other origin to other origin redirection 302]
- expected: FAIL
-
- [Other origin to same origin redirection 302]
- expected: FAIL
-
- [Same origin to other origin redirection 303]
- expected: FAIL
-
- [Other origin to other origin redirection 303]
- expected: FAIL
-
- [Other origin to same origin redirection 303]
- expected: FAIL
-
- [Same origin to other origin redirection 307]
- expected: FAIL
-
- [Other origin to other origin redirection 307]
- expected: FAIL
-
- [Other origin to same origin redirection 307]
- expected: FAIL
-
- [Same origin to other origin redirection 308]
- expected: FAIL
-
- [Other origin to other origin redirection 308]
- expected: FAIL
-
- [Other origin to same origin redirection 308]
- expected: FAIL
+ disabled: https://github.com/servo/servo/issues/13441
diff --git a/tests/wpt/metadata/fetch/api/request/multi-globals/url-parsing.html.ini b/tests/wpt/metadata/fetch/api/request/multi-globals/url-parsing.html.ini
new file mode 100644
index 00000000000..a6e5c4f239b
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/request/multi-globals/url-parsing.html.ini
@@ -0,0 +1,5 @@
+[url-parsing.html]
+ type: testharness
+ [should parse the URL relative to the current settings object]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/request/request-cache-default-conditional.html.ini b/tests/wpt/metadata/fetch/api/request/request-cache-default-conditional.html.ini
new file mode 100644
index 00000000000..07b1858da77
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/request/request-cache-default-conditional.html.ini
@@ -0,0 +1,4 @@
+[request-cache-default-conditional.html]
+ type: testharness
+ disabled: https://github.com/servo/servo/issues/13441
+
diff --git a/tests/wpt/metadata/fetch/api/request/request-cache-default.html.ini b/tests/wpt/metadata/fetch/api/request/request-cache-default.html.ini
new file mode 100644
index 00000000000..31a3ebe54d0
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/request/request-cache-default.html.ini
@@ -0,0 +1,8 @@
+[request-cache-default.html]
+ type: testharness
+ [RequestCache "default" mode checks the cache for previously cached content and avoids going to the network if a fresh response exists with Etag and fresh response]
+ expected: FAIL
+
+ [RequestCache "default" mode checks the cache for previously cached content and avoids going to the network if a fresh response exists with date and fresh response]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/request/request-cache-force-cache.html.ini b/tests/wpt/metadata/fetch/api/request/request-cache-force-cache.html.ini
new file mode 100644
index 00000000000..d11e27f0612
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/request/request-cache-force-cache.html.ini
@@ -0,0 +1,20 @@
+[request-cache-force-cache.html]
+ type: testharness
+ [RequestCache "force-cache" mode checks the cache for previously cached content and avoid revalidation for stale responses with Etag and stale response]
+ expected: FAIL
+
+ [RequestCache "force-cache" mode checks the cache for previously cached content and avoid revalidation for stale responses with date and stale response]
+ expected: FAIL
+
+ [RequestCache "force-cache" mode checks the cache for previously cached content and avoid revalidation for fresh responses with Etag and fresh response]
+ expected: FAIL
+
+ [RequestCache "force-cache" mode checks the cache for previously cached content and avoid revalidation for fresh responses with date and fresh response]
+ expected: FAIL
+
+ [RequestCache "force-cache" stores the response in the cache if it goes to the network with Etag and fresh response]
+ expected: FAIL
+
+ [RequestCache "force-cache" stores the response in the cache if it goes to the network with date and fresh response]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/request/request-cache-only-if-cached.html.ini b/tests/wpt/metadata/fetch/api/request/request-cache-only-if-cached.html.ini
new file mode 100644
index 00000000000..3814a57258e
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/request/request-cache-only-if-cached.html.ini
@@ -0,0 +1,44 @@
+[request-cache-only-if-cached.html]
+ type: testharness
+ [RequestCache "only-if-cached" mode checks the cache for previously cached content and avoids revalidation for stale responses with Etag and stale response]
+ expected: FAIL
+
+ [RequestCache "only-if-cached" mode checks the cache for previously cached content and avoids revalidation for stale responses with date and stale response]
+ expected: FAIL
+
+ [RequestCache "only-if-cached" mode checks the cache for previously cached content and avoids revalidation for fresh responses with Etag and fresh response]
+ expected: FAIL
+
+ [RequestCache "only-if-cached" mode checks the cache for previously cached content and avoids revalidation for fresh responses with date and fresh response]
+ expected: FAIL
+
+ [RequestCache "only-if-cached" mode checks the cache for previously cached content and does not go to the network if a cached response is not found with Etag and fresh response]
+ expected: FAIL
+
+ [RequestCache "only-if-cached" mode checks the cache for previously cached content and does not go to the network if a cached response is not found with date and fresh response]
+ expected: FAIL
+
+ [RequestCache "only-if-cached" (with "same-origin") uses cached same-origin redirects to same-origin content with Etag and fresh response]
+ expected: FAIL
+
+ [RequestCache "only-if-cached" (with "same-origin") uses cached same-origin redirects to same-origin content with date and fresh response]
+ expected: FAIL
+
+ [RequestCache "only-if-cached" (with "same-origin") uses cached same-origin redirects to same-origin content with Etag and stale response]
+ expected: FAIL
+
+ [RequestCache "only-if-cached" (with "same-origin") uses cached same-origin redirects to same-origin content with date and stale response]
+ expected: FAIL
+
+ [RequestCache "only-if-cached" (with "same-origin") does not follow redirects across origins and rejects with Etag and fresh response]
+ expected: FAIL
+
+ [RequestCache "only-if-cached" (with "same-origin") does not follow redirects across origins and rejects with date and fresh response]
+ expected: FAIL
+
+ [RequestCache "only-if-cached" (with "same-origin") does not follow redirects across origins and rejects with Etag and stale response]
+ expected: FAIL
+
+ [RequestCache "only-if-cached" (with "same-origin") does not follow redirects across origins and rejects with date and stale response]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/request/request-cache-reload.html.ini b/tests/wpt/metadata/fetch/api/request/request-cache-reload.html.ini
new file mode 100644
index 00000000000..3b0ddb59c6e
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/request/request-cache-reload.html.ini
@@ -0,0 +1,14 @@
+[request-cache-reload.html]
+ type: testharness
+ [RequestCache "reload" mode does store the response in the cache with Etag and fresh response]
+ expected: FAIL
+
+ [RequestCache "reload" mode does store the response in the cache with date and fresh response]
+ expected: FAIL
+
+ [RequestCache "reload" mode does store the response in the cache even if a previous response is already stored with Etag and fresh response]
+ expected: FAIL
+
+ [RequestCache "reload" mode does store the response in the cache even if a previous response is already stored with date and fresh response]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/request/request-cache.html.ini b/tests/wpt/metadata/fetch/api/request/request-cache.html.ini
deleted file mode 100644
index d80d4fe955a..00000000000
--- a/tests/wpt/metadata/fetch/api/request/request-cache.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[request-cache.html]
- type: testharness
- disabled: https://github.com/servo/servo/issues/13458
- expected: CRASH
diff --git a/tests/wpt/metadata/fetch/api/request/request-consume-empty.html.ini b/tests/wpt/metadata/fetch/api/request/request-consume-empty.html.ini
index 848a39ee5a6..54bdc54e18e 100644
--- a/tests/wpt/metadata/fetch/api/request/request-consume-empty.html.ini
+++ b/tests/wpt/metadata/fetch/api/request/request-consume-empty.html.ini
@@ -21,3 +21,9 @@
[Consume request's body as json]
expected: FAIL
+ [Consume empty FormData request body as text]
+ expected: FAIL
+
+ [Consume empty ArrayBuffer request body as text]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/response/multi-globals/url-parsing.html.ini b/tests/wpt/metadata/fetch/api/response/multi-globals/url-parsing.html.ini
new file mode 100644
index 00000000000..ebf5ccc16d2
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/response/multi-globals/url-parsing.html.ini
@@ -0,0 +1,5 @@
+[url-parsing.html]
+ type: testharness
+ [should parse the redirect Location URL relative to the current settings object]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/response/response-clone.html.ini b/tests/wpt/metadata/fetch/api/response/response-clone.html.ini
index dc3c577e415..b7db9ddf394 100644
--- a/tests/wpt/metadata/fetch/api/response/response-clone.html.ini
+++ b/tests/wpt/metadata/fetch/api/response/response-clone.html.ini
@@ -12,3 +12,36 @@
[Cancelling stream should not affect cloned one]
expected: FAIL
+ [Check response clone use structureClone for teed ReadableStreams (Int8Arraychunk)]
+ expected: FAIL
+
+ [Check response clone use structureClone for teed ReadableStreams (Int16Arraychunk)]
+ expected: FAIL
+
+ [Check response clone use structureClone for teed ReadableStreams (Int32Arraychunk)]
+ expected: FAIL
+
+ [Check response clone use structureClone for teed ReadableStreams (ArrayBufferchunk)]
+ expected: FAIL
+
+ [Check response clone use structureClone for teed ReadableStreams (Uint8Arraychunk)]
+ expected: FAIL
+
+ [Check response clone use structureClone for teed ReadableStreams (Uint8ClampedArraychunk)]
+ expected: FAIL
+
+ [Check response clone use structureClone for teed ReadableStreams (Uint16Arraychunk)]
+ expected: FAIL
+
+ [Check response clone use structureClone for teed ReadableStreams (Uint32Arraychunk)]
+ expected: FAIL
+
+ [Check response clone use structureClone for teed ReadableStreams (Float32Arraychunk)]
+ expected: FAIL
+
+ [Check response clone use structureClone for teed ReadableStreams (Float64Arraychunk)]
+ expected: FAIL
+
+ [Check response clone use structureClone for teed ReadableStreams (DataViewchunk)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/response/response-consume-empty.html.ini b/tests/wpt/metadata/fetch/api/response/response-consume-empty.html.ini
index b7af3cd4719..3b135d01fb5 100644
--- a/tests/wpt/metadata/fetch/api/response/response-consume-empty.html.ini
+++ b/tests/wpt/metadata/fetch/api/response/response-consume-empty.html.ini
@@ -28,3 +28,12 @@
[Consume empty text response body as text]
expected: NOTRUN
+ [Consume empty URLSearchParams response body as text]
+ expected: NOTRUN
+
+ [Consume empty FormData response body as text]
+ expected: NOTRUN
+
+ [Consume empty ArrayBuffer response body as text]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/fetch/api/response/response-consume-stream.html.ini b/tests/wpt/metadata/fetch/api/response/response-consume-stream.html.ini
index a3bc4c15285..ccf31287f00 100644
--- a/tests/wpt/metadata/fetch/api/response/response-consume-stream.html.ini
+++ b/tests/wpt/metadata/fetch/api/response/response-consume-stream.html.ini
@@ -24,3 +24,6 @@
[Getting a redirect Response stream]
expected: FAIL
+ [Read URLSearchParams response's body as readableStream]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/response/response-consume.html.ini b/tests/wpt/metadata/fetch/api/response/response-consume.html.ini
index a0956648b51..4235ac35fee 100644
--- a/tests/wpt/metadata/fetch/api/response/response-consume.html.ini
+++ b/tests/wpt/metadata/fetch/api/response/response-consume.html.ini
@@ -24,3 +24,60 @@
[Consume fetched response's body as arrayBuffer]
expected: FAIL
+ [Consume response's body: from text to arrayBuffer]
+ expected: FAIL
+
+ [Consume response's body: from text with correct multipart type to formData]
+ expected: FAIL
+
+ [Consume response's body: from blob to arrayBuffer]
+ expected: FAIL
+
+ [Consume response's body: from blob with correct multipart type to formData]
+ expected: FAIL
+
+ [Consume response's body: from FormData to formData]
+ expected: FAIL
+
+ [Consume response's body: from FormData to blob]
+ expected: FAIL
+
+ [Consume response's body: from FormData to text]
+ expected: FAIL
+
+ [Consume response's body: from FormData to arrayBuffer]
+ expected: FAIL
+
+ [Consume response's body: from URLSearchParams to arrayBuffer]
+ expected: FAIL
+
+ [Consume response's body: from stream to blob]
+ expected: FAIL
+
+ [Consume response's body: from stream to text]
+ expected: FAIL
+
+ [Consume response's body: from stream to arrayBuffer]
+ expected: FAIL
+
+ [Consume response's body: from stream to json]
+ expected: FAIL
+
+ [Consume response's body: from stream with correct multipart type to formData]
+ expected: FAIL
+
+ [Consume response's body: from stream without correct multipart type to formData (error case)]
+ expected: FAIL
+
+ [Consume response's body: from stream with correct urlencoded type to formData]
+ expected: FAIL
+
+ [Consume response's body: from stream without correct urlencoded type to formData (error case)]
+ expected: FAIL
+
+ [Consume response's body: from fetch to blob]
+ expected: FAIL
+
+ [Consume response's body: from fetch to arrayBuffer]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/hr-time/basic.worker.js.ini b/tests/wpt/metadata/hr-time/basic.worker.js.ini
index 8d2e2c67e2d..667b05337d8 100644
--- a/tests/wpt/metadata/hr-time/basic.worker.js.ini
+++ b/tests/wpt/metadata/hr-time/basic.worker.js.ini
@@ -1,4 +1,4 @@
-[basic.worker]
+[basic.worker.html]
type: testharness
[WorkerGlobalScope.performance.now() is a function]
expected: FAIL
diff --git a/tests/wpt/metadata/hr-time/idlharness.html.ini b/tests/wpt/metadata/hr-time/idlharness.html.ini
new file mode 100644
index 00000000000..1e38b08793e
--- /dev/null
+++ b/tests/wpt/metadata/hr-time/idlharness.html.ini
@@ -0,0 +1,14 @@
+[idlharness.html]
+ type: testharness
+ [Window interface: attribute performance]
+ expected: FAIL
+
+ [Performance interface: existence and properties of interface object]
+ expected: FAIL
+
+ [Performance interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [Stringification of window.performance]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/history_go_to_uri.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/history_go_to_uri.html.ini
new file mode 100644
index 00000000000..5b21d4db949
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/history_go_to_uri.html.ini
@@ -0,0 +1,5 @@
+[history_go_to_uri.html]
+ type: testharness
+ [history.go() negative tests]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/non-automated/traverse_the_session_history_unload_prompt_1.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/non-automated/traverse_the_session_history_unload_prompt_1.html.ini
deleted file mode 100644
index 7758856bbd4..00000000000
--- a/tests/wpt/metadata/html/browsers/history/the-history-interface/non-automated/traverse_the_session_history_unload_prompt_1.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[traverse_the_session_history_unload_prompt_1.html]
- type: testharness
- [Traversing the history, unload event is fired on doucment]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/browsers/history/the-location-interface/location-prototype-setting.html.ini b/tests/wpt/metadata/html/browsers/history/the-location-interface/location-prototype-setting.html.ini
new file mode 100644
index 00000000000..d40ff38ca39
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/history/the-location-interface/location-prototype-setting.html.ini
@@ -0,0 +1,5 @@
+[location-prototype-setting.html]
+ type: testharness
+ [[[SetPrototypeOf\]\] on a location object should return false]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/browsers/history/the-location-interface/location_hash.html.ini b/tests/wpt/metadata/html/browsers/history/the-location-interface/location_hash.html.ini
index a81d6814682..2cf94f6e2e6 100644
--- a/tests/wpt/metadata/html/browsers/history/the-location-interface/location_hash.html.ini
+++ b/tests/wpt/metadata/html/browsers/history/the-location-interface/location_hash.html.ini
@@ -3,3 +3,6 @@
[location hash]
expected: FAIL
+ [Setting location.hash on srcdoc iframe]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/browsers/history/the-location-interface/security_location_0.sub.htm.ini b/tests/wpt/metadata/html/browsers/history/the-location-interface/security_location_0.htm.ini
index 0c9c11c1ea5..eb94f650336 100644
--- a/tests/wpt/metadata/html/browsers/history/the-location-interface/security_location_0.sub.htm.ini
+++ b/tests/wpt/metadata/html/browsers/history/the-location-interface/security_location_0.htm.ini
@@ -1,4 +1,4 @@
-[security_location_0.sub.htm]
+[security_location_0.htm]
type: testharness
[Accessing location object from different origins doesn't raise SECURITY_ERR exception]
expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/sandboxing/sandbox-allow-same-origin.html.ini b/tests/wpt/metadata/html/browsers/sandboxing/sandbox-allow-same-origin.html.ini
new file mode 100644
index 00000000000..98aaa0c55c3
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/sandboxing/sandbox-allow-same-origin.html.ini
@@ -0,0 +1,6 @@
+[sandbox-allow-same-origin.html]
+ type: testharness
+ expected: ERROR
+ [DOM access in sandbox='allow-same-origin' iframe is allowed]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/html/browsers/sandboxing/sandbox-allow-scripts.html.ini b/tests/wpt/metadata/html/browsers/sandboxing/sandbox-allow-scripts.html.ini
new file mode 100644
index 00000000000..91e5608d4b6
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/sandboxing/sandbox-allow-scripts.html.ini
@@ -0,0 +1,6 @@
+[sandbox-allow-scripts.html]
+ type: testharness
+ expected: TIMEOUT
+ [Running script from sandbox='allow-scripts' iframe is allowed]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/html/browsers/sandboxing/sandbox-disallow-same-origin.html.ini b/tests/wpt/metadata/html/browsers/sandboxing/sandbox-disallow-same-origin.html.ini
new file mode 100644
index 00000000000..45a45857a97
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/sandboxing/sandbox-disallow-same-origin.html.ini
@@ -0,0 +1,6 @@
+[sandbox-disallow-same-origin.html]
+ type: testharness
+ expected: ERROR
+ [Access to sandbox iframe is disallowed]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/named-access-on-the-window-object/named-objects.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/named-access-on-the-window-object/named-objects.html.ini
index aa2008d4d39..81f700cd881 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/named-access-on-the-window-object/named-objects.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/named-access-on-the-window-object/named-objects.html.ini
@@ -15,3 +15,6 @@
[Check if window['d'\] returns the element with id='d']
expected: FAIL
+ [Check if window['a'\] contains all applet, embed, form, img, and object elements, and their order]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/security-window/window-security.sub.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/security-window/window-security.html.ini
index b90d5dc5688..5fb19d68ce2 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/security-window/window-security.sub.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/security-window/window-security.html.ini
@@ -1,4 +1,4 @@
-[window-security.sub.html]
+[window-security.html]
type: testharness
[A SecurityError exception must be thrown when window.applicationCache is accessed from a different origin.]
expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/window-open-noopener.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/window-open-noopener.html.ini
new file mode 100644
index 00000000000..2aa832907a6
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/the-window-object/window-open-noopener.html.ini
@@ -0,0 +1,6 @@
+[window-open-noopener.html]
+ type: testharness
+ expected: ERROR
+ [window.open() with 'noopener' should not reuse existing target]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/browsers/windows/nested-browsing-contexts/frameElement.sub.html.ini b/tests/wpt/metadata/html/browsers/windows/nested-browsing-contexts/frameElement.html.ini
index b56a9490e9a..14dcf4b686f 100644
--- a/tests/wpt/metadata/html/browsers/windows/nested-browsing-contexts/frameElement.sub.html.ini
+++ b/tests/wpt/metadata/html/browsers/windows/nested-browsing-contexts/frameElement.html.ini
@@ -1,11 +1,8 @@
-[frameElement.sub.html]
+[frameElement.html]
type: testharness
[The window's frameElement attribute must return its container element if it is a nested browsing context]
expected: FAIL
- [The SecurityError must be thrown if the container's document does not have the same effective script origin]
- expected: FAIL
-
[The SecurityError must be thrown if the window accesses to frameElement attribute of a Window which does not have the same effective script origin]
expected: FAIL
diff --git a/tests/wpt/metadata/html/browsers/windows/targeting-cross-origin-nested-browsing-contexts.html.ini b/tests/wpt/metadata/html/browsers/windows/targeting-cross-origin-nested-browsing-contexts.html.ini
new file mode 100644
index 00000000000..90464594a18
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/windows/targeting-cross-origin-nested-browsing-contexts.html.ini
@@ -0,0 +1,3 @@
+[targeting-cross-origin-nested-browsing-contexts.html]
+ type: testharness
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/windows/targeting-cross-origin-nested-browsing-contexts.sub.html.ini b/tests/wpt/metadata/html/browsers/windows/targeting-cross-origin-nested-browsing-contexts.sub.html.ini
deleted file mode 100644
index 4dedae027e2..00000000000
--- a/tests/wpt/metadata/html/browsers/windows/targeting-cross-origin-nested-browsing-contexts.sub.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[targeting-cross-origin-nested-browsing-contexts.sub.html]
- type: testharness
- expected: TIMEOUT
- [Targeting nested browsing contexts]
- expected: TIMEOUT
-
diff --git a/tests/wpt/metadata/html/dom/documents/dom-tree-accessors/Document.currentScript.sub.html.ini b/tests/wpt/metadata/html/dom/documents/dom-tree-accessors/Document.currentScript.html.ini
index 4ae432e0d28..252190ed7b1 100644
--- a/tests/wpt/metadata/html/dom/documents/dom-tree-accessors/Document.currentScript.sub.html.ini
+++ b/tests/wpt/metadata/html/dom/documents/dom-tree-accessors/Document.currentScript.html.ini
@@ -1,6 +1,9 @@
-[Document.currentScript.sub.html]
+[Document.currentScript.html]
type: testharness
expected: TIMEOUT
+ [Script script-exec]
+ expected: NOTRUN
+
[Script script-svg]
expected: NOTRUN
@@ -10,6 +13,3 @@
[Script document-write]
expected: NOTRUN
- [Script script-exec]
- expected: NOTRUN
-
diff --git a/tests/wpt/metadata/html/dom/documents/dom-tree-accessors/document.forms.html.ini b/tests/wpt/metadata/html/dom/documents/dom-tree-accessors/document.forms.html.ini
deleted file mode 100644
index a1e22155c9c..00000000000
--- a/tests/wpt/metadata/html/dom/documents/dom-tree-accessors/document.forms.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[document.forms.html]
- type: testharness
- [document.forms iteration]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/dom/interfaces.html.ini b/tests/wpt/metadata/html/dom/interfaces.html.ini
index 151d88e473a..2384531b235 100644
--- a/tests/wpt/metadata/html/dom/interfaces.html.ini
+++ b/tests/wpt/metadata/html/dom/interfaces.html.ini
@@ -1056,75 +1056,18 @@
[HTMLCollection interface: calling namedItem(DOMString) on document.all with too few arguments must throw TypeError]
expected: FAIL
- [HTMLFormControlsCollection must be primary interface of document.createElement("form").elements]
- expected: FAIL
-
- [Stringification of document.createElement("form").elements]
- expected: FAIL
-
- [HTMLFormControlsCollection interface: document.createElement("form").elements must inherit property "namedItem" with the proper type (0)]
- expected: FAIL
-
- [HTMLFormControlsCollection interface: calling namedItem(DOMString) on document.createElement("form").elements with too few arguments must throw TypeError]
- expected: FAIL
-
- [HTMLCollection interface: document.createElement("form").elements must inherit property "length" with the proper type (0)]
- expected: FAIL
-
- [HTMLCollection interface: document.createElement("form").elements must inherit property "item" with the proper type (1)]
- expected: FAIL
-
- [HTMLCollection interface: calling item(unsigned long) on document.createElement("form").elements with too few arguments must throw TypeError]
- expected: FAIL
-
- [HTMLCollection interface: document.createElement("form").elements must inherit property "namedItem" with the proper type (2)]
- expected: FAIL
-
- [HTMLCollection interface: calling namedItem(DOMString) on document.createElement("form").elements with too few arguments must throw TypeError]
- expected: FAIL
-
[HTMLOptionsCollection interface: attribute selectedIndex]
expected: FAIL
- [HTMLOptionsCollection must be primary interface of document.createElement("select").options]
- expected: FAIL
-
- [Stringification of document.createElement("select").options]
- expected: FAIL
-
- [HTMLOptionsCollection interface: document.createElement("select").options must inherit property "length" with the proper type (0)]
- expected: FAIL
-
[HTMLOptionsCollection interface: document.createElement("select").options must inherit property "add" with the proper type (3)]
expected: FAIL
- [HTMLOptionsCollection interface: calling add([object Object\],[object Object\],[object Object\],[object Object\]) on document.createElement("select").options with too few arguments must throw TypeError]
- expected: FAIL
-
[HTMLOptionsCollection interface: document.createElement("select").options must inherit property "remove" with the proper type (4)]
expected: FAIL
- [HTMLOptionsCollection interface: calling remove(long) on document.createElement("select").options with too few arguments must throw TypeError]
- expected: FAIL
-
[HTMLOptionsCollection interface: document.createElement("select").options must inherit property "selectedIndex" with the proper type (5)]
expected: FAIL
- [HTMLCollection interface: document.createElement("select").options must inherit property "length" with the proper type (0)]
- expected: FAIL
-
- [HTMLCollection interface: document.createElement("select").options must inherit property "item" with the proper type (1)]
- expected: FAIL
-
- [HTMLCollection interface: calling item(unsigned long) on document.createElement("select").options with too few arguments must throw TypeError]
- expected: FAIL
-
- [HTMLCollection interface: document.createElement("select").options must inherit property "namedItem" with the proper type (2)]
- expected: FAIL
-
- [HTMLCollection interface: calling namedItem(DOMString) on document.createElement("select").options with too few arguments must throw TypeError]
- expected: FAIL
-
[HTMLPropertiesCollection interface: existence and properties of interface object]
expected: FAIL
@@ -1719,12 +1662,6 @@
[HTMLEmbedElement interface: attribute name]
expected: FAIL
- [HTMLEmbedElement must be primary interface of document.createElement("embed")]
- expected: FAIL
-
- [Stringification of document.createElement("embed")]
- expected: FAIL
-
[HTMLEmbedElement interface: document.createElement("embed") must inherit property "src" with the proper type (0)]
expected: FAIL
@@ -1815,18 +1752,9 @@
[HTMLObjectElement interface: attribute border]
expected: FAIL
- [HTMLObjectElement must be primary interface of document.createElement("object")]
- expected: FAIL
-
- [Stringification of document.createElement("object")]
- expected: FAIL
-
[HTMLObjectElement interface: document.createElement("object") must inherit property "data" with the proper type (0)]
expected: FAIL
- [HTMLObjectElement interface: document.createElement("object") must inherit property "type" with the proper type (1)]
- expected: FAIL
-
[HTMLObjectElement interface: document.createElement("object") must inherit property "typeMustMatch" with the proper type (2)]
expected: FAIL
@@ -1836,9 +1764,6 @@
[HTMLObjectElement interface: document.createElement("object") must inherit property "useMap" with the proper type (4)]
expected: FAIL
- [HTMLObjectElement interface: document.createElement("object") must inherit property "form" with the proper type (5)]
- expected: FAIL
-
[HTMLObjectElement interface: document.createElement("object") must inherit property "width" with the proper type (6)]
expected: FAIL
@@ -1854,9 +1779,6 @@
[HTMLObjectElement interface: document.createElement("object") must inherit property "willValidate" with the proper type (10)]
expected: FAIL
- [HTMLObjectElement interface: document.createElement("object") must inherit property "validity" with the proper type (11)]
- expected: FAIL
-
[HTMLObjectElement interface: document.createElement("object") must inherit property "validationMessage" with the proper type (12)]
expected: FAIL
@@ -10577,3 +10499,46 @@
[Navigator interface: window.navigator must inherit property "hardwareConcurrency" with the proper type (22)]
expected: FAIL
+
+ [HTMLOptionsCollection interface: document.createElement("select").options must inherit property "selectedIndex" with the proper type (4)]
+ expected: FAIL
+
+ [HTMLEmbedElement interface: document.createElement("embed") must inherit property "align" with the proper type (5)]
+ expected: FAIL
+
+ [HTMLEmbedElement interface: document.createElement("embed") must inherit property "name" with the proper type (6)]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "align" with the proper type (16)]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "archive" with the proper type (17)]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "code" with the proper type (18)]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "declare" with the proper type (19)]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "hspace" with the proper type (20)]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "standby" with the proper type (21)]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "vspace" with the proper type (22)]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "codeBase" with the proper type (23)]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "codeType" with the proper type (24)]
+ expected: FAIL
+
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "border" with the proper type (25)]
+ expected: FAIL
+
+ [MessageEvent interface: operation initMessageEvent(DOMString,boolean,boolean,any,DOMString,DOMString,[object Object\],[object Object\],[object Object\])]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/dom/reflection-embedded.html.ini b/tests/wpt/metadata/html/dom/reflection-embedded.html.ini
index a7016569e17..106c3dcf98f 100644
--- a/tests/wpt/metadata/html/dom/reflection-embedded.html.ini
+++ b/tests/wpt/metadata/html/dom/reflection-embedded.html.ini
@@ -20799,3 +20799,11121 @@
[area.ping: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo " followed by getAttribute()]
expected: FAIL
+ [img.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [img.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [img.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [img.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [img.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [img.dir: setAttribute() to true]
+ expected: FAIL
+
+ [img.dir: setAttribute() to false]
+ expected: FAIL
+
+ [img.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [img.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [img.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [img.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [img.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [img.dir: setAttribute() to null]
+ expected: FAIL
+
+ [img.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [img.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [img.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [img.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [img.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [img.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [img.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [img.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [img.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [img.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [img.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [img.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [img.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [img.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [img.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [img.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [img.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [img.dir: IDL set to ""]
+ expected: FAIL
+
+ [img.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [img.dir: IDL set to undefined]
+ expected: FAIL
+
+ [img.dir: IDL set to 7]
+ expected: FAIL
+
+ [img.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [img.dir: IDL set to true]
+ expected: FAIL
+
+ [img.dir: IDL set to false]
+ expected: FAIL
+
+ [img.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [img.dir: IDL set to NaN]
+ expected: FAIL
+
+ [img.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [img.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [img.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [img.dir: IDL set to null]
+ expected: FAIL
+
+ [img.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [img.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [img.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [img.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [img.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [img.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [img.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [img.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [img.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [img.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [img.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [img.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [img.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [img.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [img.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [img.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [img.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [img.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [img.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [img.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [img.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [img.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [img.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [img.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [img.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [img.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [img.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [img.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [img.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [img.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [img.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [img.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [img.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [img.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [img.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [img.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [img.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [img.accessKey: IDL set to true]
+ expected: FAIL
+
+ [img.accessKey: IDL set to false]
+ expected: FAIL
+
+ [img.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [img.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [img.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [img.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [img.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [img.accessKey: IDL set to null]
+ expected: FAIL
+
+ [img.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [img.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [img.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [img.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [img.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [img.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [img.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [img.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [img.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [img.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [img.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [img.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [img.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [img.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [img.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [img.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [img.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [img.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [img.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [img.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [img.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [img.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [img.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [img.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [img.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [img.srcset: setAttribute() to ""]
+ expected: FAIL
+
+ [img.srcset: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [img.srcset: setAttribute() to undefined]
+ expected: FAIL
+
+ [img.srcset: setAttribute() to 7]
+ expected: FAIL
+
+ [img.srcset: setAttribute() to 1.5]
+ expected: FAIL
+
+ [img.srcset: setAttribute() to true]
+ expected: FAIL
+
+ [img.srcset: setAttribute() to false]
+ expected: FAIL
+
+ [img.srcset: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [img.srcset: setAttribute() to NaN]
+ expected: FAIL
+
+ [img.srcset: setAttribute() to Infinity]
+ expected: FAIL
+
+ [img.srcset: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [img.srcset: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [img.srcset: setAttribute() to null]
+ expected: FAIL
+
+ [img.srcset: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [img.srcset: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [img.srcset: IDL set to ""]
+ expected: FAIL
+
+ [img.srcset: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [img.srcset: IDL set to undefined]
+ expected: FAIL
+
+ [img.srcset: IDL set to 7]
+ expected: FAIL
+
+ [img.srcset: IDL set to 1.5]
+ expected: FAIL
+
+ [img.srcset: IDL set to true]
+ expected: FAIL
+
+ [img.srcset: IDL set to false]
+ expected: FAIL
+
+ [img.srcset: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [img.srcset: IDL set to NaN]
+ expected: FAIL
+
+ [img.srcset: IDL set to Infinity]
+ expected: FAIL
+
+ [img.srcset: IDL set to -Infinity]
+ expected: FAIL
+
+ [img.srcset: IDL set to "\\0"]
+ expected: FAIL
+
+ [img.srcset: IDL set to null]
+ expected: FAIL
+
+ [img.srcset: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [img.srcset: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [img.crossOrigin: IDL set to undefined]
+ expected: FAIL
+
+ [img.crossOrigin: IDL set to null]
+ expected: FAIL
+
+ [img.width: IDL set to 1]
+ expected: FAIL
+
+ [img.width: IDL set to 257]
+ expected: FAIL
+
+ [img.width: IDL set to 2147483647]
+ expected: FAIL
+
+ [img.height: IDL set to 1]
+ expected: FAIL
+
+ [img.height: IDL set to 257]
+ expected: FAIL
+
+ [img.height: IDL set to 2147483647]
+ expected: FAIL
+
+ [img.lowsrc: setAttribute() to ""]
+ expected: FAIL
+
+ [img.lowsrc: setAttribute() to " foo "]
+ expected: FAIL
+
+ [img.lowsrc: setAttribute() to "http://site.example/"]
+ expected: FAIL
+
+ [img.lowsrc: setAttribute() to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [img.lowsrc: setAttribute() to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [img.lowsrc: setAttribute() to undefined]
+ expected: FAIL
+
+ [img.lowsrc: setAttribute() to 7]
+ expected: FAIL
+
+ [img.lowsrc: setAttribute() to 1.5]
+ expected: FAIL
+
+ [img.lowsrc: setAttribute() to true]
+ expected: FAIL
+
+ [img.lowsrc: setAttribute() to false]
+ expected: FAIL
+
+ [img.lowsrc: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [img.lowsrc: setAttribute() to NaN]
+ expected: FAIL
+
+ [img.lowsrc: setAttribute() to Infinity]
+ expected: FAIL
+
+ [img.lowsrc: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [img.lowsrc: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [img.lowsrc: setAttribute() to null]
+ expected: FAIL
+
+ [img.lowsrc: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [img.lowsrc: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [img.lowsrc: IDL set to ""]
+ expected: FAIL
+
+ [img.lowsrc: IDL set to " foo "]
+ expected: FAIL
+
+ [img.lowsrc: IDL set to "http://site.example/"]
+ expected: FAIL
+
+ [img.lowsrc: IDL set to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [img.lowsrc: IDL set to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [img.lowsrc: IDL set to undefined]
+ expected: FAIL
+
+ [img.lowsrc: IDL set to 7]
+ expected: FAIL
+
+ [img.lowsrc: IDL set to 1.5]
+ expected: FAIL
+
+ [img.lowsrc: IDL set to true]
+ expected: FAIL
+
+ [img.lowsrc: IDL set to false]
+ expected: FAIL
+
+ [img.lowsrc: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [img.lowsrc: IDL set to NaN]
+ expected: FAIL
+
+ [img.lowsrc: IDL set to Infinity]
+ expected: FAIL
+
+ [img.lowsrc: IDL set to -Infinity]
+ expected: FAIL
+
+ [img.lowsrc: IDL set to "\\0"]
+ expected: FAIL
+
+ [img.lowsrc: IDL set to null]
+ expected: FAIL
+
+ [img.lowsrc: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [img.lowsrc: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [img.longDesc: setAttribute() to ""]
+ expected: FAIL
+
+ [img.longDesc: setAttribute() to " foo "]
+ expected: FAIL
+
+ [img.longDesc: setAttribute() to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [img.longDesc: setAttribute() to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [img.longDesc: setAttribute() to undefined]
+ expected: FAIL
+
+ [img.longDesc: setAttribute() to 7]
+ expected: FAIL
+
+ [img.longDesc: setAttribute() to 1.5]
+ expected: FAIL
+
+ [img.longDesc: setAttribute() to true]
+ expected: FAIL
+
+ [img.longDesc: setAttribute() to false]
+ expected: FAIL
+
+ [img.longDesc: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [img.longDesc: setAttribute() to NaN]
+ expected: FAIL
+
+ [img.longDesc: setAttribute() to Infinity]
+ expected: FAIL
+
+ [img.longDesc: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [img.longDesc: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [img.longDesc: setAttribute() to null]
+ expected: FAIL
+
+ [img.longDesc: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [img.longDesc: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [img.longDesc: IDL set to ""]
+ expected: FAIL
+
+ [img.longDesc: IDL set to " foo "]
+ expected: FAIL
+
+ [img.longDesc: IDL set to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [img.longDesc: IDL set to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [img.longDesc: IDL set to undefined]
+ expected: FAIL
+
+ [img.longDesc: IDL set to 7]
+ expected: FAIL
+
+ [img.longDesc: IDL set to 1.5]
+ expected: FAIL
+
+ [img.longDesc: IDL set to true]
+ expected: FAIL
+
+ [img.longDesc: IDL set to false]
+ expected: FAIL
+
+ [img.longDesc: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [img.longDesc: IDL set to NaN]
+ expected: FAIL
+
+ [img.longDesc: IDL set to Infinity]
+ expected: FAIL
+
+ [img.longDesc: IDL set to -Infinity]
+ expected: FAIL
+
+ [img.longDesc: IDL set to "\\0"]
+ expected: FAIL
+
+ [img.longDesc: IDL set to null]
+ expected: FAIL
+
+ [img.longDesc: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [img.longDesc: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to true]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to false]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to null]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [iframe.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [iframe.dir: IDL set to ""]
+ expected: FAIL
+
+ [iframe.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [iframe.dir: IDL set to undefined]
+ expected: FAIL
+
+ [iframe.dir: IDL set to 7]
+ expected: FAIL
+
+ [iframe.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [iframe.dir: IDL set to true]
+ expected: FAIL
+
+ [iframe.dir: IDL set to false]
+ expected: FAIL
+
+ [iframe.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [iframe.dir: IDL set to NaN]
+ expected: FAIL
+
+ [iframe.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [iframe.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [iframe.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [iframe.dir: IDL set to null]
+ expected: FAIL
+
+ [iframe.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [iframe.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [iframe.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [iframe.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [iframe.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [iframe.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [iframe.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [iframe.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [iframe.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [iframe.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [iframe.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [iframe.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [iframe.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [iframe.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [iframe.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [iframe.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [iframe.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [iframe.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [iframe.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [iframe.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [iframe.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [iframe.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [iframe.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [iframe.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [iframe.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [iframe.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [iframe.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [iframe.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [iframe.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [iframe.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [iframe.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [iframe.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [iframe.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [iframe.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [iframe.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [iframe.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [iframe.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [iframe.accessKey: IDL set to true]
+ expected: FAIL
+
+ [iframe.accessKey: IDL set to false]
+ expected: FAIL
+
+ [iframe.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [iframe.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [iframe.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [iframe.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [iframe.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [iframe.accessKey: IDL set to null]
+ expected: FAIL
+
+ [iframe.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [iframe.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [iframe.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [iframe.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [iframe.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [iframe.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [iframe.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [iframe.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [iframe.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [iframe.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [iframe.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [iframe.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [iframe.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [iframe.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [iframe.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [iframe.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [iframe.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [iframe.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [iframe.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [iframe.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [iframe.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [iframe.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [iframe.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [iframe.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [iframe.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [iframe.src: setAttribute() to ""]
+ expected: FAIL
+
+ [iframe.src: setAttribute() to " foo "]
+ expected: FAIL
+
+ [iframe.src: setAttribute() to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [iframe.src: setAttribute() to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [iframe.src: setAttribute() to undefined]
+ expected: FAIL
+
+ [iframe.src: setAttribute() to 7]
+ expected: FAIL
+
+ [iframe.src: setAttribute() to 1.5]
+ expected: FAIL
+
+ [iframe.src: setAttribute() to true]
+ expected: FAIL
+
+ [iframe.src: setAttribute() to false]
+ expected: FAIL
+
+ [iframe.src: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [iframe.src: setAttribute() to NaN]
+ expected: FAIL
+
+ [iframe.src: setAttribute() to Infinity]
+ expected: FAIL
+
+ [iframe.src: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [iframe.src: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [iframe.src: setAttribute() to null]
+ expected: FAIL
+
+ [iframe.src: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [iframe.src: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [iframe.src: IDL set to ""]
+ expected: FAIL
+
+ [iframe.src: IDL set to " foo "]
+ expected: FAIL
+
+ [iframe.src: IDL set to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [iframe.src: IDL set to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [iframe.src: IDL set to undefined]
+ expected: FAIL
+
+ [iframe.src: IDL set to 7]
+ expected: FAIL
+
+ [iframe.src: IDL set to 1.5]
+ expected: FAIL
+
+ [iframe.src: IDL set to true]
+ expected: FAIL
+
+ [iframe.src: IDL set to false]
+ expected: FAIL
+
+ [iframe.src: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [iframe.src: IDL set to NaN]
+ expected: FAIL
+
+ [iframe.src: IDL set to Infinity]
+ expected: FAIL
+
+ [iframe.src: IDL set to -Infinity]
+ expected: FAIL
+
+ [iframe.src: IDL set to "\\0"]
+ expected: FAIL
+
+ [iframe.src: IDL set to null]
+ expected: FAIL
+
+ [iframe.src: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [iframe.src: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [iframe.srcdoc: setAttribute() to ""]
+ expected: FAIL
+
+ [iframe.srcdoc: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [iframe.srcdoc: setAttribute() to undefined]
+ expected: FAIL
+
+ [iframe.srcdoc: setAttribute() to 7]
+ expected: FAIL
+
+ [iframe.srcdoc: setAttribute() to 1.5]
+ expected: FAIL
+
+ [iframe.srcdoc: setAttribute() to true]
+ expected: FAIL
+
+ [iframe.srcdoc: setAttribute() to false]
+ expected: FAIL
+
+ [iframe.srcdoc: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [iframe.srcdoc: setAttribute() to NaN]
+ expected: FAIL
+
+ [iframe.srcdoc: setAttribute() to Infinity]
+ expected: FAIL
+
+ [iframe.srcdoc: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [iframe.srcdoc: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [iframe.srcdoc: setAttribute() to null]
+ expected: FAIL
+
+ [iframe.srcdoc: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [iframe.srcdoc: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [iframe.srcdoc: IDL set to ""]
+ expected: FAIL
+
+ [iframe.srcdoc: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [iframe.srcdoc: IDL set to undefined]
+ expected: FAIL
+
+ [iframe.srcdoc: IDL set to 7]
+ expected: FAIL
+
+ [iframe.srcdoc: IDL set to 1.5]
+ expected: FAIL
+
+ [iframe.srcdoc: IDL set to true]
+ expected: FAIL
+
+ [iframe.srcdoc: IDL set to false]
+ expected: FAIL
+
+ [iframe.srcdoc: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [iframe.srcdoc: IDL set to NaN]
+ expected: FAIL
+
+ [iframe.srcdoc: IDL set to Infinity]
+ expected: FAIL
+
+ [iframe.srcdoc: IDL set to -Infinity]
+ expected: FAIL
+
+ [iframe.srcdoc: IDL set to "\\0"]
+ expected: FAIL
+
+ [iframe.srcdoc: IDL set to null]
+ expected: FAIL
+
+ [iframe.srcdoc: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [iframe.srcdoc: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [iframe.name: setAttribute() to ""]
+ expected: FAIL
+
+ [iframe.name: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [iframe.name: setAttribute() to undefined]
+ expected: FAIL
+
+ [iframe.name: setAttribute() to 7]
+ expected: FAIL
+
+ [iframe.name: setAttribute() to 1.5]
+ expected: FAIL
+
+ [iframe.name: setAttribute() to true]
+ expected: FAIL
+
+ [iframe.name: setAttribute() to false]
+ expected: FAIL
+
+ [iframe.name: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [iframe.name: setAttribute() to NaN]
+ expected: FAIL
+
+ [iframe.name: setAttribute() to Infinity]
+ expected: FAIL
+
+ [iframe.name: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [iframe.name: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [iframe.name: setAttribute() to null]
+ expected: FAIL
+
+ [iframe.name: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [iframe.name: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [iframe.name: IDL set to ""]
+ expected: FAIL
+
+ [iframe.name: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [iframe.name: IDL set to undefined]
+ expected: FAIL
+
+ [iframe.name: IDL set to 7]
+ expected: FAIL
+
+ [iframe.name: IDL set to 1.5]
+ expected: FAIL
+
+ [iframe.name: IDL set to true]
+ expected: FAIL
+
+ [iframe.name: IDL set to false]
+ expected: FAIL
+
+ [iframe.name: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [iframe.name: IDL set to NaN]
+ expected: FAIL
+
+ [iframe.name: IDL set to Infinity]
+ expected: FAIL
+
+ [iframe.name: IDL set to -Infinity]
+ expected: FAIL
+
+ [iframe.name: IDL set to "\\0"]
+ expected: FAIL
+
+ [iframe.name: IDL set to null]
+ expected: FAIL
+
+ [iframe.name: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [iframe.name: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [iframe.allowFullscreen: setAttribute() to ""]
+ expected: FAIL
+
+ [iframe.allowFullscreen: setAttribute() to " foo "]
+ expected: FAIL
+
+ [iframe.allowFullscreen: setAttribute() to undefined]
+ expected: FAIL
+
+ [iframe.allowFullscreen: setAttribute() to null]
+ expected: FAIL
+
+ [iframe.allowFullscreen: setAttribute() to 7]
+ expected: FAIL
+
+ [iframe.allowFullscreen: setAttribute() to 1.5]
+ expected: FAIL
+
+ [iframe.allowFullscreen: setAttribute() to true]
+ expected: FAIL
+
+ [iframe.allowFullscreen: setAttribute() to false]
+ expected: FAIL
+
+ [iframe.allowFullscreen: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [iframe.allowFullscreen: setAttribute() to NaN]
+ expected: FAIL
+
+ [iframe.allowFullscreen: setAttribute() to Infinity]
+ expected: FAIL
+
+ [iframe.allowFullscreen: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [iframe.allowFullscreen: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [iframe.allowFullscreen: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [iframe.allowFullscreen: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [iframe.allowFullscreen: setAttribute() to "allowFullscreen"]
+ expected: FAIL
+
+ [iframe.allowFullscreen: IDL set to ""]
+ expected: FAIL
+
+ [iframe.allowFullscreen: IDL set to " foo "]
+ expected: FAIL
+
+ [iframe.allowFullscreen: IDL set to undefined]
+ expected: FAIL
+
+ [iframe.allowFullscreen: IDL set to null]
+ expected: FAIL
+
+ [iframe.allowFullscreen: IDL set to 7]
+ expected: FAIL
+
+ [iframe.allowFullscreen: IDL set to 1.5]
+ expected: FAIL
+
+ [iframe.allowFullscreen: IDL set to false]
+ expected: FAIL
+
+ [iframe.allowFullscreen: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [iframe.allowFullscreen: IDL set to NaN]
+ expected: FAIL
+
+ [iframe.allowFullscreen: IDL set to Infinity]
+ expected: FAIL
+
+ [iframe.allowFullscreen: IDL set to -Infinity]
+ expected: FAIL
+
+ [iframe.allowFullscreen: IDL set to "\\0"]
+ expected: FAIL
+
+ [iframe.allowFullscreen: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [iframe.allowFullscreen: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [iframe.align: setAttribute() to ""]
+ expected: FAIL
+
+ [iframe.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [iframe.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [iframe.align: setAttribute() to 7]
+ expected: FAIL
+
+ [iframe.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [iframe.align: setAttribute() to true]
+ expected: FAIL
+
+ [iframe.align: setAttribute() to false]
+ expected: FAIL
+
+ [iframe.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [iframe.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [iframe.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [iframe.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [iframe.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [iframe.align: setAttribute() to null]
+ expected: FAIL
+
+ [iframe.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [iframe.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [iframe.align: IDL set to ""]
+ expected: FAIL
+
+ [iframe.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [iframe.align: IDL set to undefined]
+ expected: FAIL
+
+ [iframe.align: IDL set to 7]
+ expected: FAIL
+
+ [iframe.align: IDL set to 1.5]
+ expected: FAIL
+
+ [iframe.align: IDL set to true]
+ expected: FAIL
+
+ [iframe.align: IDL set to false]
+ expected: FAIL
+
+ [iframe.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [iframe.align: IDL set to NaN]
+ expected: FAIL
+
+ [iframe.align: IDL set to Infinity]
+ expected: FAIL
+
+ [iframe.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [iframe.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [iframe.align: IDL set to null]
+ expected: FAIL
+
+ [iframe.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [iframe.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [iframe.scrolling: setAttribute() to ""]
+ expected: FAIL
+
+ [iframe.scrolling: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [iframe.scrolling: setAttribute() to undefined]
+ expected: FAIL
+
+ [iframe.scrolling: setAttribute() to 7]
+ expected: FAIL
+
+ [iframe.scrolling: setAttribute() to 1.5]
+ expected: FAIL
+
+ [iframe.scrolling: setAttribute() to true]
+ expected: FAIL
+
+ [iframe.scrolling: setAttribute() to false]
+ expected: FAIL
+
+ [iframe.scrolling: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [iframe.scrolling: setAttribute() to NaN]
+ expected: FAIL
+
+ [iframe.scrolling: setAttribute() to Infinity]
+ expected: FAIL
+
+ [iframe.scrolling: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [iframe.scrolling: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [iframe.scrolling: setAttribute() to null]
+ expected: FAIL
+
+ [iframe.scrolling: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [iframe.scrolling: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [iframe.scrolling: IDL set to ""]
+ expected: FAIL
+
+ [iframe.scrolling: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [iframe.scrolling: IDL set to undefined]
+ expected: FAIL
+
+ [iframe.scrolling: IDL set to 7]
+ expected: FAIL
+
+ [iframe.scrolling: IDL set to 1.5]
+ expected: FAIL
+
+ [iframe.scrolling: IDL set to true]
+ expected: FAIL
+
+ [iframe.scrolling: IDL set to false]
+ expected: FAIL
+
+ [iframe.scrolling: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [iframe.scrolling: IDL set to NaN]
+ expected: FAIL
+
+ [iframe.scrolling: IDL set to Infinity]
+ expected: FAIL
+
+ [iframe.scrolling: IDL set to -Infinity]
+ expected: FAIL
+
+ [iframe.scrolling: IDL set to "\\0"]
+ expected: FAIL
+
+ [iframe.scrolling: IDL set to null]
+ expected: FAIL
+
+ [iframe.scrolling: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [iframe.scrolling: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [iframe.longDesc: setAttribute() to ""]
+ expected: FAIL
+
+ [iframe.longDesc: setAttribute() to " foo "]
+ expected: FAIL
+
+ [iframe.longDesc: setAttribute() to "http://site.example/"]
+ expected: FAIL
+
+ [iframe.longDesc: setAttribute() to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [iframe.longDesc: setAttribute() to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [iframe.longDesc: setAttribute() to undefined]
+ expected: FAIL
+
+ [iframe.longDesc: setAttribute() to 7]
+ expected: FAIL
+
+ [iframe.longDesc: setAttribute() to 1.5]
+ expected: FAIL
+
+ [iframe.longDesc: setAttribute() to true]
+ expected: FAIL
+
+ [iframe.longDesc: setAttribute() to false]
+ expected: FAIL
+
+ [iframe.longDesc: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [iframe.longDesc: setAttribute() to NaN]
+ expected: FAIL
+
+ [iframe.longDesc: setAttribute() to Infinity]
+ expected: FAIL
+
+ [iframe.longDesc: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [iframe.longDesc: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [iframe.longDesc: setAttribute() to null]
+ expected: FAIL
+
+ [iframe.longDesc: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [iframe.longDesc: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [iframe.longDesc: IDL set to ""]
+ expected: FAIL
+
+ [iframe.longDesc: IDL set to " foo "]
+ expected: FAIL
+
+ [iframe.longDesc: IDL set to "http://site.example/"]
+ expected: FAIL
+
+ [iframe.longDesc: IDL set to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [iframe.longDesc: IDL set to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [iframe.longDesc: IDL set to undefined]
+ expected: FAIL
+
+ [iframe.longDesc: IDL set to 7]
+ expected: FAIL
+
+ [iframe.longDesc: IDL set to 1.5]
+ expected: FAIL
+
+ [iframe.longDesc: IDL set to true]
+ expected: FAIL
+
+ [iframe.longDesc: IDL set to false]
+ expected: FAIL
+
+ [iframe.longDesc: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [iframe.longDesc: IDL set to NaN]
+ expected: FAIL
+
+ [iframe.longDesc: IDL set to Infinity]
+ expected: FAIL
+
+ [iframe.longDesc: IDL set to -Infinity]
+ expected: FAIL
+
+ [iframe.longDesc: IDL set to "\\0"]
+ expected: FAIL
+
+ [iframe.longDesc: IDL set to null]
+ expected: FAIL
+
+ [iframe.longDesc: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [iframe.longDesc: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [iframe.marginHeight: setAttribute() to ""]
+ expected: FAIL
+
+ [iframe.marginHeight: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [iframe.marginHeight: setAttribute() to undefined]
+ expected: FAIL
+
+ [iframe.marginHeight: setAttribute() to 7]
+ expected: FAIL
+
+ [iframe.marginHeight: setAttribute() to 1.5]
+ expected: FAIL
+
+ [iframe.marginHeight: setAttribute() to true]
+ expected: FAIL
+
+ [iframe.marginHeight: setAttribute() to false]
+ expected: FAIL
+
+ [iframe.marginHeight: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [iframe.marginHeight: setAttribute() to NaN]
+ expected: FAIL
+
+ [iframe.marginHeight: setAttribute() to Infinity]
+ expected: FAIL
+
+ [iframe.marginHeight: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [iframe.marginHeight: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [iframe.marginHeight: setAttribute() to null]
+ expected: FAIL
+
+ [iframe.marginHeight: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [iframe.marginHeight: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [iframe.marginHeight: IDL set to ""]
+ expected: FAIL
+
+ [iframe.marginHeight: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [iframe.marginHeight: IDL set to undefined]
+ expected: FAIL
+
+ [iframe.marginHeight: IDL set to 7]
+ expected: FAIL
+
+ [iframe.marginHeight: IDL set to 1.5]
+ expected: FAIL
+
+ [iframe.marginHeight: IDL set to true]
+ expected: FAIL
+
+ [iframe.marginHeight: IDL set to false]
+ expected: FAIL
+
+ [iframe.marginHeight: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [iframe.marginHeight: IDL set to NaN]
+ expected: FAIL
+
+ [iframe.marginHeight: IDL set to Infinity]
+ expected: FAIL
+
+ [iframe.marginHeight: IDL set to -Infinity]
+ expected: FAIL
+
+ [iframe.marginHeight: IDL set to "\\0"]
+ expected: FAIL
+
+ [iframe.marginHeight: IDL set to null]
+ expected: FAIL
+
+ [iframe.marginHeight: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [iframe.marginHeight: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [iframe.marginWidth: setAttribute() to ""]
+ expected: FAIL
+
+ [iframe.marginWidth: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [iframe.marginWidth: setAttribute() to undefined]
+ expected: FAIL
+
+ [iframe.marginWidth: setAttribute() to 7]
+ expected: FAIL
+
+ [iframe.marginWidth: setAttribute() to 1.5]
+ expected: FAIL
+
+ [iframe.marginWidth: setAttribute() to true]
+ expected: FAIL
+
+ [iframe.marginWidth: setAttribute() to false]
+ expected: FAIL
+
+ [iframe.marginWidth: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [iframe.marginWidth: setAttribute() to NaN]
+ expected: FAIL
+
+ [iframe.marginWidth: setAttribute() to Infinity]
+ expected: FAIL
+
+ [iframe.marginWidth: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [iframe.marginWidth: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [iframe.marginWidth: setAttribute() to null]
+ expected: FAIL
+
+ [iframe.marginWidth: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [iframe.marginWidth: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [iframe.marginWidth: IDL set to ""]
+ expected: FAIL
+
+ [iframe.marginWidth: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [iframe.marginWidth: IDL set to undefined]
+ expected: FAIL
+
+ [iframe.marginWidth: IDL set to 7]
+ expected: FAIL
+
+ [iframe.marginWidth: IDL set to 1.5]
+ expected: FAIL
+
+ [iframe.marginWidth: IDL set to true]
+ expected: FAIL
+
+ [iframe.marginWidth: IDL set to false]
+ expected: FAIL
+
+ [iframe.marginWidth: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [iframe.marginWidth: IDL set to NaN]
+ expected: FAIL
+
+ [iframe.marginWidth: IDL set to Infinity]
+ expected: FAIL
+
+ [iframe.marginWidth: IDL set to -Infinity]
+ expected: FAIL
+
+ [iframe.marginWidth: IDL set to "\\0"]
+ expected: FAIL
+
+ [iframe.marginWidth: IDL set to null]
+ expected: FAIL
+
+ [iframe.marginWidth: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [iframe.marginWidth: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to true]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to false]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to null]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [embed.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [embed.dir: IDL set to ""]
+ expected: FAIL
+
+ [embed.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [embed.dir: IDL set to undefined]
+ expected: FAIL
+
+ [embed.dir: IDL set to 7]
+ expected: FAIL
+
+ [embed.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [embed.dir: IDL set to true]
+ expected: FAIL
+
+ [embed.dir: IDL set to false]
+ expected: FAIL
+
+ [embed.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [embed.dir: IDL set to NaN]
+ expected: FAIL
+
+ [embed.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [embed.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [embed.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [embed.dir: IDL set to null]
+ expected: FAIL
+
+ [embed.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [embed.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [embed.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [embed.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [embed.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [embed.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [embed.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [embed.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [embed.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [embed.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [embed.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [embed.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [embed.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [embed.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [embed.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [embed.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [embed.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [embed.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [embed.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [embed.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [embed.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [embed.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [embed.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [embed.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [embed.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [embed.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [embed.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [embed.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [embed.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [embed.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [embed.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [embed.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [embed.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [embed.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [embed.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [embed.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [embed.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [embed.accessKey: IDL set to true]
+ expected: FAIL
+
+ [embed.accessKey: IDL set to false]
+ expected: FAIL
+
+ [embed.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [embed.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [embed.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [embed.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [embed.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [embed.accessKey: IDL set to null]
+ expected: FAIL
+
+ [embed.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [embed.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [embed.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [embed.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [embed.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [embed.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [embed.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [embed.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [embed.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [embed.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [embed.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [embed.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [embed.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [embed.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [embed.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [embed.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [embed.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [embed.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [embed.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [embed.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [embed.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [embed.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [embed.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [embed.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [embed.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [embed.src: setAttribute() to ""]
+ expected: FAIL
+
+ [embed.src: setAttribute() to " foo "]
+ expected: FAIL
+
+ [embed.src: setAttribute() to "http://site.example/"]
+ expected: FAIL
+
+ [embed.src: setAttribute() to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [embed.src: setAttribute() to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [embed.src: setAttribute() to undefined]
+ expected: FAIL
+
+ [embed.src: setAttribute() to 7]
+ expected: FAIL
+
+ [embed.src: setAttribute() to 1.5]
+ expected: FAIL
+
+ [embed.src: setAttribute() to true]
+ expected: FAIL
+
+ [embed.src: setAttribute() to false]
+ expected: FAIL
+
+ [embed.src: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [embed.src: setAttribute() to NaN]
+ expected: FAIL
+
+ [embed.src: setAttribute() to Infinity]
+ expected: FAIL
+
+ [embed.src: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [embed.src: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [embed.src: setAttribute() to null]
+ expected: FAIL
+
+ [embed.src: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [embed.src: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [embed.src: IDL set to ""]
+ expected: FAIL
+
+ [embed.src: IDL set to " foo "]
+ expected: FAIL
+
+ [embed.src: IDL set to "http://site.example/"]
+ expected: FAIL
+
+ [embed.src: IDL set to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [embed.src: IDL set to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [embed.src: IDL set to undefined]
+ expected: FAIL
+
+ [embed.src: IDL set to 7]
+ expected: FAIL
+
+ [embed.src: IDL set to 1.5]
+ expected: FAIL
+
+ [embed.src: IDL set to true]
+ expected: FAIL
+
+ [embed.src: IDL set to false]
+ expected: FAIL
+
+ [embed.src: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [embed.src: IDL set to NaN]
+ expected: FAIL
+
+ [embed.src: IDL set to Infinity]
+ expected: FAIL
+
+ [embed.src: IDL set to -Infinity]
+ expected: FAIL
+
+ [embed.src: IDL set to "\\0"]
+ expected: FAIL
+
+ [embed.src: IDL set to null]
+ expected: FAIL
+
+ [embed.src: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [embed.src: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [embed.type: setAttribute() to ""]
+ expected: FAIL
+
+ [embed.type: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [embed.type: setAttribute() to undefined]
+ expected: FAIL
+
+ [embed.type: setAttribute() to 7]
+ expected: FAIL
+
+ [embed.type: setAttribute() to 1.5]
+ expected: FAIL
+
+ [embed.type: setAttribute() to true]
+ expected: FAIL
+
+ [embed.type: setAttribute() to false]
+ expected: FAIL
+
+ [embed.type: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [embed.type: setAttribute() to NaN]
+ expected: FAIL
+
+ [embed.type: setAttribute() to Infinity]
+ expected: FAIL
+
+ [embed.type: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [embed.type: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [embed.type: setAttribute() to null]
+ expected: FAIL
+
+ [embed.type: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [embed.type: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [embed.type: IDL set to ""]
+ expected: FAIL
+
+ [embed.type: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [embed.type: IDL set to undefined]
+ expected: FAIL
+
+ [embed.type: IDL set to 7]
+ expected: FAIL
+
+ [embed.type: IDL set to 1.5]
+ expected: FAIL
+
+ [embed.type: IDL set to true]
+ expected: FAIL
+
+ [embed.type: IDL set to false]
+ expected: FAIL
+
+ [embed.type: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [embed.type: IDL set to NaN]
+ expected: FAIL
+
+ [embed.type: IDL set to Infinity]
+ expected: FAIL
+
+ [embed.type: IDL set to -Infinity]
+ expected: FAIL
+
+ [embed.type: IDL set to "\\0"]
+ expected: FAIL
+
+ [embed.type: IDL set to null]
+ expected: FAIL
+
+ [embed.type: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [embed.type: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [embed.width: setAttribute() to ""]
+ expected: FAIL
+
+ [embed.width: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [embed.width: setAttribute() to undefined]
+ expected: FAIL
+
+ [embed.width: setAttribute() to 7]
+ expected: FAIL
+
+ [embed.width: setAttribute() to 1.5]
+ expected: FAIL
+
+ [embed.width: setAttribute() to true]
+ expected: FAIL
+
+ [embed.width: setAttribute() to false]
+ expected: FAIL
+
+ [embed.width: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [embed.width: setAttribute() to NaN]
+ expected: FAIL
+
+ [embed.width: setAttribute() to Infinity]
+ expected: FAIL
+
+ [embed.width: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [embed.width: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [embed.width: setAttribute() to null]
+ expected: FAIL
+
+ [embed.width: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [embed.width: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [embed.width: IDL set to ""]
+ expected: FAIL
+
+ [embed.width: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [embed.width: IDL set to undefined]
+ expected: FAIL
+
+ [embed.width: IDL set to 7]
+ expected: FAIL
+
+ [embed.width: IDL set to 1.5]
+ expected: FAIL
+
+ [embed.width: IDL set to true]
+ expected: FAIL
+
+ [embed.width: IDL set to false]
+ expected: FAIL
+
+ [embed.width: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [embed.width: IDL set to NaN]
+ expected: FAIL
+
+ [embed.width: IDL set to Infinity]
+ expected: FAIL
+
+ [embed.width: IDL set to -Infinity]
+ expected: FAIL
+
+ [embed.width: IDL set to "\\0"]
+ expected: FAIL
+
+ [embed.width: IDL set to null]
+ expected: FAIL
+
+ [embed.width: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [embed.width: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [embed.height: setAttribute() to ""]
+ expected: FAIL
+
+ [embed.height: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [embed.height: setAttribute() to undefined]
+ expected: FAIL
+
+ [embed.height: setAttribute() to 7]
+ expected: FAIL
+
+ [embed.height: setAttribute() to 1.5]
+ expected: FAIL
+
+ [embed.height: setAttribute() to true]
+ expected: FAIL
+
+ [embed.height: setAttribute() to false]
+ expected: FAIL
+
+ [embed.height: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [embed.height: setAttribute() to NaN]
+ expected: FAIL
+
+ [embed.height: setAttribute() to Infinity]
+ expected: FAIL
+
+ [embed.height: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [embed.height: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [embed.height: setAttribute() to null]
+ expected: FAIL
+
+ [embed.height: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [embed.height: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [embed.height: IDL set to ""]
+ expected: FAIL
+
+ [embed.height: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [embed.height: IDL set to undefined]
+ expected: FAIL
+
+ [embed.height: IDL set to 7]
+ expected: FAIL
+
+ [embed.height: IDL set to 1.5]
+ expected: FAIL
+
+ [embed.height: IDL set to true]
+ expected: FAIL
+
+ [embed.height: IDL set to false]
+ expected: FAIL
+
+ [embed.height: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [embed.height: IDL set to NaN]
+ expected: FAIL
+
+ [embed.height: IDL set to Infinity]
+ expected: FAIL
+
+ [embed.height: IDL set to -Infinity]
+ expected: FAIL
+
+ [embed.height: IDL set to "\\0"]
+ expected: FAIL
+
+ [embed.height: IDL set to null]
+ expected: FAIL
+
+ [embed.height: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [embed.height: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [embed.align: setAttribute() to ""]
+ expected: FAIL
+
+ [embed.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [embed.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [embed.align: setAttribute() to 7]
+ expected: FAIL
+
+ [embed.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [embed.align: setAttribute() to true]
+ expected: FAIL
+
+ [embed.align: setAttribute() to false]
+ expected: FAIL
+
+ [embed.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [embed.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [embed.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [embed.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [embed.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [embed.align: setAttribute() to null]
+ expected: FAIL
+
+ [embed.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [embed.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [embed.align: IDL set to ""]
+ expected: FAIL
+
+ [embed.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [embed.align: IDL set to undefined]
+ expected: FAIL
+
+ [embed.align: IDL set to 7]
+ expected: FAIL
+
+ [embed.align: IDL set to 1.5]
+ expected: FAIL
+
+ [embed.align: IDL set to true]
+ expected: FAIL
+
+ [embed.align: IDL set to false]
+ expected: FAIL
+
+ [embed.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [embed.align: IDL set to NaN]
+ expected: FAIL
+
+ [embed.align: IDL set to Infinity]
+ expected: FAIL
+
+ [embed.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [embed.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [embed.align: IDL set to null]
+ expected: FAIL
+
+ [embed.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [embed.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [embed.name: setAttribute() to ""]
+ expected: FAIL
+
+ [embed.name: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [embed.name: setAttribute() to undefined]
+ expected: FAIL
+
+ [embed.name: setAttribute() to 7]
+ expected: FAIL
+
+ [embed.name: setAttribute() to 1.5]
+ expected: FAIL
+
+ [embed.name: setAttribute() to true]
+ expected: FAIL
+
+ [embed.name: setAttribute() to false]
+ expected: FAIL
+
+ [embed.name: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [embed.name: setAttribute() to NaN]
+ expected: FAIL
+
+ [embed.name: setAttribute() to Infinity]
+ expected: FAIL
+
+ [embed.name: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [embed.name: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [embed.name: setAttribute() to null]
+ expected: FAIL
+
+ [embed.name: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [embed.name: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [embed.name: IDL set to ""]
+ expected: FAIL
+
+ [embed.name: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [embed.name: IDL set to undefined]
+ expected: FAIL
+
+ [embed.name: IDL set to 7]
+ expected: FAIL
+
+ [embed.name: IDL set to 1.5]
+ expected: FAIL
+
+ [embed.name: IDL set to true]
+ expected: FAIL
+
+ [embed.name: IDL set to false]
+ expected: FAIL
+
+ [embed.name: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [embed.name: IDL set to NaN]
+ expected: FAIL
+
+ [embed.name: IDL set to Infinity]
+ expected: FAIL
+
+ [embed.name: IDL set to -Infinity]
+ expected: FAIL
+
+ [embed.name: IDL set to "\\0"]
+ expected: FAIL
+
+ [embed.name: IDL set to null]
+ expected: FAIL
+
+ [embed.name: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [embed.name: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [object.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [object.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [object.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [object.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [object.dir: setAttribute() to true]
+ expected: FAIL
+
+ [object.dir: setAttribute() to false]
+ expected: FAIL
+
+ [object.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [object.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [object.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [object.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [object.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [object.dir: setAttribute() to null]
+ expected: FAIL
+
+ [object.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [object.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [object.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [object.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [object.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [object.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [object.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [object.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [object.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [object.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [object.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [object.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [object.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [object.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [object.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [object.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [object.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [object.dir: IDL set to ""]
+ expected: FAIL
+
+ [object.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.dir: IDL set to undefined]
+ expected: FAIL
+
+ [object.dir: IDL set to 7]
+ expected: FAIL
+
+ [object.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [object.dir: IDL set to true]
+ expected: FAIL
+
+ [object.dir: IDL set to false]
+ expected: FAIL
+
+ [object.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [object.dir: IDL set to NaN]
+ expected: FAIL
+
+ [object.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [object.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [object.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [object.dir: IDL set to null]
+ expected: FAIL
+
+ [object.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [object.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [object.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [object.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [object.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [object.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [object.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [object.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [object.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [object.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [object.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [object.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [object.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [object.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [object.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [object.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [object.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [object.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [object.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [object.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [object.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [object.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [object.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [object.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [object.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [object.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [object.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [object.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [object.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [object.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [object.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [object.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [object.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [object.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [object.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [object.accessKey: IDL set to true]
+ expected: FAIL
+
+ [object.accessKey: IDL set to false]
+ expected: FAIL
+
+ [object.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [object.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [object.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [object.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [object.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [object.accessKey: IDL set to null]
+ expected: FAIL
+
+ [object.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [object.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [object.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [object.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [object.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [object.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [object.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [object.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [object.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [object.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [object.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [object.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [object.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [object.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [object.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [object.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [object.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [object.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [object.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [object.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [object.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [object.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [object.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [object.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [object.data: setAttribute() to ""]
+ expected: FAIL
+
+ [object.data: setAttribute() to " foo "]
+ expected: FAIL
+
+ [object.data: setAttribute() to "http://site.example/"]
+ expected: FAIL
+
+ [object.data: setAttribute() to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [object.data: setAttribute() to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [object.data: setAttribute() to undefined]
+ expected: FAIL
+
+ [object.data: setAttribute() to 7]
+ expected: FAIL
+
+ [object.data: setAttribute() to 1.5]
+ expected: FAIL
+
+ [object.data: setAttribute() to true]
+ expected: FAIL
+
+ [object.data: setAttribute() to false]
+ expected: FAIL
+
+ [object.data: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [object.data: setAttribute() to NaN]
+ expected: FAIL
+
+ [object.data: setAttribute() to Infinity]
+ expected: FAIL
+
+ [object.data: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [object.data: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [object.data: setAttribute() to null]
+ expected: FAIL
+
+ [object.data: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [object.data: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [object.data: IDL set to ""]
+ expected: FAIL
+
+ [object.data: IDL set to " foo "]
+ expected: FAIL
+
+ [object.data: IDL set to "http://site.example/"]
+ expected: FAIL
+
+ [object.data: IDL set to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [object.data: IDL set to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [object.data: IDL set to undefined]
+ expected: FAIL
+
+ [object.data: IDL set to 7]
+ expected: FAIL
+
+ [object.data: IDL set to 1.5]
+ expected: FAIL
+
+ [object.data: IDL set to true]
+ expected: FAIL
+
+ [object.data: IDL set to false]
+ expected: FAIL
+
+ [object.data: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [object.data: IDL set to NaN]
+ expected: FAIL
+
+ [object.data: IDL set to Infinity]
+ expected: FAIL
+
+ [object.data: IDL set to -Infinity]
+ expected: FAIL
+
+ [object.data: IDL set to "\\0"]
+ expected: FAIL
+
+ [object.data: IDL set to null]
+ expected: FAIL
+
+ [object.data: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [object.data: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [object.typeMustMatch: setAttribute() to ""]
+ expected: FAIL
+
+ [object.typeMustMatch: setAttribute() to " foo "]
+ expected: FAIL
+
+ [object.typeMustMatch: setAttribute() to undefined]
+ expected: FAIL
+
+ [object.typeMustMatch: setAttribute() to null]
+ expected: FAIL
+
+ [object.typeMustMatch: setAttribute() to 7]
+ expected: FAIL
+
+ [object.typeMustMatch: setAttribute() to 1.5]
+ expected: FAIL
+
+ [object.typeMustMatch: setAttribute() to true]
+ expected: FAIL
+
+ [object.typeMustMatch: setAttribute() to false]
+ expected: FAIL
+
+ [object.typeMustMatch: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [object.typeMustMatch: setAttribute() to NaN]
+ expected: FAIL
+
+ [object.typeMustMatch: setAttribute() to Infinity]
+ expected: FAIL
+
+ [object.typeMustMatch: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [object.typeMustMatch: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [object.typeMustMatch: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [object.typeMustMatch: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [object.typeMustMatch: setAttribute() to "typeMustMatch"]
+ expected: FAIL
+
+ [object.typeMustMatch: IDL set to ""]
+ expected: FAIL
+
+ [object.typeMustMatch: IDL set to " foo "]
+ expected: FAIL
+
+ [object.typeMustMatch: IDL set to undefined]
+ expected: FAIL
+
+ [object.typeMustMatch: IDL set to null]
+ expected: FAIL
+
+ [object.typeMustMatch: IDL set to 7]
+ expected: FAIL
+
+ [object.typeMustMatch: IDL set to 1.5]
+ expected: FAIL
+
+ [object.typeMustMatch: IDL set to false]
+ expected: FAIL
+
+ [object.typeMustMatch: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [object.typeMustMatch: IDL set to NaN]
+ expected: FAIL
+
+ [object.typeMustMatch: IDL set to Infinity]
+ expected: FAIL
+
+ [object.typeMustMatch: IDL set to -Infinity]
+ expected: FAIL
+
+ [object.typeMustMatch: IDL set to "\\0"]
+ expected: FAIL
+
+ [object.typeMustMatch: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [object.typeMustMatch: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [object.name: setAttribute() to ""]
+ expected: FAIL
+
+ [object.name: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.name: setAttribute() to undefined]
+ expected: FAIL
+
+ [object.name: setAttribute() to 7]
+ expected: FAIL
+
+ [object.name: setAttribute() to 1.5]
+ expected: FAIL
+
+ [object.name: setAttribute() to true]
+ expected: FAIL
+
+ [object.name: setAttribute() to false]
+ expected: FAIL
+
+ [object.name: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [object.name: setAttribute() to NaN]
+ expected: FAIL
+
+ [object.name: setAttribute() to Infinity]
+ expected: FAIL
+
+ [object.name: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [object.name: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [object.name: setAttribute() to null]
+ expected: FAIL
+
+ [object.name: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [object.name: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [object.name: IDL set to ""]
+ expected: FAIL
+
+ [object.name: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.name: IDL set to undefined]
+ expected: FAIL
+
+ [object.name: IDL set to 7]
+ expected: FAIL
+
+ [object.name: IDL set to 1.5]
+ expected: FAIL
+
+ [object.name: IDL set to true]
+ expected: FAIL
+
+ [object.name: IDL set to false]
+ expected: FAIL
+
+ [object.name: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [object.name: IDL set to NaN]
+ expected: FAIL
+
+ [object.name: IDL set to Infinity]
+ expected: FAIL
+
+ [object.name: IDL set to -Infinity]
+ expected: FAIL
+
+ [object.name: IDL set to "\\0"]
+ expected: FAIL
+
+ [object.name: IDL set to null]
+ expected: FAIL
+
+ [object.name: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [object.name: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [object.useMap: setAttribute() to ""]
+ expected: FAIL
+
+ [object.useMap: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.useMap: setAttribute() to undefined]
+ expected: FAIL
+
+ [object.useMap: setAttribute() to 7]
+ expected: FAIL
+
+ [object.useMap: setAttribute() to 1.5]
+ expected: FAIL
+
+ [object.useMap: setAttribute() to true]
+ expected: FAIL
+
+ [object.useMap: setAttribute() to false]
+ expected: FAIL
+
+ [object.useMap: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [object.useMap: setAttribute() to NaN]
+ expected: FAIL
+
+ [object.useMap: setAttribute() to Infinity]
+ expected: FAIL
+
+ [object.useMap: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [object.useMap: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [object.useMap: setAttribute() to null]
+ expected: FAIL
+
+ [object.useMap: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [object.useMap: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [object.useMap: IDL set to ""]
+ expected: FAIL
+
+ [object.useMap: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.useMap: IDL set to undefined]
+ expected: FAIL
+
+ [object.useMap: IDL set to 7]
+ expected: FAIL
+
+ [object.useMap: IDL set to 1.5]
+ expected: FAIL
+
+ [object.useMap: IDL set to true]
+ expected: FAIL
+
+ [object.useMap: IDL set to false]
+ expected: FAIL
+
+ [object.useMap: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [object.useMap: IDL set to NaN]
+ expected: FAIL
+
+ [object.useMap: IDL set to Infinity]
+ expected: FAIL
+
+ [object.useMap: IDL set to -Infinity]
+ expected: FAIL
+
+ [object.useMap: IDL set to "\\0"]
+ expected: FAIL
+
+ [object.useMap: IDL set to null]
+ expected: FAIL
+
+ [object.useMap: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [object.useMap: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [object.width: setAttribute() to ""]
+ expected: FAIL
+
+ [object.width: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.width: setAttribute() to undefined]
+ expected: FAIL
+
+ [object.width: setAttribute() to 7]
+ expected: FAIL
+
+ [object.width: setAttribute() to 1.5]
+ expected: FAIL
+
+ [object.width: setAttribute() to true]
+ expected: FAIL
+
+ [object.width: setAttribute() to false]
+ expected: FAIL
+
+ [object.width: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [object.width: setAttribute() to NaN]
+ expected: FAIL
+
+ [object.width: setAttribute() to Infinity]
+ expected: FAIL
+
+ [object.width: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [object.width: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [object.width: setAttribute() to null]
+ expected: FAIL
+
+ [object.width: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [object.width: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [object.width: IDL set to ""]
+ expected: FAIL
+
+ [object.width: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.width: IDL set to undefined]
+ expected: FAIL
+
+ [object.width: IDL set to 7]
+ expected: FAIL
+
+ [object.width: IDL set to 1.5]
+ expected: FAIL
+
+ [object.width: IDL set to true]
+ expected: FAIL
+
+ [object.width: IDL set to false]
+ expected: FAIL
+
+ [object.width: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [object.width: IDL set to NaN]
+ expected: FAIL
+
+ [object.width: IDL set to Infinity]
+ expected: FAIL
+
+ [object.width: IDL set to -Infinity]
+ expected: FAIL
+
+ [object.width: IDL set to "\\0"]
+ expected: FAIL
+
+ [object.width: IDL set to null]
+ expected: FAIL
+
+ [object.width: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [object.width: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [object.height: setAttribute() to ""]
+ expected: FAIL
+
+ [object.height: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.height: setAttribute() to undefined]
+ expected: FAIL
+
+ [object.height: setAttribute() to 7]
+ expected: FAIL
+
+ [object.height: setAttribute() to 1.5]
+ expected: FAIL
+
+ [object.height: setAttribute() to true]
+ expected: FAIL
+
+ [object.height: setAttribute() to false]
+ expected: FAIL
+
+ [object.height: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [object.height: setAttribute() to NaN]
+ expected: FAIL
+
+ [object.height: setAttribute() to Infinity]
+ expected: FAIL
+
+ [object.height: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [object.height: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [object.height: setAttribute() to null]
+ expected: FAIL
+
+ [object.height: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [object.height: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [object.height: IDL set to ""]
+ expected: FAIL
+
+ [object.height: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.height: IDL set to undefined]
+ expected: FAIL
+
+ [object.height: IDL set to 7]
+ expected: FAIL
+
+ [object.height: IDL set to 1.5]
+ expected: FAIL
+
+ [object.height: IDL set to true]
+ expected: FAIL
+
+ [object.height: IDL set to false]
+ expected: FAIL
+
+ [object.height: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [object.height: IDL set to NaN]
+ expected: FAIL
+
+ [object.height: IDL set to Infinity]
+ expected: FAIL
+
+ [object.height: IDL set to -Infinity]
+ expected: FAIL
+
+ [object.height: IDL set to "\\0"]
+ expected: FAIL
+
+ [object.height: IDL set to null]
+ expected: FAIL
+
+ [object.height: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [object.height: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [object.align: setAttribute() to ""]
+ expected: FAIL
+
+ [object.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [object.align: setAttribute() to 7]
+ expected: FAIL
+
+ [object.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [object.align: setAttribute() to true]
+ expected: FAIL
+
+ [object.align: setAttribute() to false]
+ expected: FAIL
+
+ [object.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [object.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [object.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [object.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [object.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [object.align: setAttribute() to null]
+ expected: FAIL
+
+ [object.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [object.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [object.align: IDL set to ""]
+ expected: FAIL
+
+ [object.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.align: IDL set to undefined]
+ expected: FAIL
+
+ [object.align: IDL set to 7]
+ expected: FAIL
+
+ [object.align: IDL set to 1.5]
+ expected: FAIL
+
+ [object.align: IDL set to true]
+ expected: FAIL
+
+ [object.align: IDL set to false]
+ expected: FAIL
+
+ [object.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [object.align: IDL set to NaN]
+ expected: FAIL
+
+ [object.align: IDL set to Infinity]
+ expected: FAIL
+
+ [object.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [object.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [object.align: IDL set to null]
+ expected: FAIL
+
+ [object.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [object.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [object.archive: setAttribute() to ""]
+ expected: FAIL
+
+ [object.archive: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.archive: setAttribute() to undefined]
+ expected: FAIL
+
+ [object.archive: setAttribute() to 7]
+ expected: FAIL
+
+ [object.archive: setAttribute() to 1.5]
+ expected: FAIL
+
+ [object.archive: setAttribute() to true]
+ expected: FAIL
+
+ [object.archive: setAttribute() to false]
+ expected: FAIL
+
+ [object.archive: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [object.archive: setAttribute() to NaN]
+ expected: FAIL
+
+ [object.archive: setAttribute() to Infinity]
+ expected: FAIL
+
+ [object.archive: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [object.archive: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [object.archive: setAttribute() to null]
+ expected: FAIL
+
+ [object.archive: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [object.archive: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [object.archive: IDL set to ""]
+ expected: FAIL
+
+ [object.archive: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.archive: IDL set to undefined]
+ expected: FAIL
+
+ [object.archive: IDL set to 7]
+ expected: FAIL
+
+ [object.archive: IDL set to 1.5]
+ expected: FAIL
+
+ [object.archive: IDL set to true]
+ expected: FAIL
+
+ [object.archive: IDL set to false]
+ expected: FAIL
+
+ [object.archive: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [object.archive: IDL set to NaN]
+ expected: FAIL
+
+ [object.archive: IDL set to Infinity]
+ expected: FAIL
+
+ [object.archive: IDL set to -Infinity]
+ expected: FAIL
+
+ [object.archive: IDL set to "\\0"]
+ expected: FAIL
+
+ [object.archive: IDL set to null]
+ expected: FAIL
+
+ [object.archive: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [object.archive: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [object.code: setAttribute() to ""]
+ expected: FAIL
+
+ [object.code: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.code: setAttribute() to undefined]
+ expected: FAIL
+
+ [object.code: setAttribute() to 7]
+ expected: FAIL
+
+ [object.code: setAttribute() to 1.5]
+ expected: FAIL
+
+ [object.code: setAttribute() to true]
+ expected: FAIL
+
+ [object.code: setAttribute() to false]
+ expected: FAIL
+
+ [object.code: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [object.code: setAttribute() to NaN]
+ expected: FAIL
+
+ [object.code: setAttribute() to Infinity]
+ expected: FAIL
+
+ [object.code: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [object.code: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [object.code: setAttribute() to null]
+ expected: FAIL
+
+ [object.code: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [object.code: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [object.code: IDL set to ""]
+ expected: FAIL
+
+ [object.code: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.code: IDL set to undefined]
+ expected: FAIL
+
+ [object.code: IDL set to 7]
+ expected: FAIL
+
+ [object.code: IDL set to 1.5]
+ expected: FAIL
+
+ [object.code: IDL set to true]
+ expected: FAIL
+
+ [object.code: IDL set to false]
+ expected: FAIL
+
+ [object.code: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [object.code: IDL set to NaN]
+ expected: FAIL
+
+ [object.code: IDL set to Infinity]
+ expected: FAIL
+
+ [object.code: IDL set to -Infinity]
+ expected: FAIL
+
+ [object.code: IDL set to "\\0"]
+ expected: FAIL
+
+ [object.code: IDL set to null]
+ expected: FAIL
+
+ [object.code: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [object.code: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [object.declare: setAttribute() to ""]
+ expected: FAIL
+
+ [object.declare: setAttribute() to " foo "]
+ expected: FAIL
+
+ [object.declare: setAttribute() to undefined]
+ expected: FAIL
+
+ [object.declare: setAttribute() to null]
+ expected: FAIL
+
+ [object.declare: setAttribute() to 7]
+ expected: FAIL
+
+ [object.declare: setAttribute() to 1.5]
+ expected: FAIL
+
+ [object.declare: setAttribute() to true]
+ expected: FAIL
+
+ [object.declare: setAttribute() to false]
+ expected: FAIL
+
+ [object.declare: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [object.declare: setAttribute() to NaN]
+ expected: FAIL
+
+ [object.declare: setAttribute() to Infinity]
+ expected: FAIL
+
+ [object.declare: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [object.declare: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [object.declare: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [object.declare: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [object.declare: setAttribute() to "declare"]
+ expected: FAIL
+
+ [object.declare: IDL set to ""]
+ expected: FAIL
+
+ [object.declare: IDL set to " foo "]
+ expected: FAIL
+
+ [object.declare: IDL set to undefined]
+ expected: FAIL
+
+ [object.declare: IDL set to null]
+ expected: FAIL
+
+ [object.declare: IDL set to 7]
+ expected: FAIL
+
+ [object.declare: IDL set to 1.5]
+ expected: FAIL
+
+ [object.declare: IDL set to false]
+ expected: FAIL
+
+ [object.declare: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [object.declare: IDL set to NaN]
+ expected: FAIL
+
+ [object.declare: IDL set to Infinity]
+ expected: FAIL
+
+ [object.declare: IDL set to -Infinity]
+ expected: FAIL
+
+ [object.declare: IDL set to "\\0"]
+ expected: FAIL
+
+ [object.declare: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [object.declare: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to -2147483649]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to -36]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to -1]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to 0]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to 1]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to 257]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to 2147483648]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to 4294967295]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to 4294967296]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to ""]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to "-1"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to "-0"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to "0"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to "1"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to "\\v7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to "7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to "
7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to "
7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to "᠎7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to undefined]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to 1.5]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to true]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to false]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to NaN]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to Infinity]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to object "2"]
+ expected: FAIL
+
+ [object.hspace: setAttribute() to object "3"]
+ expected: FAIL
+
+ [object.hspace: IDL set to 0]
+ expected: FAIL
+
+ [object.hspace: IDL set to 1]
+ expected: FAIL
+
+ [object.hspace: IDL set to 257]
+ expected: FAIL
+
+ [object.hspace: IDL set to 2147483647]
+ expected: FAIL
+
+ [object.hspace: IDL set to "-0"]
+ expected: FAIL
+
+ [object.hspace: IDL set to 2147483648]
+ expected: FAIL
+
+ [object.hspace: IDL set to 4294967295]
+ expected: FAIL
+
+ [object.standby: setAttribute() to ""]
+ expected: FAIL
+
+ [object.standby: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.standby: setAttribute() to undefined]
+ expected: FAIL
+
+ [object.standby: setAttribute() to 7]
+ expected: FAIL
+
+ [object.standby: setAttribute() to 1.5]
+ expected: FAIL
+
+ [object.standby: setAttribute() to true]
+ expected: FAIL
+
+ [object.standby: setAttribute() to false]
+ expected: FAIL
+
+ [object.standby: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [object.standby: setAttribute() to NaN]
+ expected: FAIL
+
+ [object.standby: setAttribute() to Infinity]
+ expected: FAIL
+
+ [object.standby: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [object.standby: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [object.standby: setAttribute() to null]
+ expected: FAIL
+
+ [object.standby: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [object.standby: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [object.standby: IDL set to ""]
+ expected: FAIL
+
+ [object.standby: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.standby: IDL set to undefined]
+ expected: FAIL
+
+ [object.standby: IDL set to 7]
+ expected: FAIL
+
+ [object.standby: IDL set to 1.5]
+ expected: FAIL
+
+ [object.standby: IDL set to true]
+ expected: FAIL
+
+ [object.standby: IDL set to false]
+ expected: FAIL
+
+ [object.standby: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [object.standby: IDL set to NaN]
+ expected: FAIL
+
+ [object.standby: IDL set to Infinity]
+ expected: FAIL
+
+ [object.standby: IDL set to -Infinity]
+ expected: FAIL
+
+ [object.standby: IDL set to "\\0"]
+ expected: FAIL
+
+ [object.standby: IDL set to null]
+ expected: FAIL
+
+ [object.standby: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [object.standby: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to -2147483649]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to -36]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to -1]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to 0]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to 1]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to 257]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to 2147483648]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to 4294967295]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to 4294967296]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to ""]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to "-1"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to "-0"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to "0"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to "1"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to "\\v7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to "7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to "
7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to "
7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to "᠎7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to undefined]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to 1.5]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to true]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to false]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to NaN]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to Infinity]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to object "2"]
+ expected: FAIL
+
+ [object.vspace: setAttribute() to object "3"]
+ expected: FAIL
+
+ [object.vspace: IDL set to 0]
+ expected: FAIL
+
+ [object.vspace: IDL set to 1]
+ expected: FAIL
+
+ [object.vspace: IDL set to 257]
+ expected: FAIL
+
+ [object.vspace: IDL set to 2147483647]
+ expected: FAIL
+
+ [object.vspace: IDL set to "-0"]
+ expected: FAIL
+
+ [object.vspace: IDL set to 2147483648]
+ expected: FAIL
+
+ [object.vspace: IDL set to 4294967295]
+ expected: FAIL
+
+ [object.codeBase: setAttribute() to ""]
+ expected: FAIL
+
+ [object.codeBase: setAttribute() to " foo "]
+ expected: FAIL
+
+ [object.codeBase: setAttribute() to "http://site.example/"]
+ expected: FAIL
+
+ [object.codeBase: setAttribute() to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [object.codeBase: setAttribute() to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [object.codeBase: setAttribute() to undefined]
+ expected: FAIL
+
+ [object.codeBase: setAttribute() to 7]
+ expected: FAIL
+
+ [object.codeBase: setAttribute() to 1.5]
+ expected: FAIL
+
+ [object.codeBase: setAttribute() to true]
+ expected: FAIL
+
+ [object.codeBase: setAttribute() to false]
+ expected: FAIL
+
+ [object.codeBase: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [object.codeBase: setAttribute() to NaN]
+ expected: FAIL
+
+ [object.codeBase: setAttribute() to Infinity]
+ expected: FAIL
+
+ [object.codeBase: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [object.codeBase: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [object.codeBase: setAttribute() to null]
+ expected: FAIL
+
+ [object.codeBase: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [object.codeBase: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [object.codeBase: IDL set to ""]
+ expected: FAIL
+
+ [object.codeBase: IDL set to " foo "]
+ expected: FAIL
+
+ [object.codeBase: IDL set to "http://site.example/"]
+ expected: FAIL
+
+ [object.codeBase: IDL set to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [object.codeBase: IDL set to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [object.codeBase: IDL set to undefined]
+ expected: FAIL
+
+ [object.codeBase: IDL set to 7]
+ expected: FAIL
+
+ [object.codeBase: IDL set to 1.5]
+ expected: FAIL
+
+ [object.codeBase: IDL set to true]
+ expected: FAIL
+
+ [object.codeBase: IDL set to false]
+ expected: FAIL
+
+ [object.codeBase: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [object.codeBase: IDL set to NaN]
+ expected: FAIL
+
+ [object.codeBase: IDL set to Infinity]
+ expected: FAIL
+
+ [object.codeBase: IDL set to -Infinity]
+ expected: FAIL
+
+ [object.codeBase: IDL set to "\\0"]
+ expected: FAIL
+
+ [object.codeBase: IDL set to null]
+ expected: FAIL
+
+ [object.codeBase: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [object.codeBase: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [object.codeType: setAttribute() to ""]
+ expected: FAIL
+
+ [object.codeType: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.codeType: setAttribute() to undefined]
+ expected: FAIL
+
+ [object.codeType: setAttribute() to 7]
+ expected: FAIL
+
+ [object.codeType: setAttribute() to 1.5]
+ expected: FAIL
+
+ [object.codeType: setAttribute() to true]
+ expected: FAIL
+
+ [object.codeType: setAttribute() to false]
+ expected: FAIL
+
+ [object.codeType: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [object.codeType: setAttribute() to NaN]
+ expected: FAIL
+
+ [object.codeType: setAttribute() to Infinity]
+ expected: FAIL
+
+ [object.codeType: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [object.codeType: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [object.codeType: setAttribute() to null]
+ expected: FAIL
+
+ [object.codeType: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [object.codeType: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [object.codeType: IDL set to ""]
+ expected: FAIL
+
+ [object.codeType: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.codeType: IDL set to undefined]
+ expected: FAIL
+
+ [object.codeType: IDL set to 7]
+ expected: FAIL
+
+ [object.codeType: IDL set to 1.5]
+ expected: FAIL
+
+ [object.codeType: IDL set to true]
+ expected: FAIL
+
+ [object.codeType: IDL set to false]
+ expected: FAIL
+
+ [object.codeType: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [object.codeType: IDL set to NaN]
+ expected: FAIL
+
+ [object.codeType: IDL set to Infinity]
+ expected: FAIL
+
+ [object.codeType: IDL set to -Infinity]
+ expected: FAIL
+
+ [object.codeType: IDL set to "\\0"]
+ expected: FAIL
+
+ [object.codeType: IDL set to null]
+ expected: FAIL
+
+ [object.codeType: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [object.codeType: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [object.border: setAttribute() to ""]
+ expected: FAIL
+
+ [object.border: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.border: setAttribute() to undefined]
+ expected: FAIL
+
+ [object.border: setAttribute() to 7]
+ expected: FAIL
+
+ [object.border: setAttribute() to 1.5]
+ expected: FAIL
+
+ [object.border: setAttribute() to true]
+ expected: FAIL
+
+ [object.border: setAttribute() to false]
+ expected: FAIL
+
+ [object.border: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [object.border: setAttribute() to NaN]
+ expected: FAIL
+
+ [object.border: setAttribute() to Infinity]
+ expected: FAIL
+
+ [object.border: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [object.border: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [object.border: setAttribute() to null]
+ expected: FAIL
+
+ [object.border: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [object.border: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [object.border: IDL set to ""]
+ expected: FAIL
+
+ [object.border: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [object.border: IDL set to undefined]
+ expected: FAIL
+
+ [object.border: IDL set to 7]
+ expected: FAIL
+
+ [object.border: IDL set to 1.5]
+ expected: FAIL
+
+ [object.border: IDL set to true]
+ expected: FAIL
+
+ [object.border: IDL set to false]
+ expected: FAIL
+
+ [object.border: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [object.border: IDL set to NaN]
+ expected: FAIL
+
+ [object.border: IDL set to Infinity]
+ expected: FAIL
+
+ [object.border: IDL set to -Infinity]
+ expected: FAIL
+
+ [object.border: IDL set to "\\0"]
+ expected: FAIL
+
+ [object.border: IDL set to null]
+ expected: FAIL
+
+ [object.border: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [object.border: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [param.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [param.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [param.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [param.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [param.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [param.dir: setAttribute() to true]
+ expected: FAIL
+
+ [param.dir: setAttribute() to false]
+ expected: FAIL
+
+ [param.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [param.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [param.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [param.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [param.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [param.dir: setAttribute() to null]
+ expected: FAIL
+
+ [param.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [param.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [param.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [param.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [param.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [param.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [param.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [param.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [param.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [param.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [param.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [param.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [param.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [param.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [param.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [param.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [param.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [param.dir: IDL set to ""]
+ expected: FAIL
+
+ [param.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [param.dir: IDL set to undefined]
+ expected: FAIL
+
+ [param.dir: IDL set to 7]
+ expected: FAIL
+
+ [param.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [param.dir: IDL set to true]
+ expected: FAIL
+
+ [param.dir: IDL set to false]
+ expected: FAIL
+
+ [param.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [param.dir: IDL set to NaN]
+ expected: FAIL
+
+ [param.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [param.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [param.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [param.dir: IDL set to null]
+ expected: FAIL
+
+ [param.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [param.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [param.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [param.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [param.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [param.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [param.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [param.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [param.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [param.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [param.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [param.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [param.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [param.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [param.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [param.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [param.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [param.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [param.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [param.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [param.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [param.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [param.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [param.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [param.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [param.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [param.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [param.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [param.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [param.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [param.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [param.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [param.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [param.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [param.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [param.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [param.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [param.accessKey: IDL set to true]
+ expected: FAIL
+
+ [param.accessKey: IDL set to false]
+ expected: FAIL
+
+ [param.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [param.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [param.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [param.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [param.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [param.accessKey: IDL set to null]
+ expected: FAIL
+
+ [param.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [param.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [param.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [param.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [param.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [param.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [param.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [param.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [param.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [param.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [param.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [param.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [param.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [param.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [param.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [param.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [param.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [param.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [param.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [param.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [param.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [param.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [param.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [param.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [param.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [param.name: setAttribute() to ""]
+ expected: FAIL
+
+ [param.name: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [param.name: setAttribute() to undefined]
+ expected: FAIL
+
+ [param.name: setAttribute() to 7]
+ expected: FAIL
+
+ [param.name: setAttribute() to 1.5]
+ expected: FAIL
+
+ [param.name: setAttribute() to true]
+ expected: FAIL
+
+ [param.name: setAttribute() to false]
+ expected: FAIL
+
+ [param.name: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [param.name: setAttribute() to NaN]
+ expected: FAIL
+
+ [param.name: setAttribute() to Infinity]
+ expected: FAIL
+
+ [param.name: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [param.name: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [param.name: setAttribute() to null]
+ expected: FAIL
+
+ [param.name: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [param.name: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [param.name: IDL set to ""]
+ expected: FAIL
+
+ [param.name: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [param.name: IDL set to undefined]
+ expected: FAIL
+
+ [param.name: IDL set to 7]
+ expected: FAIL
+
+ [param.name: IDL set to 1.5]
+ expected: FAIL
+
+ [param.name: IDL set to true]
+ expected: FAIL
+
+ [param.name: IDL set to false]
+ expected: FAIL
+
+ [param.name: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [param.name: IDL set to NaN]
+ expected: FAIL
+
+ [param.name: IDL set to Infinity]
+ expected: FAIL
+
+ [param.name: IDL set to -Infinity]
+ expected: FAIL
+
+ [param.name: IDL set to "\\0"]
+ expected: FAIL
+
+ [param.name: IDL set to null]
+ expected: FAIL
+
+ [param.name: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [param.name: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [param.value: setAttribute() to ""]
+ expected: FAIL
+
+ [param.value: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [param.value: setAttribute() to undefined]
+ expected: FAIL
+
+ [param.value: setAttribute() to 7]
+ expected: FAIL
+
+ [param.value: setAttribute() to 1.5]
+ expected: FAIL
+
+ [param.value: setAttribute() to true]
+ expected: FAIL
+
+ [param.value: setAttribute() to false]
+ expected: FAIL
+
+ [param.value: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [param.value: setAttribute() to NaN]
+ expected: FAIL
+
+ [param.value: setAttribute() to Infinity]
+ expected: FAIL
+
+ [param.value: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [param.value: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [param.value: setAttribute() to null]
+ expected: FAIL
+
+ [param.value: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [param.value: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [param.value: IDL set to ""]
+ expected: FAIL
+
+ [param.value: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [param.value: IDL set to undefined]
+ expected: FAIL
+
+ [param.value: IDL set to 7]
+ expected: FAIL
+
+ [param.value: IDL set to 1.5]
+ expected: FAIL
+
+ [param.value: IDL set to true]
+ expected: FAIL
+
+ [param.value: IDL set to false]
+ expected: FAIL
+
+ [param.value: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [param.value: IDL set to NaN]
+ expected: FAIL
+
+ [param.value: IDL set to Infinity]
+ expected: FAIL
+
+ [param.value: IDL set to -Infinity]
+ expected: FAIL
+
+ [param.value: IDL set to "\\0"]
+ expected: FAIL
+
+ [param.value: IDL set to null]
+ expected: FAIL
+
+ [param.value: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [param.value: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [param.type: setAttribute() to ""]
+ expected: FAIL
+
+ [param.type: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [param.type: setAttribute() to undefined]
+ expected: FAIL
+
+ [param.type: setAttribute() to 7]
+ expected: FAIL
+
+ [param.type: setAttribute() to 1.5]
+ expected: FAIL
+
+ [param.type: setAttribute() to true]
+ expected: FAIL
+
+ [param.type: setAttribute() to false]
+ expected: FAIL
+
+ [param.type: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [param.type: setAttribute() to NaN]
+ expected: FAIL
+
+ [param.type: setAttribute() to Infinity]
+ expected: FAIL
+
+ [param.type: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [param.type: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [param.type: setAttribute() to null]
+ expected: FAIL
+
+ [param.type: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [param.type: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [param.type: IDL set to ""]
+ expected: FAIL
+
+ [param.type: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [param.type: IDL set to undefined]
+ expected: FAIL
+
+ [param.type: IDL set to 7]
+ expected: FAIL
+
+ [param.type: IDL set to 1.5]
+ expected: FAIL
+
+ [param.type: IDL set to true]
+ expected: FAIL
+
+ [param.type: IDL set to false]
+ expected: FAIL
+
+ [param.type: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [param.type: IDL set to NaN]
+ expected: FAIL
+
+ [param.type: IDL set to Infinity]
+ expected: FAIL
+
+ [param.type: IDL set to -Infinity]
+ expected: FAIL
+
+ [param.type: IDL set to "\\0"]
+ expected: FAIL
+
+ [param.type: IDL set to null]
+ expected: FAIL
+
+ [param.type: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [param.type: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [param.valueType: setAttribute() to ""]
+ expected: FAIL
+
+ [param.valueType: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [param.valueType: setAttribute() to undefined]
+ expected: FAIL
+
+ [param.valueType: setAttribute() to 7]
+ expected: FAIL
+
+ [param.valueType: setAttribute() to 1.5]
+ expected: FAIL
+
+ [param.valueType: setAttribute() to true]
+ expected: FAIL
+
+ [param.valueType: setAttribute() to false]
+ expected: FAIL
+
+ [param.valueType: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [param.valueType: setAttribute() to NaN]
+ expected: FAIL
+
+ [param.valueType: setAttribute() to Infinity]
+ expected: FAIL
+
+ [param.valueType: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [param.valueType: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [param.valueType: setAttribute() to null]
+ expected: FAIL
+
+ [param.valueType: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [param.valueType: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [param.valueType: IDL set to ""]
+ expected: FAIL
+
+ [param.valueType: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [param.valueType: IDL set to undefined]
+ expected: FAIL
+
+ [param.valueType: IDL set to 7]
+ expected: FAIL
+
+ [param.valueType: IDL set to 1.5]
+ expected: FAIL
+
+ [param.valueType: IDL set to true]
+ expected: FAIL
+
+ [param.valueType: IDL set to false]
+ expected: FAIL
+
+ [param.valueType: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [param.valueType: IDL set to NaN]
+ expected: FAIL
+
+ [param.valueType: IDL set to Infinity]
+ expected: FAIL
+
+ [param.valueType: IDL set to -Infinity]
+ expected: FAIL
+
+ [param.valueType: IDL set to "\\0"]
+ expected: FAIL
+
+ [param.valueType: IDL set to null]
+ expected: FAIL
+
+ [param.valueType: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [param.valueType: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [video.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [video.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [video.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [video.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [video.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [video.dir: setAttribute() to true]
+ expected: FAIL
+
+ [video.dir: setAttribute() to false]
+ expected: FAIL
+
+ [video.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [video.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [video.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [video.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [video.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [video.dir: setAttribute() to null]
+ expected: FAIL
+
+ [video.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [video.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [video.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [video.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [video.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [video.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [video.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [video.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [video.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [video.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [video.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [video.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [video.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [video.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [video.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [video.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [video.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [video.dir: IDL set to ""]
+ expected: FAIL
+
+ [video.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [video.dir: IDL set to undefined]
+ expected: FAIL
+
+ [video.dir: IDL set to 7]
+ expected: FAIL
+
+ [video.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [video.dir: IDL set to true]
+ expected: FAIL
+
+ [video.dir: IDL set to false]
+ expected: FAIL
+
+ [video.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [video.dir: IDL set to NaN]
+ expected: FAIL
+
+ [video.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [video.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [video.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [video.dir: IDL set to null]
+ expected: FAIL
+
+ [video.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [video.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [video.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [video.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [video.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [video.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [video.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [video.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [video.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [video.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [video.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [video.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [video.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [video.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [video.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [video.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [video.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [video.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [video.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [video.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [video.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [video.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [video.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [video.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [video.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [video.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [video.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [video.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [video.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [video.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [video.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [video.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [video.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [video.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [video.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [video.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [video.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [video.accessKey: IDL set to true]
+ expected: FAIL
+
+ [video.accessKey: IDL set to false]
+ expected: FAIL
+
+ [video.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [video.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [video.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [video.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [video.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [video.accessKey: IDL set to null]
+ expected: FAIL
+
+ [video.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [video.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [video.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [video.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [video.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [video.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [video.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [video.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [video.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [video.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [video.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [video.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [video.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [video.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [video.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [video.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [video.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [video.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [video.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [video.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [video.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [video.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [video.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [video.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to ""]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to undefined]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to 7]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to 1.5]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to true]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to false]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to NaN]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to Infinity]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to null]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to "anonymous"]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to "xanonymous"]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to "anonymous\\0"]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to "nonymous"]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to "ANONYMOUS"]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to "use-credentials"]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to "xuse-credentials"]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to "use-credentials\\0"]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to "se-credentials"]
+ expected: FAIL
+
+ [video.crossOrigin: setAttribute() to "USE-CREDENTIALS"]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to ""]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to undefined]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to 7]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to 1.5]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to true]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to false]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to NaN]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to Infinity]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to -Infinity]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to "\\0"]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to null]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to "anonymous"]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to "xanonymous"]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to "anonymous\\0"]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to "nonymous"]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to "ANONYMOUS"]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to "use-credentials"]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to "xuse-credentials"]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to "use-credentials\\0"]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to "se-credentials"]
+ expected: FAIL
+
+ [video.crossOrigin: IDL set to "USE-CREDENTIALS"]
+ expected: FAIL
+
+ [video.loop: setAttribute() to ""]
+ expected: FAIL
+
+ [video.loop: setAttribute() to " foo "]
+ expected: FAIL
+
+ [video.loop: setAttribute() to undefined]
+ expected: FAIL
+
+ [video.loop: setAttribute() to null]
+ expected: FAIL
+
+ [video.loop: setAttribute() to 7]
+ expected: FAIL
+
+ [video.loop: setAttribute() to 1.5]
+ expected: FAIL
+
+ [video.loop: setAttribute() to true]
+ expected: FAIL
+
+ [video.loop: setAttribute() to false]
+ expected: FAIL
+
+ [video.loop: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [video.loop: setAttribute() to NaN]
+ expected: FAIL
+
+ [video.loop: setAttribute() to Infinity]
+ expected: FAIL
+
+ [video.loop: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [video.loop: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [video.loop: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [video.loop: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [video.loop: setAttribute() to "loop"]
+ expected: FAIL
+
+ [video.loop: IDL set to ""]
+ expected: FAIL
+
+ [video.loop: IDL set to " foo "]
+ expected: FAIL
+
+ [video.loop: IDL set to undefined]
+ expected: FAIL
+
+ [video.loop: IDL set to null]
+ expected: FAIL
+
+ [video.loop: IDL set to 7]
+ expected: FAIL
+
+ [video.loop: IDL set to 1.5]
+ expected: FAIL
+
+ [video.loop: IDL set to false]
+ expected: FAIL
+
+ [video.loop: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [video.loop: IDL set to NaN]
+ expected: FAIL
+
+ [video.loop: IDL set to Infinity]
+ expected: FAIL
+
+ [video.loop: IDL set to -Infinity]
+ expected: FAIL
+
+ [video.loop: IDL set to "\\0"]
+ expected: FAIL
+
+ [video.loop: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [video.loop: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [video.mediaGroup: setAttribute() to ""]
+ expected: FAIL
+
+ [video.mediaGroup: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [video.mediaGroup: setAttribute() to undefined]
+ expected: FAIL
+
+ [video.mediaGroup: setAttribute() to 7]
+ expected: FAIL
+
+ [video.mediaGroup: setAttribute() to 1.5]
+ expected: FAIL
+
+ [video.mediaGroup: setAttribute() to true]
+ expected: FAIL
+
+ [video.mediaGroup: setAttribute() to false]
+ expected: FAIL
+
+ [video.mediaGroup: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [video.mediaGroup: setAttribute() to NaN]
+ expected: FAIL
+
+ [video.mediaGroup: setAttribute() to Infinity]
+ expected: FAIL
+
+ [video.mediaGroup: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [video.mediaGroup: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [video.mediaGroup: setAttribute() to null]
+ expected: FAIL
+
+ [video.mediaGroup: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [video.mediaGroup: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [video.mediaGroup: IDL set to ""]
+ expected: FAIL
+
+ [video.mediaGroup: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [video.mediaGroup: IDL set to undefined]
+ expected: FAIL
+
+ [video.mediaGroup: IDL set to 7]
+ expected: FAIL
+
+ [video.mediaGroup: IDL set to 1.5]
+ expected: FAIL
+
+ [video.mediaGroup: IDL set to true]
+ expected: FAIL
+
+ [video.mediaGroup: IDL set to false]
+ expected: FAIL
+
+ [video.mediaGroup: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [video.mediaGroup: IDL set to NaN]
+ expected: FAIL
+
+ [video.mediaGroup: IDL set to Infinity]
+ expected: FAIL
+
+ [video.mediaGroup: IDL set to -Infinity]
+ expected: FAIL
+
+ [video.mediaGroup: IDL set to "\\0"]
+ expected: FAIL
+
+ [video.mediaGroup: IDL set to null]
+ expected: FAIL
+
+ [video.mediaGroup: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [video.mediaGroup: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [video.controls: setAttribute() to ""]
+ expected: FAIL
+
+ [video.controls: setAttribute() to " foo "]
+ expected: FAIL
+
+ [video.controls: setAttribute() to undefined]
+ expected: FAIL
+
+ [video.controls: setAttribute() to null]
+ expected: FAIL
+
+ [video.controls: setAttribute() to 7]
+ expected: FAIL
+
+ [video.controls: setAttribute() to 1.5]
+ expected: FAIL
+
+ [video.controls: setAttribute() to true]
+ expected: FAIL
+
+ [video.controls: setAttribute() to false]
+ expected: FAIL
+
+ [video.controls: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [video.controls: setAttribute() to NaN]
+ expected: FAIL
+
+ [video.controls: setAttribute() to Infinity]
+ expected: FAIL
+
+ [video.controls: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [video.controls: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [video.controls: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [video.controls: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [video.controls: setAttribute() to "controls"]
+ expected: FAIL
+
+ [video.controls: IDL set to ""]
+ expected: FAIL
+
+ [video.controls: IDL set to " foo "]
+ expected: FAIL
+
+ [video.controls: IDL set to undefined]
+ expected: FAIL
+
+ [video.controls: IDL set to null]
+ expected: FAIL
+
+ [video.controls: IDL set to 7]
+ expected: FAIL
+
+ [video.controls: IDL set to 1.5]
+ expected: FAIL
+
+ [video.controls: IDL set to false]
+ expected: FAIL
+
+ [video.controls: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [video.controls: IDL set to NaN]
+ expected: FAIL
+
+ [video.controls: IDL set to Infinity]
+ expected: FAIL
+
+ [video.controls: IDL set to -Infinity]
+ expected: FAIL
+
+ [video.controls: IDL set to "\\0"]
+ expected: FAIL
+
+ [video.controls: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [video.controls: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): setAttribute() to ""]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): setAttribute() to " foo "]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): setAttribute() to undefined]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): setAttribute() to null]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): setAttribute() to 7]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): setAttribute() to true]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): setAttribute() to false]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): setAttribute() to NaN]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): setAttribute() to "muted"]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): IDL set to ""]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): IDL set to " foo "]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): IDL set to undefined]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): IDL set to null]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): IDL set to 7]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): IDL set to 1.5]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): IDL set to false]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): IDL set to NaN]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): IDL set to Infinity]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): IDL set to -Infinity]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): IDL set to "\\0"]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [video.defaultMuted (<video muted>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [video.width: setAttribute() to -2147483649]
+ expected: FAIL
+
+ [video.width: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [video.width: setAttribute() to -36]
+ expected: FAIL
+
+ [video.width: setAttribute() to -1]
+ expected: FAIL
+
+ [video.width: setAttribute() to 0]
+ expected: FAIL
+
+ [video.width: setAttribute() to 1]
+ expected: FAIL
+
+ [video.width: setAttribute() to 257]
+ expected: FAIL
+
+ [video.width: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [video.width: setAttribute() to 2147483648]
+ expected: FAIL
+
+ [video.width: setAttribute() to 4294967295]
+ expected: FAIL
+
+ [video.width: setAttribute() to 4294967296]
+ expected: FAIL
+
+ [video.width: setAttribute() to ""]
+ expected: FAIL
+
+ [video.width: setAttribute() to "-1"]
+ expected: FAIL
+
+ [video.width: setAttribute() to "-0"]
+ expected: FAIL
+
+ [video.width: setAttribute() to "0"]
+ expected: FAIL
+
+ [video.width: setAttribute() to "1"]
+ expected: FAIL
+
+ [video.width: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to "\\v7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to "7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to "
7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to "
7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to "᠎7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.width: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [video.width: setAttribute() to undefined]
+ expected: FAIL
+
+ [video.width: setAttribute() to 1.5]
+ expected: FAIL
+
+ [video.width: setAttribute() to true]
+ expected: FAIL
+
+ [video.width: setAttribute() to false]
+ expected: FAIL
+
+ [video.width: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [video.width: setAttribute() to NaN]
+ expected: FAIL
+
+ [video.width: setAttribute() to Infinity]
+ expected: FAIL
+
+ [video.width: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [video.width: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [video.width: setAttribute() to object "2"]
+ expected: FAIL
+
+ [video.width: setAttribute() to object "3"]
+ expected: FAIL
+
+ [video.width: IDL set to 0]
+ expected: FAIL
+
+ [video.width: IDL set to 1]
+ expected: FAIL
+
+ [video.width: IDL set to 257]
+ expected: FAIL
+
+ [video.width: IDL set to 2147483647]
+ expected: FAIL
+
+ [video.width: IDL set to "-0"]
+ expected: FAIL
+
+ [video.width: IDL set to 2147483648]
+ expected: FAIL
+
+ [video.width: IDL set to 4294967295]
+ expected: FAIL
+
+ [video.height: setAttribute() to -2147483649]
+ expected: FAIL
+
+ [video.height: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [video.height: setAttribute() to -36]
+ expected: FAIL
+
+ [video.height: setAttribute() to -1]
+ expected: FAIL
+
+ [video.height: setAttribute() to 0]
+ expected: FAIL
+
+ [video.height: setAttribute() to 1]
+ expected: FAIL
+
+ [video.height: setAttribute() to 257]
+ expected: FAIL
+
+ [video.height: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [video.height: setAttribute() to 2147483648]
+ expected: FAIL
+
+ [video.height: setAttribute() to 4294967295]
+ expected: FAIL
+
+ [video.height: setAttribute() to 4294967296]
+ expected: FAIL
+
+ [video.height: setAttribute() to ""]
+ expected: FAIL
+
+ [video.height: setAttribute() to "-1"]
+ expected: FAIL
+
+ [video.height: setAttribute() to "-0"]
+ expected: FAIL
+
+ [video.height: setAttribute() to "0"]
+ expected: FAIL
+
+ [video.height: setAttribute() to "1"]
+ expected: FAIL
+
+ [video.height: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to "\\v7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to "7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to "
7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to "
7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to "᠎7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to " 7"]
+ expected: FAIL
+
+ [video.height: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [video.height: setAttribute() to undefined]
+ expected: FAIL
+
+ [video.height: setAttribute() to 1.5]
+ expected: FAIL
+
+ [video.height: setAttribute() to true]
+ expected: FAIL
+
+ [video.height: setAttribute() to false]
+ expected: FAIL
+
+ [video.height: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [video.height: setAttribute() to NaN]
+ expected: FAIL
+
+ [video.height: setAttribute() to Infinity]
+ expected: FAIL
+
+ [video.height: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [video.height: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [video.height: setAttribute() to object "2"]
+ expected: FAIL
+
+ [video.height: setAttribute() to object "3"]
+ expected: FAIL
+
+ [video.height: IDL set to 0]
+ expected: FAIL
+
+ [video.height: IDL set to 1]
+ expected: FAIL
+
+ [video.height: IDL set to 257]
+ expected: FAIL
+
+ [video.height: IDL set to 2147483647]
+ expected: FAIL
+
+ [video.height: IDL set to "-0"]
+ expected: FAIL
+
+ [video.height: IDL set to 2147483648]
+ expected: FAIL
+
+ [video.height: IDL set to 4294967295]
+ expected: FAIL
+
+ [video.poster: setAttribute() to ""]
+ expected: FAIL
+
+ [video.poster: setAttribute() to " foo "]
+ expected: FAIL
+
+ [video.poster: setAttribute() to "http://site.example/"]
+ expected: FAIL
+
+ [video.poster: setAttribute() to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [video.poster: setAttribute() to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [video.poster: setAttribute() to undefined]
+ expected: FAIL
+
+ [video.poster: setAttribute() to 7]
+ expected: FAIL
+
+ [video.poster: setAttribute() to 1.5]
+ expected: FAIL
+
+ [video.poster: setAttribute() to true]
+ expected: FAIL
+
+ [video.poster: setAttribute() to false]
+ expected: FAIL
+
+ [video.poster: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [video.poster: setAttribute() to NaN]
+ expected: FAIL
+
+ [video.poster: setAttribute() to Infinity]
+ expected: FAIL
+
+ [video.poster: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [video.poster: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [video.poster: setAttribute() to null]
+ expected: FAIL
+
+ [video.poster: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [video.poster: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [video.poster: IDL set to ""]
+ expected: FAIL
+
+ [video.poster: IDL set to " foo "]
+ expected: FAIL
+
+ [video.poster: IDL set to "http://site.example/"]
+ expected: FAIL
+
+ [video.poster: IDL set to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [video.poster: IDL set to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [video.poster: IDL set to undefined]
+ expected: FAIL
+
+ [video.poster: IDL set to 7]
+ expected: FAIL
+
+ [video.poster: IDL set to 1.5]
+ expected: FAIL
+
+ [video.poster: IDL set to true]
+ expected: FAIL
+
+ [video.poster: IDL set to false]
+ expected: FAIL
+
+ [video.poster: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [video.poster: IDL set to NaN]
+ expected: FAIL
+
+ [video.poster: IDL set to Infinity]
+ expected: FAIL
+
+ [video.poster: IDL set to -Infinity]
+ expected: FAIL
+
+ [video.poster: IDL set to "\\0"]
+ expected: FAIL
+
+ [video.poster: IDL set to null]
+ expected: FAIL
+
+ [video.poster: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [video.poster: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to true]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to false]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to null]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [audio.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [audio.dir: IDL set to ""]
+ expected: FAIL
+
+ [audio.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [audio.dir: IDL set to undefined]
+ expected: FAIL
+
+ [audio.dir: IDL set to 7]
+ expected: FAIL
+
+ [audio.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [audio.dir: IDL set to true]
+ expected: FAIL
+
+ [audio.dir: IDL set to false]
+ expected: FAIL
+
+ [audio.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [audio.dir: IDL set to NaN]
+ expected: FAIL
+
+ [audio.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [audio.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [audio.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [audio.dir: IDL set to null]
+ expected: FAIL
+
+ [audio.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [audio.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [audio.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [audio.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [audio.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [audio.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [audio.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [audio.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [audio.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [audio.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [audio.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [audio.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [audio.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [audio.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [audio.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [audio.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [audio.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [audio.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [audio.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [audio.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [audio.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [audio.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [audio.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [audio.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [audio.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [audio.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [audio.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [audio.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [audio.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [audio.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [audio.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [audio.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [audio.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [audio.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [audio.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [audio.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [audio.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [audio.accessKey: IDL set to true]
+ expected: FAIL
+
+ [audio.accessKey: IDL set to false]
+ expected: FAIL
+
+ [audio.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [audio.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [audio.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [audio.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [audio.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [audio.accessKey: IDL set to null]
+ expected: FAIL
+
+ [audio.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [audio.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [audio.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [audio.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [audio.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [audio.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [audio.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [audio.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [audio.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [audio.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [audio.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [audio.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [audio.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [audio.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [audio.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [audio.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [audio.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [audio.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [audio.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [audio.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [audio.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [audio.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [audio.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [audio.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [audio.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to ""]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to undefined]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to 7]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to 1.5]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to true]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to false]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to NaN]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to Infinity]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to null]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to "anonymous"]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to "xanonymous"]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to "anonymous\\0"]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to "nonymous"]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to "ANONYMOUS"]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to "use-credentials"]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to "xuse-credentials"]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to "use-credentials\\0"]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to "se-credentials"]
+ expected: FAIL
+
+ [audio.crossOrigin: setAttribute() to "USE-CREDENTIALS"]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to ""]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to undefined]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to 7]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to 1.5]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to true]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to false]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to NaN]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to Infinity]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to -Infinity]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to "\\0"]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to null]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to "anonymous"]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to "xanonymous"]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to "anonymous\\0"]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to "nonymous"]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to "ANONYMOUS"]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to "use-credentials"]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to "xuse-credentials"]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to "use-credentials\\0"]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to "se-credentials"]
+ expected: FAIL
+
+ [audio.crossOrigin: IDL set to "USE-CREDENTIALS"]
+ expected: FAIL
+
+ [audio.loop: setAttribute() to ""]
+ expected: FAIL
+
+ [audio.loop: setAttribute() to " foo "]
+ expected: FAIL
+
+ [audio.loop: setAttribute() to undefined]
+ expected: FAIL
+
+ [audio.loop: setAttribute() to null]
+ expected: FAIL
+
+ [audio.loop: setAttribute() to 7]
+ expected: FAIL
+
+ [audio.loop: setAttribute() to 1.5]
+ expected: FAIL
+
+ [audio.loop: setAttribute() to true]
+ expected: FAIL
+
+ [audio.loop: setAttribute() to false]
+ expected: FAIL
+
+ [audio.loop: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [audio.loop: setAttribute() to NaN]
+ expected: FAIL
+
+ [audio.loop: setAttribute() to Infinity]
+ expected: FAIL
+
+ [audio.loop: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [audio.loop: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [audio.loop: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [audio.loop: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [audio.loop: setAttribute() to "loop"]
+ expected: FAIL
+
+ [audio.loop: IDL set to ""]
+ expected: FAIL
+
+ [audio.loop: IDL set to " foo "]
+ expected: FAIL
+
+ [audio.loop: IDL set to undefined]
+ expected: FAIL
+
+ [audio.loop: IDL set to null]
+ expected: FAIL
+
+ [audio.loop: IDL set to 7]
+ expected: FAIL
+
+ [audio.loop: IDL set to 1.5]
+ expected: FAIL
+
+ [audio.loop: IDL set to false]
+ expected: FAIL
+
+ [audio.loop: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [audio.loop: IDL set to NaN]
+ expected: FAIL
+
+ [audio.loop: IDL set to Infinity]
+ expected: FAIL
+
+ [audio.loop: IDL set to -Infinity]
+ expected: FAIL
+
+ [audio.loop: IDL set to "\\0"]
+ expected: FAIL
+
+ [audio.loop: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [audio.loop: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [audio.mediaGroup: setAttribute() to ""]
+ expected: FAIL
+
+ [audio.mediaGroup: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [audio.mediaGroup: setAttribute() to undefined]
+ expected: FAIL
+
+ [audio.mediaGroup: setAttribute() to 7]
+ expected: FAIL
+
+ [audio.mediaGroup: setAttribute() to 1.5]
+ expected: FAIL
+
+ [audio.mediaGroup: setAttribute() to true]
+ expected: FAIL
+
+ [audio.mediaGroup: setAttribute() to false]
+ expected: FAIL
+
+ [audio.mediaGroup: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [audio.mediaGroup: setAttribute() to NaN]
+ expected: FAIL
+
+ [audio.mediaGroup: setAttribute() to Infinity]
+ expected: FAIL
+
+ [audio.mediaGroup: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [audio.mediaGroup: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [audio.mediaGroup: setAttribute() to null]
+ expected: FAIL
+
+ [audio.mediaGroup: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [audio.mediaGroup: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [audio.mediaGroup: IDL set to ""]
+ expected: FAIL
+
+ [audio.mediaGroup: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [audio.mediaGroup: IDL set to undefined]
+ expected: FAIL
+
+ [audio.mediaGroup: IDL set to 7]
+ expected: FAIL
+
+ [audio.mediaGroup: IDL set to 1.5]
+ expected: FAIL
+
+ [audio.mediaGroup: IDL set to true]
+ expected: FAIL
+
+ [audio.mediaGroup: IDL set to false]
+ expected: FAIL
+
+ [audio.mediaGroup: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [audio.mediaGroup: IDL set to NaN]
+ expected: FAIL
+
+ [audio.mediaGroup: IDL set to Infinity]
+ expected: FAIL
+
+ [audio.mediaGroup: IDL set to -Infinity]
+ expected: FAIL
+
+ [audio.mediaGroup: IDL set to "\\0"]
+ expected: FAIL
+
+ [audio.mediaGroup: IDL set to null]
+ expected: FAIL
+
+ [audio.mediaGroup: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [audio.mediaGroup: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [audio.controls: setAttribute() to ""]
+ expected: FAIL
+
+ [audio.controls: setAttribute() to " foo "]
+ expected: FAIL
+
+ [audio.controls: setAttribute() to undefined]
+ expected: FAIL
+
+ [audio.controls: setAttribute() to null]
+ expected: FAIL
+
+ [audio.controls: setAttribute() to 7]
+ expected: FAIL
+
+ [audio.controls: setAttribute() to 1.5]
+ expected: FAIL
+
+ [audio.controls: setAttribute() to true]
+ expected: FAIL
+
+ [audio.controls: setAttribute() to false]
+ expected: FAIL
+
+ [audio.controls: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [audio.controls: setAttribute() to NaN]
+ expected: FAIL
+
+ [audio.controls: setAttribute() to Infinity]
+ expected: FAIL
+
+ [audio.controls: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [audio.controls: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [audio.controls: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [audio.controls: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [audio.controls: setAttribute() to "controls"]
+ expected: FAIL
+
+ [audio.controls: IDL set to ""]
+ expected: FAIL
+
+ [audio.controls: IDL set to " foo "]
+ expected: FAIL
+
+ [audio.controls: IDL set to undefined]
+ expected: FAIL
+
+ [audio.controls: IDL set to null]
+ expected: FAIL
+
+ [audio.controls: IDL set to 7]
+ expected: FAIL
+
+ [audio.controls: IDL set to 1.5]
+ expected: FAIL
+
+ [audio.controls: IDL set to false]
+ expected: FAIL
+
+ [audio.controls: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [audio.controls: IDL set to NaN]
+ expected: FAIL
+
+ [audio.controls: IDL set to Infinity]
+ expected: FAIL
+
+ [audio.controls: IDL set to -Infinity]
+ expected: FAIL
+
+ [audio.controls: IDL set to "\\0"]
+ expected: FAIL
+
+ [audio.controls: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [audio.controls: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): setAttribute() to ""]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): setAttribute() to " foo "]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): setAttribute() to undefined]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): setAttribute() to null]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): setAttribute() to 7]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): setAttribute() to true]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): setAttribute() to false]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): setAttribute() to NaN]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): setAttribute() to "muted"]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): IDL set to ""]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): IDL set to " foo "]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): IDL set to undefined]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): IDL set to null]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): IDL set to 7]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): IDL set to 1.5]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): IDL set to false]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): IDL set to NaN]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): IDL set to Infinity]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): IDL set to -Infinity]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): IDL set to "\\0"]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [audio.defaultMuted (<audio muted>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [source.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [source.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [source.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [source.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [source.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [source.dir: setAttribute() to true]
+ expected: FAIL
+
+ [source.dir: setAttribute() to false]
+ expected: FAIL
+
+ [source.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [source.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [source.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [source.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [source.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [source.dir: setAttribute() to null]
+ expected: FAIL
+
+ [source.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [source.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [source.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [source.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [source.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [source.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [source.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [source.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [source.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [source.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [source.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [source.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [source.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [source.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [source.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [source.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [source.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [source.dir: IDL set to ""]
+ expected: FAIL
+
+ [source.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [source.dir: IDL set to undefined]
+ expected: FAIL
+
+ [source.dir: IDL set to 7]
+ expected: FAIL
+
+ [source.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [source.dir: IDL set to true]
+ expected: FAIL
+
+ [source.dir: IDL set to false]
+ expected: FAIL
+
+ [source.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [source.dir: IDL set to NaN]
+ expected: FAIL
+
+ [source.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [source.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [source.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [source.dir: IDL set to null]
+ expected: FAIL
+
+ [source.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [source.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [source.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [source.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [source.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [source.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [source.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [source.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [source.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [source.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [source.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [source.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [source.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [source.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [source.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [source.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [source.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [source.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [source.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [source.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [source.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [source.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [source.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [source.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [source.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [source.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [source.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [source.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [source.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [source.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [source.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [source.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [source.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [source.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [source.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [source.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [source.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [source.accessKey: IDL set to true]
+ expected: FAIL
+
+ [source.accessKey: IDL set to false]
+ expected: FAIL
+
+ [source.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [source.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [source.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [source.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [source.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [source.accessKey: IDL set to null]
+ expected: FAIL
+
+ [source.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [source.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [source.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [source.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [source.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [source.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [source.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [source.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [source.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [source.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [source.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [source.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [source.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [source.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [source.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [source.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [source.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [source.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [source.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [source.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [source.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [source.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [source.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [source.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [source.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [source.src: setAttribute() to ""]
+ expected: FAIL
+
+ [source.src: setAttribute() to " foo "]
+ expected: FAIL
+
+ [source.src: setAttribute() to "http://site.example/"]
+ expected: FAIL
+
+ [source.src: setAttribute() to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [source.src: setAttribute() to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [source.src: setAttribute() to undefined]
+ expected: FAIL
+
+ [source.src: setAttribute() to 7]
+ expected: FAIL
+
+ [source.src: setAttribute() to 1.5]
+ expected: FAIL
+
+ [source.src: setAttribute() to true]
+ expected: FAIL
+
+ [source.src: setAttribute() to false]
+ expected: FAIL
+
+ [source.src: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [source.src: setAttribute() to NaN]
+ expected: FAIL
+
+ [source.src: setAttribute() to Infinity]
+ expected: FAIL
+
+ [source.src: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [source.src: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [source.src: setAttribute() to null]
+ expected: FAIL
+
+ [source.src: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [source.src: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [source.src: IDL set to ""]
+ expected: FAIL
+
+ [source.src: IDL set to " foo "]
+ expected: FAIL
+
+ [source.src: IDL set to "http://site.example/"]
+ expected: FAIL
+
+ [source.src: IDL set to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [source.src: IDL set to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [source.src: IDL set to undefined]
+ expected: FAIL
+
+ [source.src: IDL set to 7]
+ expected: FAIL
+
+ [source.src: IDL set to 1.5]
+ expected: FAIL
+
+ [source.src: IDL set to true]
+ expected: FAIL
+
+ [source.src: IDL set to false]
+ expected: FAIL
+
+ [source.src: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [source.src: IDL set to NaN]
+ expected: FAIL
+
+ [source.src: IDL set to Infinity]
+ expected: FAIL
+
+ [source.src: IDL set to -Infinity]
+ expected: FAIL
+
+ [source.src: IDL set to "\\0"]
+ expected: FAIL
+
+ [source.src: IDL set to null]
+ expected: FAIL
+
+ [source.src: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [source.src: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [source.type: setAttribute() to ""]
+ expected: FAIL
+
+ [source.type: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [source.type: setAttribute() to undefined]
+ expected: FAIL
+
+ [source.type: setAttribute() to 7]
+ expected: FAIL
+
+ [source.type: setAttribute() to 1.5]
+ expected: FAIL
+
+ [source.type: setAttribute() to true]
+ expected: FAIL
+
+ [source.type: setAttribute() to false]
+ expected: FAIL
+
+ [source.type: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [source.type: setAttribute() to NaN]
+ expected: FAIL
+
+ [source.type: setAttribute() to Infinity]
+ expected: FAIL
+
+ [source.type: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [source.type: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [source.type: setAttribute() to null]
+ expected: FAIL
+
+ [source.type: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [source.type: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [source.type: IDL set to ""]
+ expected: FAIL
+
+ [source.type: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [source.type: IDL set to undefined]
+ expected: FAIL
+
+ [source.type: IDL set to 7]
+ expected: FAIL
+
+ [source.type: IDL set to 1.5]
+ expected: FAIL
+
+ [source.type: IDL set to true]
+ expected: FAIL
+
+ [source.type: IDL set to false]
+ expected: FAIL
+
+ [source.type: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [source.type: IDL set to NaN]
+ expected: FAIL
+
+ [source.type: IDL set to Infinity]
+ expected: FAIL
+
+ [source.type: IDL set to -Infinity]
+ expected: FAIL
+
+ [source.type: IDL set to "\\0"]
+ expected: FAIL
+
+ [source.type: IDL set to null]
+ expected: FAIL
+
+ [source.type: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [source.type: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [source.media: setAttribute() to ""]
+ expected: FAIL
+
+ [source.media: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [source.media: setAttribute() to undefined]
+ expected: FAIL
+
+ [source.media: setAttribute() to 7]
+ expected: FAIL
+
+ [source.media: setAttribute() to 1.5]
+ expected: FAIL
+
+ [source.media: setAttribute() to true]
+ expected: FAIL
+
+ [source.media: setAttribute() to false]
+ expected: FAIL
+
+ [source.media: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [source.media: setAttribute() to NaN]
+ expected: FAIL
+
+ [source.media: setAttribute() to Infinity]
+ expected: FAIL
+
+ [source.media: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [source.media: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [source.media: setAttribute() to null]
+ expected: FAIL
+
+ [source.media: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [source.media: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [source.media: IDL set to ""]
+ expected: FAIL
+
+ [source.media: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [source.media: IDL set to undefined]
+ expected: FAIL
+
+ [source.media: IDL set to 7]
+ expected: FAIL
+
+ [source.media: IDL set to 1.5]
+ expected: FAIL
+
+ [source.media: IDL set to true]
+ expected: FAIL
+
+ [source.media: IDL set to false]
+ expected: FAIL
+
+ [source.media: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [source.media: IDL set to NaN]
+ expected: FAIL
+
+ [source.media: IDL set to Infinity]
+ expected: FAIL
+
+ [source.media: IDL set to -Infinity]
+ expected: FAIL
+
+ [source.media: IDL set to "\\0"]
+ expected: FAIL
+
+ [source.media: IDL set to null]
+ expected: FAIL
+
+ [source.media: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [source.media: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [track.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [track.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [track.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [track.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [track.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [track.dir: setAttribute() to true]
+ expected: FAIL
+
+ [track.dir: setAttribute() to false]
+ expected: FAIL
+
+ [track.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [track.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [track.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [track.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [track.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [track.dir: setAttribute() to null]
+ expected: FAIL
+
+ [track.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [track.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [track.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [track.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [track.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [track.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [track.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [track.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [track.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [track.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [track.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [track.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [track.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [track.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [track.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [track.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [track.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [track.dir: IDL set to ""]
+ expected: FAIL
+
+ [track.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [track.dir: IDL set to undefined]
+ expected: FAIL
+
+ [track.dir: IDL set to 7]
+ expected: FAIL
+
+ [track.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [track.dir: IDL set to true]
+ expected: FAIL
+
+ [track.dir: IDL set to false]
+ expected: FAIL
+
+ [track.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [track.dir: IDL set to NaN]
+ expected: FAIL
+
+ [track.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [track.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [track.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [track.dir: IDL set to null]
+ expected: FAIL
+
+ [track.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [track.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [track.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [track.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [track.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [track.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [track.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [track.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [track.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [track.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [track.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [track.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [track.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [track.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [track.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [track.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [track.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [track.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [track.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [track.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [track.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [track.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [track.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [track.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [track.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [track.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [track.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [track.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [track.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [track.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [track.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [track.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [track.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [track.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [track.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [track.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [track.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [track.accessKey: IDL set to true]
+ expected: FAIL
+
+ [track.accessKey: IDL set to false]
+ expected: FAIL
+
+ [track.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [track.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [track.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [track.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [track.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [track.accessKey: IDL set to null]
+ expected: FAIL
+
+ [track.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [track.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [track.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [track.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [track.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [track.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [track.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [track.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [track.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [track.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [track.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [track.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [track.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [track.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [track.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [track.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [track.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [track.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [track.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [track.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [track.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [track.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [track.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [track.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [track.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [track.kind: setAttribute() to ""]
+ expected: FAIL
+
+ [track.kind: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [track.kind: setAttribute() to undefined]
+ expected: FAIL
+
+ [track.kind: setAttribute() to 7]
+ expected: FAIL
+
+ [track.kind: setAttribute() to 1.5]
+ expected: FAIL
+
+ [track.kind: setAttribute() to true]
+ expected: FAIL
+
+ [track.kind: setAttribute() to false]
+ expected: FAIL
+
+ [track.kind: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to NaN]
+ expected: FAIL
+
+ [track.kind: setAttribute() to Infinity]
+ expected: FAIL
+
+ [track.kind: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to null]
+ expected: FAIL
+
+ [track.kind: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "subtitles"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "xsubtitles"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "subtitles\\0"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "ubtitles"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "SUBTITLES"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "captions"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "xcaptions"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "captions\\0"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "aptions"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "CAPTIONS"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "descriptions"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "xdescriptions"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "descriptions\\0"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "escriptions"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "DESCRIPTIONS"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "chapters"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "xchapters"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "chapters\\0"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "hapters"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "CHAPTERS"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "metadata"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "xmetadata"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "metadata\\0"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "etadata"]
+ expected: FAIL
+
+ [track.kind: setAttribute() to "METADATA"]
+ expected: FAIL
+
+ [track.kind: IDL set to ""]
+ expected: FAIL
+
+ [track.kind: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [track.kind: IDL set to undefined]
+ expected: FAIL
+
+ [track.kind: IDL set to 7]
+ expected: FAIL
+
+ [track.kind: IDL set to 1.5]
+ expected: FAIL
+
+ [track.kind: IDL set to true]
+ expected: FAIL
+
+ [track.kind: IDL set to false]
+ expected: FAIL
+
+ [track.kind: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [track.kind: IDL set to NaN]
+ expected: FAIL
+
+ [track.kind: IDL set to Infinity]
+ expected: FAIL
+
+ [track.kind: IDL set to -Infinity]
+ expected: FAIL
+
+ [track.kind: IDL set to "\\0"]
+ expected: FAIL
+
+ [track.kind: IDL set to null]
+ expected: FAIL
+
+ [track.kind: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [track.kind: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [track.kind: IDL set to "subtitles"]
+ expected: FAIL
+
+ [track.kind: IDL set to "xsubtitles"]
+ expected: FAIL
+
+ [track.kind: IDL set to "subtitles\\0"]
+ expected: FAIL
+
+ [track.kind: IDL set to "ubtitles"]
+ expected: FAIL
+
+ [track.kind: IDL set to "SUBTITLES"]
+ expected: FAIL
+
+ [track.kind: IDL set to "captions"]
+ expected: FAIL
+
+ [track.kind: IDL set to "xcaptions"]
+ expected: FAIL
+
+ [track.kind: IDL set to "captions\\0"]
+ expected: FAIL
+
+ [track.kind: IDL set to "aptions"]
+ expected: FAIL
+
+ [track.kind: IDL set to "CAPTIONS"]
+ expected: FAIL
+
+ [track.kind: IDL set to "descriptions"]
+ expected: FAIL
+
+ [track.kind: IDL set to "xdescriptions"]
+ expected: FAIL
+
+ [track.kind: IDL set to "descriptions\\0"]
+ expected: FAIL
+
+ [track.kind: IDL set to "escriptions"]
+ expected: FAIL
+
+ [track.kind: IDL set to "DESCRIPTIONS"]
+ expected: FAIL
+
+ [track.kind: IDL set to "chapters"]
+ expected: FAIL
+
+ [track.kind: IDL set to "xchapters"]
+ expected: FAIL
+
+ [track.kind: IDL set to "chapters\\0"]
+ expected: FAIL
+
+ [track.kind: IDL set to "hapters"]
+ expected: FAIL
+
+ [track.kind: IDL set to "CHAPTERS"]
+ expected: FAIL
+
+ [track.kind: IDL set to "metadata"]
+ expected: FAIL
+
+ [track.kind: IDL set to "xmetadata"]
+ expected: FAIL
+
+ [track.kind: IDL set to "metadata\\0"]
+ expected: FAIL
+
+ [track.kind: IDL set to "etadata"]
+ expected: FAIL
+
+ [track.kind: IDL set to "METADATA"]
+ expected: FAIL
+
+ [track.src: setAttribute() to ""]
+ expected: FAIL
+
+ [track.src: setAttribute() to " foo "]
+ expected: FAIL
+
+ [track.src: setAttribute() to "http://site.example/"]
+ expected: FAIL
+
+ [track.src: setAttribute() to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [track.src: setAttribute() to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [track.src: setAttribute() to undefined]
+ expected: FAIL
+
+ [track.src: setAttribute() to 7]
+ expected: FAIL
+
+ [track.src: setAttribute() to 1.5]
+ expected: FAIL
+
+ [track.src: setAttribute() to true]
+ expected: FAIL
+
+ [track.src: setAttribute() to false]
+ expected: FAIL
+
+ [track.src: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [track.src: setAttribute() to NaN]
+ expected: FAIL
+
+ [track.src: setAttribute() to Infinity]
+ expected: FAIL
+
+ [track.src: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [track.src: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [track.src: setAttribute() to null]
+ expected: FAIL
+
+ [track.src: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [track.src: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [track.src: IDL set to ""]
+ expected: FAIL
+
+ [track.src: IDL set to " foo "]
+ expected: FAIL
+
+ [track.src: IDL set to "http://site.example/"]
+ expected: FAIL
+
+ [track.src: IDL set to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [track.src: IDL set to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [track.src: IDL set to undefined]
+ expected: FAIL
+
+ [track.src: IDL set to 7]
+ expected: FAIL
+
+ [track.src: IDL set to 1.5]
+ expected: FAIL
+
+ [track.src: IDL set to true]
+ expected: FAIL
+
+ [track.src: IDL set to false]
+ expected: FAIL
+
+ [track.src: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [track.src: IDL set to NaN]
+ expected: FAIL
+
+ [track.src: IDL set to Infinity]
+ expected: FAIL
+
+ [track.src: IDL set to -Infinity]
+ expected: FAIL
+
+ [track.src: IDL set to "\\0"]
+ expected: FAIL
+
+ [track.src: IDL set to null]
+ expected: FAIL
+
+ [track.src: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [track.src: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [track.srclang: setAttribute() to ""]
+ expected: FAIL
+
+ [track.srclang: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [track.srclang: setAttribute() to undefined]
+ expected: FAIL
+
+ [track.srclang: setAttribute() to 7]
+ expected: FAIL
+
+ [track.srclang: setAttribute() to 1.5]
+ expected: FAIL
+
+ [track.srclang: setAttribute() to true]
+ expected: FAIL
+
+ [track.srclang: setAttribute() to false]
+ expected: FAIL
+
+ [track.srclang: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [track.srclang: setAttribute() to NaN]
+ expected: FAIL
+
+ [track.srclang: setAttribute() to Infinity]
+ expected: FAIL
+
+ [track.srclang: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [track.srclang: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [track.srclang: setAttribute() to null]
+ expected: FAIL
+
+ [track.srclang: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [track.srclang: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [track.srclang: IDL set to ""]
+ expected: FAIL
+
+ [track.srclang: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [track.srclang: IDL set to undefined]
+ expected: FAIL
+
+ [track.srclang: IDL set to 7]
+ expected: FAIL
+
+ [track.srclang: IDL set to 1.5]
+ expected: FAIL
+
+ [track.srclang: IDL set to true]
+ expected: FAIL
+
+ [track.srclang: IDL set to false]
+ expected: FAIL
+
+ [track.srclang: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [track.srclang: IDL set to NaN]
+ expected: FAIL
+
+ [track.srclang: IDL set to Infinity]
+ expected: FAIL
+
+ [track.srclang: IDL set to -Infinity]
+ expected: FAIL
+
+ [track.srclang: IDL set to "\\0"]
+ expected: FAIL
+
+ [track.srclang: IDL set to null]
+ expected: FAIL
+
+ [track.srclang: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [track.srclang: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [track.label: setAttribute() to ""]
+ expected: FAIL
+
+ [track.label: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [track.label: setAttribute() to undefined]
+ expected: FAIL
+
+ [track.label: setAttribute() to 7]
+ expected: FAIL
+
+ [track.label: setAttribute() to 1.5]
+ expected: FAIL
+
+ [track.label: setAttribute() to true]
+ expected: FAIL
+
+ [track.label: setAttribute() to false]
+ expected: FAIL
+
+ [track.label: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [track.label: setAttribute() to NaN]
+ expected: FAIL
+
+ [track.label: setAttribute() to Infinity]
+ expected: FAIL
+
+ [track.label: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [track.label: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [track.label: setAttribute() to null]
+ expected: FAIL
+
+ [track.label: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [track.label: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [track.label: IDL set to ""]
+ expected: FAIL
+
+ [track.label: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [track.label: IDL set to undefined]
+ expected: FAIL
+
+ [track.label: IDL set to 7]
+ expected: FAIL
+
+ [track.label: IDL set to 1.5]
+ expected: FAIL
+
+ [track.label: IDL set to true]
+ expected: FAIL
+
+ [track.label: IDL set to false]
+ expected: FAIL
+
+ [track.label: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [track.label: IDL set to NaN]
+ expected: FAIL
+
+ [track.label: IDL set to Infinity]
+ expected: FAIL
+
+ [track.label: IDL set to -Infinity]
+ expected: FAIL
+
+ [track.label: IDL set to "\\0"]
+ expected: FAIL
+
+ [track.label: IDL set to null]
+ expected: FAIL
+
+ [track.label: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [track.label: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [track.default: setAttribute() to ""]
+ expected: FAIL
+
+ [track.default: setAttribute() to " foo "]
+ expected: FAIL
+
+ [track.default: setAttribute() to undefined]
+ expected: FAIL
+
+ [track.default: setAttribute() to null]
+ expected: FAIL
+
+ [track.default: setAttribute() to 7]
+ expected: FAIL
+
+ [track.default: setAttribute() to 1.5]
+ expected: FAIL
+
+ [track.default: setAttribute() to true]
+ expected: FAIL
+
+ [track.default: setAttribute() to false]
+ expected: FAIL
+
+ [track.default: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [track.default: setAttribute() to NaN]
+ expected: FAIL
+
+ [track.default: setAttribute() to Infinity]
+ expected: FAIL
+
+ [track.default: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [track.default: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [track.default: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [track.default: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [track.default: setAttribute() to "default"]
+ expected: FAIL
+
+ [track.default: IDL set to ""]
+ expected: FAIL
+
+ [track.default: IDL set to " foo "]
+ expected: FAIL
+
+ [track.default: IDL set to undefined]
+ expected: FAIL
+
+ [track.default: IDL set to null]
+ expected: FAIL
+
+ [track.default: IDL set to 7]
+ expected: FAIL
+
+ [track.default: IDL set to 1.5]
+ expected: FAIL
+
+ [track.default: IDL set to false]
+ expected: FAIL
+
+ [track.default: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [track.default: IDL set to NaN]
+ expected: FAIL
+
+ [track.default: IDL set to Infinity]
+ expected: FAIL
+
+ [track.default: IDL set to -Infinity]
+ expected: FAIL
+
+ [track.default: IDL set to "\\0"]
+ expected: FAIL
+
+ [track.default: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [track.default: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to true]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to false]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to null]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [canvas.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [canvas.dir: IDL set to ""]
+ expected: FAIL
+
+ [canvas.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [canvas.dir: IDL set to undefined]
+ expected: FAIL
+
+ [canvas.dir: IDL set to 7]
+ expected: FAIL
+
+ [canvas.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [canvas.dir: IDL set to true]
+ expected: FAIL
+
+ [canvas.dir: IDL set to false]
+ expected: FAIL
+
+ [canvas.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [canvas.dir: IDL set to NaN]
+ expected: FAIL
+
+ [canvas.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [canvas.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [canvas.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [canvas.dir: IDL set to null]
+ expected: FAIL
+
+ [canvas.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [canvas.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [canvas.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [canvas.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [canvas.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [canvas.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [canvas.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [canvas.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [canvas.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [canvas.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [canvas.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [canvas.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [canvas.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [canvas.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [canvas.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [canvas.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [canvas.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [canvas.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [canvas.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [canvas.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [canvas.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [canvas.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [canvas.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [canvas.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [canvas.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [canvas.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [canvas.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [canvas.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [canvas.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [canvas.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [canvas.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [canvas.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [canvas.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [canvas.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [canvas.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [canvas.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [canvas.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [canvas.accessKey: IDL set to true]
+ expected: FAIL
+
+ [canvas.accessKey: IDL set to false]
+ expected: FAIL
+
+ [canvas.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [canvas.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [canvas.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [canvas.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [canvas.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [canvas.accessKey: IDL set to null]
+ expected: FAIL
+
+ [canvas.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [canvas.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [canvas.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [canvas.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [canvas.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [canvas.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [canvas.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [canvas.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [canvas.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [canvas.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [canvas.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [canvas.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [canvas.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [canvas.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [canvas.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [canvas.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [canvas.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [canvas.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [canvas.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [canvas.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [canvas.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [canvas.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [canvas.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [canvas.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [canvas.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [map.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [map.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [map.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [map.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [map.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [map.dir: setAttribute() to true]
+ expected: FAIL
+
+ [map.dir: setAttribute() to false]
+ expected: FAIL
+
+ [map.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [map.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [map.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [map.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [map.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [map.dir: setAttribute() to null]
+ expected: FAIL
+
+ [map.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [map.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [map.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [map.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [map.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [map.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [map.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [map.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [map.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [map.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [map.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [map.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [map.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [map.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [map.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [map.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [map.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [map.dir: IDL set to ""]
+ expected: FAIL
+
+ [map.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [map.dir: IDL set to undefined]
+ expected: FAIL
+
+ [map.dir: IDL set to 7]
+ expected: FAIL
+
+ [map.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [map.dir: IDL set to true]
+ expected: FAIL
+
+ [map.dir: IDL set to false]
+ expected: FAIL
+
+ [map.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [map.dir: IDL set to NaN]
+ expected: FAIL
+
+ [map.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [map.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [map.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [map.dir: IDL set to null]
+ expected: FAIL
+
+ [map.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [map.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [map.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [map.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [map.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [map.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [map.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [map.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [map.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [map.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [map.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [map.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [map.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [map.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [map.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [map.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [map.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [map.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [map.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [map.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [map.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [map.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [map.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [map.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [map.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [map.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [map.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [map.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [map.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [map.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [map.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [map.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [map.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [map.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [map.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [map.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [map.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [map.accessKey: IDL set to true]
+ expected: FAIL
+
+ [map.accessKey: IDL set to false]
+ expected: FAIL
+
+ [map.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [map.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [map.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [map.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [map.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [map.accessKey: IDL set to null]
+ expected: FAIL
+
+ [map.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [map.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [map.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [map.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [map.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [map.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [map.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [map.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [map.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [map.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [map.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [map.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [map.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [map.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [map.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [map.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [map.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [map.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [map.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [map.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [map.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [map.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [map.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [map.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [map.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [map.name: setAttribute() to ""]
+ expected: FAIL
+
+ [map.name: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [map.name: setAttribute() to undefined]
+ expected: FAIL
+
+ [map.name: setAttribute() to 7]
+ expected: FAIL
+
+ [map.name: setAttribute() to 1.5]
+ expected: FAIL
+
+ [map.name: setAttribute() to true]
+ expected: FAIL
+
+ [map.name: setAttribute() to false]
+ expected: FAIL
+
+ [map.name: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [map.name: setAttribute() to NaN]
+ expected: FAIL
+
+ [map.name: setAttribute() to Infinity]
+ expected: FAIL
+
+ [map.name: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [map.name: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [map.name: setAttribute() to null]
+ expected: FAIL
+
+ [map.name: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [map.name: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [map.name: IDL set to ""]
+ expected: FAIL
+
+ [map.name: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [map.name: IDL set to undefined]
+ expected: FAIL
+
+ [map.name: IDL set to 7]
+ expected: FAIL
+
+ [map.name: IDL set to 1.5]
+ expected: FAIL
+
+ [map.name: IDL set to true]
+ expected: FAIL
+
+ [map.name: IDL set to false]
+ expected: FAIL
+
+ [map.name: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [map.name: IDL set to NaN]
+ expected: FAIL
+
+ [map.name: IDL set to Infinity]
+ expected: FAIL
+
+ [map.name: IDL set to -Infinity]
+ expected: FAIL
+
+ [map.name: IDL set to "\\0"]
+ expected: FAIL
+
+ [map.name: IDL set to null]
+ expected: FAIL
+
+ [map.name: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [map.name: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [area.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [area.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [area.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [area.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [area.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [area.dir: setAttribute() to true]
+ expected: FAIL
+
+ [area.dir: setAttribute() to false]
+ expected: FAIL
+
+ [area.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [area.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [area.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [area.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [area.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [area.dir: setAttribute() to null]
+ expected: FAIL
+
+ [area.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [area.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [area.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [area.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [area.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [area.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [area.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [area.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [area.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [area.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [area.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [area.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [area.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [area.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [area.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [area.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [area.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [area.dir: IDL set to ""]
+ expected: FAIL
+
+ [area.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [area.dir: IDL set to undefined]
+ expected: FAIL
+
+ [area.dir: IDL set to 7]
+ expected: FAIL
+
+ [area.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [area.dir: IDL set to true]
+ expected: FAIL
+
+ [area.dir: IDL set to false]
+ expected: FAIL
+
+ [area.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [area.dir: IDL set to NaN]
+ expected: FAIL
+
+ [area.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [area.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [area.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [area.dir: IDL set to null]
+ expected: FAIL
+
+ [area.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [area.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [area.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [area.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [area.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [area.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [area.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [area.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [area.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [area.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [area.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [area.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [area.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [area.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [area.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [area.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [area.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [area.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [area.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [area.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [area.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [area.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [area.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [area.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [area.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [area.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [area.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [area.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [area.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [area.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [area.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [area.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [area.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [area.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [area.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [area.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [area.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [area.accessKey: IDL set to true]
+ expected: FAIL
+
+ [area.accessKey: IDL set to false]
+ expected: FAIL
+
+ [area.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [area.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [area.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [area.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [area.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [area.accessKey: IDL set to null]
+ expected: FAIL
+
+ [area.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [area.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [area.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [area.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [area.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [area.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [area.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [area.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [area.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [area.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [area.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [area.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [area.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [area.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [area.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [area.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [area.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [area.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [area.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [area.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [area.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [area.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [area.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [area.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [area.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [area.alt: setAttribute() to ""]
+ expected: FAIL
+
+ [area.alt: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [area.alt: setAttribute() to undefined]
+ expected: FAIL
+
+ [area.alt: setAttribute() to 7]
+ expected: FAIL
+
+ [area.alt: setAttribute() to 1.5]
+ expected: FAIL
+
+ [area.alt: setAttribute() to true]
+ expected: FAIL
+
+ [area.alt: setAttribute() to false]
+ expected: FAIL
+
+ [area.alt: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [area.alt: setAttribute() to NaN]
+ expected: FAIL
+
+ [area.alt: setAttribute() to Infinity]
+ expected: FAIL
+
+ [area.alt: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [area.alt: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [area.alt: setAttribute() to null]
+ expected: FAIL
+
+ [area.alt: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [area.alt: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [area.alt: IDL set to ""]
+ expected: FAIL
+
+ [area.alt: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [area.alt: IDL set to undefined]
+ expected: FAIL
+
+ [area.alt: IDL set to 7]
+ expected: FAIL
+
+ [area.alt: IDL set to 1.5]
+ expected: FAIL
+
+ [area.alt: IDL set to true]
+ expected: FAIL
+
+ [area.alt: IDL set to false]
+ expected: FAIL
+
+ [area.alt: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [area.alt: IDL set to NaN]
+ expected: FAIL
+
+ [area.alt: IDL set to Infinity]
+ expected: FAIL
+
+ [area.alt: IDL set to -Infinity]
+ expected: FAIL
+
+ [area.alt: IDL set to "\\0"]
+ expected: FAIL
+
+ [area.alt: IDL set to null]
+ expected: FAIL
+
+ [area.alt: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [area.alt: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [area.coords: setAttribute() to ""]
+ expected: FAIL
+
+ [area.coords: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [area.coords: setAttribute() to undefined]
+ expected: FAIL
+
+ [area.coords: setAttribute() to 7]
+ expected: FAIL
+
+ [area.coords: setAttribute() to 1.5]
+ expected: FAIL
+
+ [area.coords: setAttribute() to true]
+ expected: FAIL
+
+ [area.coords: setAttribute() to false]
+ expected: FAIL
+
+ [area.coords: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [area.coords: setAttribute() to NaN]
+ expected: FAIL
+
+ [area.coords: setAttribute() to Infinity]
+ expected: FAIL
+
+ [area.coords: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [area.coords: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [area.coords: setAttribute() to null]
+ expected: FAIL
+
+ [area.coords: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [area.coords: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [area.coords: IDL set to ""]
+ expected: FAIL
+
+ [area.coords: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [area.coords: IDL set to undefined]
+ expected: FAIL
+
+ [area.coords: IDL set to 7]
+ expected: FAIL
+
+ [area.coords: IDL set to 1.5]
+ expected: FAIL
+
+ [area.coords: IDL set to true]
+ expected: FAIL
+
+ [area.coords: IDL set to false]
+ expected: FAIL
+
+ [area.coords: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [area.coords: IDL set to NaN]
+ expected: FAIL
+
+ [area.coords: IDL set to Infinity]
+ expected: FAIL
+
+ [area.coords: IDL set to -Infinity]
+ expected: FAIL
+
+ [area.coords: IDL set to "\\0"]
+ expected: FAIL
+
+ [area.coords: IDL set to null]
+ expected: FAIL
+
+ [area.coords: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [area.coords: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [area.shape: setAttribute() to ""]
+ expected: FAIL
+
+ [area.shape: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [area.shape: setAttribute() to undefined]
+ expected: FAIL
+
+ [area.shape: setAttribute() to 7]
+ expected: FAIL
+
+ [area.shape: setAttribute() to 1.5]
+ expected: FAIL
+
+ [area.shape: setAttribute() to true]
+ expected: FAIL
+
+ [area.shape: setAttribute() to false]
+ expected: FAIL
+
+ [area.shape: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [area.shape: setAttribute() to NaN]
+ expected: FAIL
+
+ [area.shape: setAttribute() to Infinity]
+ expected: FAIL
+
+ [area.shape: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [area.shape: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [area.shape: setAttribute() to null]
+ expected: FAIL
+
+ [area.shape: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [area.shape: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [area.shape: IDL set to ""]
+ expected: FAIL
+
+ [area.shape: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [area.shape: IDL set to undefined]
+ expected: FAIL
+
+ [area.shape: IDL set to 7]
+ expected: FAIL
+
+ [area.shape: IDL set to 1.5]
+ expected: FAIL
+
+ [area.shape: IDL set to true]
+ expected: FAIL
+
+ [area.shape: IDL set to false]
+ expected: FAIL
+
+ [area.shape: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [area.shape: IDL set to NaN]
+ expected: FAIL
+
+ [area.shape: IDL set to Infinity]
+ expected: FAIL
+
+ [area.shape: IDL set to -Infinity]
+ expected: FAIL
+
+ [area.shape: IDL set to "\\0"]
+ expected: FAIL
+
+ [area.shape: IDL set to null]
+ expected: FAIL
+
+ [area.shape: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [area.shape: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [area.target: setAttribute() to ""]
+ expected: FAIL
+
+ [area.target: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [area.target: setAttribute() to undefined]
+ expected: FAIL
+
+ [area.target: setAttribute() to 7]
+ expected: FAIL
+
+ [area.target: setAttribute() to 1.5]
+ expected: FAIL
+
+ [area.target: setAttribute() to true]
+ expected: FAIL
+
+ [area.target: setAttribute() to false]
+ expected: FAIL
+
+ [area.target: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [area.target: setAttribute() to NaN]
+ expected: FAIL
+
+ [area.target: setAttribute() to Infinity]
+ expected: FAIL
+
+ [area.target: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [area.target: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [area.target: setAttribute() to null]
+ expected: FAIL
+
+ [area.target: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [area.target: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [area.target: IDL set to ""]
+ expected: FAIL
+
+ [area.target: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [area.target: IDL set to undefined]
+ expected: FAIL
+
+ [area.target: IDL set to 7]
+ expected: FAIL
+
+ [area.target: IDL set to 1.5]
+ expected: FAIL
+
+ [area.target: IDL set to true]
+ expected: FAIL
+
+ [area.target: IDL set to false]
+ expected: FAIL
+
+ [area.target: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [area.target: IDL set to NaN]
+ expected: FAIL
+
+ [area.target: IDL set to Infinity]
+ expected: FAIL
+
+ [area.target: IDL set to -Infinity]
+ expected: FAIL
+
+ [area.target: IDL set to "\\0"]
+ expected: FAIL
+
+ [area.target: IDL set to null]
+ expected: FAIL
+
+ [area.target: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [area.target: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [area.download: setAttribute() to ""]
+ expected: FAIL
+
+ [area.download: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [area.download: setAttribute() to undefined]
+ expected: FAIL
+
+ [area.download: setAttribute() to 7]
+ expected: FAIL
+
+ [area.download: setAttribute() to 1.5]
+ expected: FAIL
+
+ [area.download: setAttribute() to true]
+ expected: FAIL
+
+ [area.download: setAttribute() to false]
+ expected: FAIL
+
+ [area.download: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [area.download: setAttribute() to NaN]
+ expected: FAIL
+
+ [area.download: setAttribute() to Infinity]
+ expected: FAIL
+
+ [area.download: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [area.download: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [area.download: setAttribute() to null]
+ expected: FAIL
+
+ [area.download: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [area.download: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [area.download: IDL set to ""]
+ expected: FAIL
+
+ [area.download: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [area.download: IDL set to undefined]
+ expected: FAIL
+
+ [area.download: IDL set to 7]
+ expected: FAIL
+
+ [area.download: IDL set to 1.5]
+ expected: FAIL
+
+ [area.download: IDL set to true]
+ expected: FAIL
+
+ [area.download: IDL set to false]
+ expected: FAIL
+
+ [area.download: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [area.download: IDL set to NaN]
+ expected: FAIL
+
+ [area.download: IDL set to Infinity]
+ expected: FAIL
+
+ [area.download: IDL set to -Infinity]
+ expected: FAIL
+
+ [area.download: IDL set to "\\0"]
+ expected: FAIL
+
+ [area.download: IDL set to null]
+ expected: FAIL
+
+ [area.download: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [area.download: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [area.ping: setAttribute() to ""]
+ expected: FAIL
+
+ [area.ping: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [area.ping: setAttribute() to undefined]
+ expected: FAIL
+
+ [area.ping: setAttribute() to 7]
+ expected: FAIL
+
+ [area.ping: setAttribute() to 1.5]
+ expected: FAIL
+
+ [area.ping: setAttribute() to true]
+ expected: FAIL
+
+ [area.ping: setAttribute() to false]
+ expected: FAIL
+
+ [area.ping: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [area.ping: setAttribute() to NaN]
+ expected: FAIL
+
+ [area.ping: setAttribute() to Infinity]
+ expected: FAIL
+
+ [area.ping: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [area.ping: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [area.ping: setAttribute() to null]
+ expected: FAIL
+
+ [area.ping: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [area.ping: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [area.ping: IDL set to ""]
+ expected: FAIL
+
+ [area.ping: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [area.ping: IDL set to undefined]
+ expected: FAIL
+
+ [area.ping: IDL set to 7]
+ expected: FAIL
+
+ [area.ping: IDL set to 1.5]
+ expected: FAIL
+
+ [area.ping: IDL set to true]
+ expected: FAIL
+
+ [area.ping: IDL set to false]
+ expected: FAIL
+
+ [area.ping: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [area.ping: IDL set to NaN]
+ expected: FAIL
+
+ [area.ping: IDL set to Infinity]
+ expected: FAIL
+
+ [area.ping: IDL set to -Infinity]
+ expected: FAIL
+
+ [area.ping: IDL set to "\\0"]
+ expected: FAIL
+
+ [area.ping: IDL set to null]
+ expected: FAIL
+
+ [area.ping: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [area.ping: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [area.rel: setAttribute() to ""]
+ expected: FAIL
+
+ [area.rel: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [area.rel: setAttribute() to undefined]
+ expected: FAIL
+
+ [area.rel: setAttribute() to 7]
+ expected: FAIL
+
+ [area.rel: setAttribute() to 1.5]
+ expected: FAIL
+
+ [area.rel: setAttribute() to true]
+ expected: FAIL
+
+ [area.rel: setAttribute() to false]
+ expected: FAIL
+
+ [area.rel: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [area.rel: setAttribute() to NaN]
+ expected: FAIL
+
+ [area.rel: setAttribute() to Infinity]
+ expected: FAIL
+
+ [area.rel: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [area.rel: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [area.rel: setAttribute() to null]
+ expected: FAIL
+
+ [area.rel: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [area.rel: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [area.rel: IDL set to ""]
+ expected: FAIL
+
+ [area.rel: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [area.rel: IDL set to undefined]
+ expected: FAIL
+
+ [area.rel: IDL set to 7]
+ expected: FAIL
+
+ [area.rel: IDL set to 1.5]
+ expected: FAIL
+
+ [area.rel: IDL set to true]
+ expected: FAIL
+
+ [area.rel: IDL set to false]
+ expected: FAIL
+
+ [area.rel: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [area.rel: IDL set to NaN]
+ expected: FAIL
+
+ [area.rel: IDL set to Infinity]
+ expected: FAIL
+
+ [area.rel: IDL set to -Infinity]
+ expected: FAIL
+
+ [area.rel: IDL set to "\\0"]
+ expected: FAIL
+
+ [area.rel: IDL set to null]
+ expected: FAIL
+
+ [area.rel: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [area.rel: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [area.href: setAttribute() to ""]
+ expected: FAIL
+
+ [area.href: setAttribute() to " foo "]
+ expected: FAIL
+
+ [area.href: setAttribute() to "http://site.example/"]
+ expected: FAIL
+
+ [area.href: setAttribute() to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [area.href: setAttribute() to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [area.href: setAttribute() to undefined]
+ expected: FAIL
+
+ [area.href: setAttribute() to 7]
+ expected: FAIL
+
+ [area.href: setAttribute() to 1.5]
+ expected: FAIL
+
+ [area.href: setAttribute() to true]
+ expected: FAIL
+
+ [area.href: setAttribute() to false]
+ expected: FAIL
+
+ [area.href: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [area.href: setAttribute() to NaN]
+ expected: FAIL
+
+ [area.href: setAttribute() to Infinity]
+ expected: FAIL
+
+ [area.href: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [area.href: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [area.href: setAttribute() to null]
+ expected: FAIL
+
+ [area.href: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [area.href: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [area.href: IDL set to ""]
+ expected: FAIL
+
+ [area.href: IDL set to " foo "]
+ expected: FAIL
+
+ [area.href: IDL set to "http://site.example/"]
+ expected: FAIL
+
+ [area.href: IDL set to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [area.href: IDL set to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [area.href: IDL set to undefined]
+ expected: FAIL
+
+ [area.href: IDL set to 7]
+ expected: FAIL
+
+ [area.href: IDL set to 1.5]
+ expected: FAIL
+
+ [area.href: IDL set to true]
+ expected: FAIL
+
+ [area.href: IDL set to false]
+ expected: FAIL
+
+ [area.href: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [area.href: IDL set to NaN]
+ expected: FAIL
+
+ [area.href: IDL set to Infinity]
+ expected: FAIL
+
+ [area.href: IDL set to -Infinity]
+ expected: FAIL
+
+ [area.href: IDL set to "\\0"]
+ expected: FAIL
+
+ [area.href: IDL set to null]
+ expected: FAIL
+
+ [area.href: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [area.href: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [area.noHref: setAttribute() to ""]
+ expected: FAIL
+
+ [area.noHref: setAttribute() to " foo "]
+ expected: FAIL
+
+ [area.noHref: setAttribute() to undefined]
+ expected: FAIL
+
+ [area.noHref: setAttribute() to null]
+ expected: FAIL
+
+ [area.noHref: setAttribute() to 7]
+ expected: FAIL
+
+ [area.noHref: setAttribute() to 1.5]
+ expected: FAIL
+
+ [area.noHref: setAttribute() to true]
+ expected: FAIL
+
+ [area.noHref: setAttribute() to false]
+ expected: FAIL
+
+ [area.noHref: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [area.noHref: setAttribute() to NaN]
+ expected: FAIL
+
+ [area.noHref: setAttribute() to Infinity]
+ expected: FAIL
+
+ [area.noHref: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [area.noHref: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [area.noHref: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [area.noHref: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [area.noHref: setAttribute() to "noHref"]
+ expected: FAIL
+
+ [area.noHref: IDL set to ""]
+ expected: FAIL
+
+ [area.noHref: IDL set to " foo "]
+ expected: FAIL
+
+ [area.noHref: IDL set to undefined]
+ expected: FAIL
+
+ [area.noHref: IDL set to null]
+ expected: FAIL
+
+ [area.noHref: IDL set to 7]
+ expected: FAIL
+
+ [area.noHref: IDL set to 1.5]
+ expected: FAIL
+
+ [area.noHref: IDL set to false]
+ expected: FAIL
+
+ [area.noHref: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [area.noHref: IDL set to NaN]
+ expected: FAIL
+
+ [area.noHref: IDL set to Infinity]
+ expected: FAIL
+
+ [area.noHref: IDL set to -Infinity]
+ expected: FAIL
+
+ [area.noHref: IDL set to "\\0"]
+ expected: FAIL
+
+ [area.noHref: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [area.noHref: IDL set to object "test-valueOf"]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/dom/reflection-forms.html.ini b/tests/wpt/metadata/html/dom/reflection-forms.html.ini
index e656f6a2570..2931b23a7a1 100644
--- a/tests/wpt/metadata/html/dom/reflection-forms.html.ini
+++ b/tests/wpt/metadata/html/dom/reflection-forms.html.ini
@@ -16347,3 +16347,7614 @@
[textarea.rows: IDL set to 0 should not throw]
expected: FAIL
+ [form.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [form.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [form.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [form.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [form.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [form.dir: setAttribute() to true]
+ expected: FAIL
+
+ [form.dir: setAttribute() to false]
+ expected: FAIL
+
+ [form.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [form.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [form.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [form.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [form.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [form.dir: setAttribute() to null]
+ expected: FAIL
+
+ [form.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [form.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [form.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [form.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [form.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [form.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [form.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [form.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [form.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [form.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [form.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [form.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [form.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [form.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [form.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [form.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [form.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [form.dir: IDL set to ""]
+ expected: FAIL
+
+ [form.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [form.dir: IDL set to undefined]
+ expected: FAIL
+
+ [form.dir: IDL set to 7]
+ expected: FAIL
+
+ [form.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [form.dir: IDL set to true]
+ expected: FAIL
+
+ [form.dir: IDL set to false]
+ expected: FAIL
+
+ [form.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [form.dir: IDL set to NaN]
+ expected: FAIL
+
+ [form.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [form.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [form.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [form.dir: IDL set to null]
+ expected: FAIL
+
+ [form.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [form.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [form.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [form.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [form.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [form.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [form.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [form.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [form.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [form.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [form.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [form.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [form.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [form.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [form.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [form.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [form.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [form.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [form.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [form.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [form.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [form.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [form.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [form.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [form.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [form.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [form.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [form.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [form.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [form.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [form.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [form.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [form.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [form.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [form.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [form.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [form.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [form.accessKey: IDL set to true]
+ expected: FAIL
+
+ [form.accessKey: IDL set to false]
+ expected: FAIL
+
+ [form.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [form.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [form.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [form.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [form.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [form.accessKey: IDL set to null]
+ expected: FAIL
+
+ [form.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [form.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [form.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [form.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [form.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [form.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [form.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [form.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [form.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [form.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [form.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [form.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [form.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [form.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [form.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [form.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [form.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [form.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [form.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [form.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [form.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [form.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [form.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [form.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [form.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to true]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to false]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to null]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [fieldset.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to ""]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to undefined]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to 7]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to true]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to false]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to NaN]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to null]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [fieldset.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [fieldset.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [fieldset.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [fieldset.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [fieldset.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [fieldset.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [fieldset.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [fieldset.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [fieldset.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [fieldset.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [fieldset.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [fieldset.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [fieldset.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [fieldset.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [fieldset.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [fieldset.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [fieldset.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [fieldset.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [fieldset.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [fieldset.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [fieldset.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [fieldset.accessKey: IDL set to true]
+ expected: FAIL
+
+ [fieldset.accessKey: IDL set to false]
+ expected: FAIL
+
+ [fieldset.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [fieldset.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [fieldset.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [fieldset.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [fieldset.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [fieldset.accessKey: IDL set to null]
+ expected: FAIL
+
+ [fieldset.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [fieldset.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [fieldset.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [fieldset.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [fieldset.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [fieldset.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [fieldset.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [fieldset.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [fieldset.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [fieldset.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [fieldset.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [fieldset.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [fieldset.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [fieldset.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [fieldset.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [fieldset.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [fieldset.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [fieldset.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [fieldset.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [fieldset.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [fieldset.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [fieldset.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [fieldset.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [fieldset.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [fieldset.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [fieldset.name: setAttribute() to ""]
+ expected: FAIL
+
+ [fieldset.name: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [fieldset.name: setAttribute() to undefined]
+ expected: FAIL
+
+ [fieldset.name: setAttribute() to 7]
+ expected: FAIL
+
+ [fieldset.name: setAttribute() to 1.5]
+ expected: FAIL
+
+ [fieldset.name: setAttribute() to true]
+ expected: FAIL
+
+ [fieldset.name: setAttribute() to false]
+ expected: FAIL
+
+ [fieldset.name: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [fieldset.name: setAttribute() to NaN]
+ expected: FAIL
+
+ [fieldset.name: setAttribute() to Infinity]
+ expected: FAIL
+
+ [fieldset.name: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [fieldset.name: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [fieldset.name: setAttribute() to null]
+ expected: FAIL
+
+ [fieldset.name: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [fieldset.name: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [fieldset.name: IDL set to ""]
+ expected: FAIL
+
+ [fieldset.name: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [fieldset.name: IDL set to undefined]
+ expected: FAIL
+
+ [fieldset.name: IDL set to 7]
+ expected: FAIL
+
+ [fieldset.name: IDL set to 1.5]
+ expected: FAIL
+
+ [fieldset.name: IDL set to true]
+ expected: FAIL
+
+ [fieldset.name: IDL set to false]
+ expected: FAIL
+
+ [fieldset.name: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [fieldset.name: IDL set to NaN]
+ expected: FAIL
+
+ [fieldset.name: IDL set to Infinity]
+ expected: FAIL
+
+ [fieldset.name: IDL set to -Infinity]
+ expected: FAIL
+
+ [fieldset.name: IDL set to "\\0"]
+ expected: FAIL
+
+ [fieldset.name: IDL set to null]
+ expected: FAIL
+
+ [fieldset.name: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [fieldset.name: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to true]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to false]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to null]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [legend.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [legend.dir: IDL set to ""]
+ expected: FAIL
+
+ [legend.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [legend.dir: IDL set to undefined]
+ expected: FAIL
+
+ [legend.dir: IDL set to 7]
+ expected: FAIL
+
+ [legend.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [legend.dir: IDL set to true]
+ expected: FAIL
+
+ [legend.dir: IDL set to false]
+ expected: FAIL
+
+ [legend.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [legend.dir: IDL set to NaN]
+ expected: FAIL
+
+ [legend.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [legend.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [legend.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [legend.dir: IDL set to null]
+ expected: FAIL
+
+ [legend.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [legend.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [legend.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [legend.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [legend.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [legend.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [legend.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [legend.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [legend.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [legend.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [legend.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [legend.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [legend.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [legend.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [legend.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [legend.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [legend.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [legend.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [legend.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [legend.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [legend.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [legend.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [legend.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [legend.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [legend.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [legend.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [legend.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [legend.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [legend.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [legend.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [legend.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [legend.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [legend.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [legend.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [legend.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [legend.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [legend.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [legend.accessKey: IDL set to true]
+ expected: FAIL
+
+ [legend.accessKey: IDL set to false]
+ expected: FAIL
+
+ [legend.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [legend.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [legend.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [legend.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [legend.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [legend.accessKey: IDL set to null]
+ expected: FAIL
+
+ [legend.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [legend.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [legend.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [legend.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [legend.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [legend.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [legend.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [legend.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [legend.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [legend.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [legend.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [legend.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [legend.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [legend.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [legend.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [legend.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [legend.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [legend.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [legend.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [legend.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [legend.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [legend.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [legend.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [legend.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [legend.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [legend.align: setAttribute() to ""]
+ expected: FAIL
+
+ [legend.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [legend.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [legend.align: setAttribute() to 7]
+ expected: FAIL
+
+ [legend.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [legend.align: setAttribute() to true]
+ expected: FAIL
+
+ [legend.align: setAttribute() to false]
+ expected: FAIL
+
+ [legend.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [legend.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [legend.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [legend.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [legend.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [legend.align: setAttribute() to null]
+ expected: FAIL
+
+ [legend.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [legend.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [legend.align: IDL set to ""]
+ expected: FAIL
+
+ [legend.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [legend.align: IDL set to undefined]
+ expected: FAIL
+
+ [legend.align: IDL set to 7]
+ expected: FAIL
+
+ [legend.align: IDL set to 1.5]
+ expected: FAIL
+
+ [legend.align: IDL set to true]
+ expected: FAIL
+
+ [legend.align: IDL set to false]
+ expected: FAIL
+
+ [legend.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [legend.align: IDL set to NaN]
+ expected: FAIL
+
+ [legend.align: IDL set to Infinity]
+ expected: FAIL
+
+ [legend.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [legend.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [legend.align: IDL set to null]
+ expected: FAIL
+
+ [legend.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [legend.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [label.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [label.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [label.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [label.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [label.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [label.dir: setAttribute() to true]
+ expected: FAIL
+
+ [label.dir: setAttribute() to false]
+ expected: FAIL
+
+ [label.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [label.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [label.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [label.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [label.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [label.dir: setAttribute() to null]
+ expected: FAIL
+
+ [label.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [label.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [label.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [label.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [label.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [label.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [label.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [label.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [label.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [label.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [label.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [label.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [label.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [label.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [label.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [label.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [label.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [label.dir: IDL set to ""]
+ expected: FAIL
+
+ [label.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [label.dir: IDL set to undefined]
+ expected: FAIL
+
+ [label.dir: IDL set to 7]
+ expected: FAIL
+
+ [label.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [label.dir: IDL set to true]
+ expected: FAIL
+
+ [label.dir: IDL set to false]
+ expected: FAIL
+
+ [label.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [label.dir: IDL set to NaN]
+ expected: FAIL
+
+ [label.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [label.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [label.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [label.dir: IDL set to null]
+ expected: FAIL
+
+ [label.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [label.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [label.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [label.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [label.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [label.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [label.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [label.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [label.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [label.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [label.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [label.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [label.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [label.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [label.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [label.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [label.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [label.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [label.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [label.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [label.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [label.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [label.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [label.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [label.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [label.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [label.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [label.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [label.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [label.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [label.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [label.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [label.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [label.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [label.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [label.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [label.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [label.accessKey: IDL set to true]
+ expected: FAIL
+
+ [label.accessKey: IDL set to false]
+ expected: FAIL
+
+ [label.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [label.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [label.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [label.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [label.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [label.accessKey: IDL set to null]
+ expected: FAIL
+
+ [label.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [label.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [label.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [label.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [label.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [label.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [label.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [label.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [label.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [label.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [label.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [label.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [label.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [label.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [label.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [label.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [label.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [label.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [label.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [label.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [label.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [label.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [label.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [label.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [label.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [input.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [input.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [input.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [input.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [input.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [input.dir: setAttribute() to true]
+ expected: FAIL
+
+ [input.dir: setAttribute() to false]
+ expected: FAIL
+
+ [input.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [input.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [input.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [input.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [input.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [input.dir: setAttribute() to null]
+ expected: FAIL
+
+ [input.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [input.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [input.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [input.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [input.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [input.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [input.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [input.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [input.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [input.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [input.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [input.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [input.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [input.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [input.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [input.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [input.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [input.dir: IDL set to ""]
+ expected: FAIL
+
+ [input.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [input.dir: IDL set to undefined]
+ expected: FAIL
+
+ [input.dir: IDL set to 7]
+ expected: FAIL
+
+ [input.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [input.dir: IDL set to true]
+ expected: FAIL
+
+ [input.dir: IDL set to false]
+ expected: FAIL
+
+ [input.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [input.dir: IDL set to NaN]
+ expected: FAIL
+
+ [input.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [input.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [input.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [input.dir: IDL set to null]
+ expected: FAIL
+
+ [input.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [input.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [input.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [input.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [input.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [input.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [input.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [input.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [input.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [input.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [input.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [input.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [input.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [input.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [input.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [input.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [input.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [input.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [input.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [input.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [input.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [input.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [input.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [input.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [input.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [input.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [input.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [input.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [input.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [input.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [input.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [input.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [input.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [input.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [input.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [input.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [input.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [input.accessKey: IDL set to true]
+ expected: FAIL
+
+ [input.accessKey: IDL set to false]
+ expected: FAIL
+
+ [input.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [input.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [input.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [input.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [input.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [input.accessKey: IDL set to null]
+ expected: FAIL
+
+ [input.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [input.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [input.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [input.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [input.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [input.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [input.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [input.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [input.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [input.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [input.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [input.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [input.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [input.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [input.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [input.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [input.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [input.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [input.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [input.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [input.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [input.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [input.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [input.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [input.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [input.autofocus: setAttribute() to ""]
+ expected: FAIL
+
+ [input.autofocus: setAttribute() to " foo "]
+ expected: FAIL
+
+ [input.autofocus: setAttribute() to undefined]
+ expected: FAIL
+
+ [input.autofocus: setAttribute() to null]
+ expected: FAIL
+
+ [input.autofocus: setAttribute() to 7]
+ expected: FAIL
+
+ [input.autofocus: setAttribute() to 1.5]
+ expected: FAIL
+
+ [input.autofocus: setAttribute() to true]
+ expected: FAIL
+
+ [input.autofocus: setAttribute() to false]
+ expected: FAIL
+
+ [input.autofocus: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [input.autofocus: setAttribute() to NaN]
+ expected: FAIL
+
+ [input.autofocus: setAttribute() to Infinity]
+ expected: FAIL
+
+ [input.autofocus: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [input.autofocus: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [input.autofocus: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [input.autofocus: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [input.autofocus: setAttribute() to "autofocus"]
+ expected: FAIL
+
+ [input.autofocus: IDL set to ""]
+ expected: FAIL
+
+ [input.autofocus: IDL set to " foo "]
+ expected: FAIL
+
+ [input.autofocus: IDL set to undefined]
+ expected: FAIL
+
+ [input.autofocus: IDL set to null]
+ expected: FAIL
+
+ [input.autofocus: IDL set to 7]
+ expected: FAIL
+
+ [input.autofocus: IDL set to 1.5]
+ expected: FAIL
+
+ [input.autofocus: IDL set to false]
+ expected: FAIL
+
+ [input.autofocus: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [input.autofocus: IDL set to NaN]
+ expected: FAIL
+
+ [input.autofocus: IDL set to Infinity]
+ expected: FAIL
+
+ [input.autofocus: IDL set to -Infinity]
+ expected: FAIL
+
+ [input.autofocus: IDL set to "\\0"]
+ expected: FAIL
+
+ [input.autofocus: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [input.autofocus: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to ""]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to undefined]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to 7]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to 1.5]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to true]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to false]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to NaN]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to Infinity]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to null]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "verbatim"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "xverbatim"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "verbatim\\0"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "erbatim"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "VERBATIM"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "latin"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "xlatin"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "latin\\0"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "atin"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "LATIN"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "latin-name"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "xlatin-name"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "latin-name\\0"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "atin-name"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "LATIN-NAME"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "latin-prose"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "xlatin-prose"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "latin-prose\\0"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "atin-prose"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "LATIN-PROSE"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "full-width-latin"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "xfull-width-latin"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "full-width-latin\\0"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "ull-width-latin"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "FULL-WIDTH-LATIN"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "kana"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "xkana"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "kana\\0"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "ana"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "KANA"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "katakana"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "xkatakana"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "katakana\\0"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "atakana"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "KATAKANA"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "numeric"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "xnumeric"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "numeric\\0"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "umeric"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "NUMERIC"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "tel"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "xtel"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "tel\\0"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "el"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "TEL"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "email"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "xemail"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "email\\0"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "mail"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "EMAIL"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "url"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "xurl"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "url\\0"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "rl"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "URL"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to ""]
+ expected: FAIL
+
+ [input.inputMode: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [input.inputMode: IDL set to undefined]
+ expected: FAIL
+
+ [input.inputMode: IDL set to 7]
+ expected: FAIL
+
+ [input.inputMode: IDL set to 1.5]
+ expected: FAIL
+
+ [input.inputMode: IDL set to true]
+ expected: FAIL
+
+ [input.inputMode: IDL set to false]
+ expected: FAIL
+
+ [input.inputMode: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to NaN]
+ expected: FAIL
+
+ [input.inputMode: IDL set to Infinity]
+ expected: FAIL
+
+ [input.inputMode: IDL set to -Infinity]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "\\0"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to null]
+ expected: FAIL
+
+ [input.inputMode: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "verbatim"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "xverbatim"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "verbatim\\0"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "erbatim"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "VERBATIM"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "latin"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "xlatin"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "latin\\0"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "atin"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "LATIN"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "latin-name"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "xlatin-name"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "latin-name\\0"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "atin-name"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "LATIN-NAME"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "latin-prose"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "xlatin-prose"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "latin-prose\\0"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "atin-prose"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "LATIN-PROSE"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "full-width-latin"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "xfull-width-latin"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "full-width-latin\\0"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "ull-width-latin"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "FULL-WIDTH-LATIN"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "kana"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "xkana"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "kana\\0"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "ana"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "KANA"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "katakana"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "xkatakana"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "katakana\\0"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "atakana"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "KATAKANA"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "numeric"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "xnumeric"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "numeric\\0"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "umeric"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "NUMERIC"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "tel"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "xtel"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "tel\\0"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "el"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "TEL"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "email"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "xemail"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "email\\0"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "mail"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "EMAIL"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "url"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "xurl"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "url\\0"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "rl"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "URL"]
+ expected: FAIL
+
+ [input.align: setAttribute() to ""]
+ expected: FAIL
+
+ [input.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [input.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [input.align: setAttribute() to 7]
+ expected: FAIL
+
+ [input.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [input.align: setAttribute() to true]
+ expected: FAIL
+
+ [input.align: setAttribute() to false]
+ expected: FAIL
+
+ [input.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [input.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [input.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [input.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [input.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [input.align: setAttribute() to null]
+ expected: FAIL
+
+ [input.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [input.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [input.align: IDL set to ""]
+ expected: FAIL
+
+ [input.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [input.align: IDL set to undefined]
+ expected: FAIL
+
+ [input.align: IDL set to 7]
+ expected: FAIL
+
+ [input.align: IDL set to 1.5]
+ expected: FAIL
+
+ [input.align: IDL set to true]
+ expected: FAIL
+
+ [input.align: IDL set to false]
+ expected: FAIL
+
+ [input.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [input.align: IDL set to NaN]
+ expected: FAIL
+
+ [input.align: IDL set to Infinity]
+ expected: FAIL
+
+ [input.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [input.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [input.align: IDL set to null]
+ expected: FAIL
+
+ [input.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [input.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [input.useMap: setAttribute() to ""]
+ expected: FAIL
+
+ [input.useMap: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [input.useMap: setAttribute() to undefined]
+ expected: FAIL
+
+ [input.useMap: setAttribute() to 7]
+ expected: FAIL
+
+ [input.useMap: setAttribute() to 1.5]
+ expected: FAIL
+
+ [input.useMap: setAttribute() to true]
+ expected: FAIL
+
+ [input.useMap: setAttribute() to false]
+ expected: FAIL
+
+ [input.useMap: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [input.useMap: setAttribute() to NaN]
+ expected: FAIL
+
+ [input.useMap: setAttribute() to Infinity]
+ expected: FAIL
+
+ [input.useMap: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [input.useMap: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [input.useMap: setAttribute() to null]
+ expected: FAIL
+
+ [input.useMap: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [input.useMap: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [input.useMap: IDL set to ""]
+ expected: FAIL
+
+ [input.useMap: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [input.useMap: IDL set to undefined]
+ expected: FAIL
+
+ [input.useMap: IDL set to 7]
+ expected: FAIL
+
+ [input.useMap: IDL set to 1.5]
+ expected: FAIL
+
+ [input.useMap: IDL set to true]
+ expected: FAIL
+
+ [input.useMap: IDL set to false]
+ expected: FAIL
+
+ [input.useMap: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [input.useMap: IDL set to NaN]
+ expected: FAIL
+
+ [input.useMap: IDL set to Infinity]
+ expected: FAIL
+
+ [input.useMap: IDL set to -Infinity]
+ expected: FAIL
+
+ [input.useMap: IDL set to "\\0"]
+ expected: FAIL
+
+ [input.useMap: IDL set to null]
+ expected: FAIL
+
+ [input.useMap: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [input.useMap: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [button.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [button.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [button.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [button.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [button.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [button.dir: setAttribute() to true]
+ expected: FAIL
+
+ [button.dir: setAttribute() to false]
+ expected: FAIL
+
+ [button.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [button.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [button.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [button.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [button.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [button.dir: setAttribute() to null]
+ expected: FAIL
+
+ [button.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [button.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [button.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [button.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [button.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [button.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [button.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [button.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [button.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [button.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [button.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [button.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [button.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [button.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [button.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [button.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [button.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [button.dir: IDL set to ""]
+ expected: FAIL
+
+ [button.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [button.dir: IDL set to undefined]
+ expected: FAIL
+
+ [button.dir: IDL set to 7]
+ expected: FAIL
+
+ [button.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [button.dir: IDL set to true]
+ expected: FAIL
+
+ [button.dir: IDL set to false]
+ expected: FAIL
+
+ [button.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [button.dir: IDL set to NaN]
+ expected: FAIL
+
+ [button.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [button.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [button.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [button.dir: IDL set to null]
+ expected: FAIL
+
+ [button.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [button.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [button.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [button.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [button.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [button.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [button.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [button.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [button.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [button.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [button.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [button.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [button.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [button.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [button.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [button.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [button.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [button.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [button.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [button.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [button.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [button.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [button.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [button.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [button.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [button.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [button.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [button.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [button.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [button.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [button.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [button.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [button.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [button.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [button.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [button.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [button.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [button.accessKey: IDL set to true]
+ expected: FAIL
+
+ [button.accessKey: IDL set to false]
+ expected: FAIL
+
+ [button.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [button.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [button.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [button.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [button.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [button.accessKey: IDL set to null]
+ expected: FAIL
+
+ [button.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [button.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [button.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [button.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [button.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [button.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [button.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [button.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [button.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [button.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [button.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [button.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [button.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [button.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [button.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [button.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [button.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [button.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [button.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [button.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [button.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [button.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [button.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [button.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [button.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [button.autofocus: setAttribute() to ""]
+ expected: FAIL
+
+ [button.autofocus: setAttribute() to " foo "]
+ expected: FAIL
+
+ [button.autofocus: setAttribute() to undefined]
+ expected: FAIL
+
+ [button.autofocus: setAttribute() to null]
+ expected: FAIL
+
+ [button.autofocus: setAttribute() to 7]
+ expected: FAIL
+
+ [button.autofocus: setAttribute() to 1.5]
+ expected: FAIL
+
+ [button.autofocus: setAttribute() to true]
+ expected: FAIL
+
+ [button.autofocus: setAttribute() to false]
+ expected: FAIL
+
+ [button.autofocus: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [button.autofocus: setAttribute() to NaN]
+ expected: FAIL
+
+ [button.autofocus: setAttribute() to Infinity]
+ expected: FAIL
+
+ [button.autofocus: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [button.autofocus: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [button.autofocus: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [button.autofocus: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [button.autofocus: setAttribute() to "autofocus"]
+ expected: FAIL
+
+ [button.autofocus: IDL set to ""]
+ expected: FAIL
+
+ [button.autofocus: IDL set to " foo "]
+ expected: FAIL
+
+ [button.autofocus: IDL set to undefined]
+ expected: FAIL
+
+ [button.autofocus: IDL set to null]
+ expected: FAIL
+
+ [button.autofocus: IDL set to 7]
+ expected: FAIL
+
+ [button.autofocus: IDL set to 1.5]
+ expected: FAIL
+
+ [button.autofocus: IDL set to false]
+ expected: FAIL
+
+ [button.autofocus: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [button.autofocus: IDL set to NaN]
+ expected: FAIL
+
+ [button.autofocus: IDL set to Infinity]
+ expected: FAIL
+
+ [button.autofocus: IDL set to -Infinity]
+ expected: FAIL
+
+ [button.autofocus: IDL set to "\\0"]
+ expected: FAIL
+
+ [button.autofocus: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [button.autofocus: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [select.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [select.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [select.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [select.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [select.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [select.dir: setAttribute() to true]
+ expected: FAIL
+
+ [select.dir: setAttribute() to false]
+ expected: FAIL
+
+ [select.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [select.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [select.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [select.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [select.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [select.dir: setAttribute() to null]
+ expected: FAIL
+
+ [select.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [select.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [select.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [select.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [select.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [select.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [select.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [select.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [select.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [select.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [select.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [select.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [select.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [select.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [select.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [select.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [select.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [select.dir: IDL set to ""]
+ expected: FAIL
+
+ [select.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [select.dir: IDL set to undefined]
+ expected: FAIL
+
+ [select.dir: IDL set to 7]
+ expected: FAIL
+
+ [select.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [select.dir: IDL set to true]
+ expected: FAIL
+
+ [select.dir: IDL set to false]
+ expected: FAIL
+
+ [select.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [select.dir: IDL set to NaN]
+ expected: FAIL
+
+ [select.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [select.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [select.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [select.dir: IDL set to null]
+ expected: FAIL
+
+ [select.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [select.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [select.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [select.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [select.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [select.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [select.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [select.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [select.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [select.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [select.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [select.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [select.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [select.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [select.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [select.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [select.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [select.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [select.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [select.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [select.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [select.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [select.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [select.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [select.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [select.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [select.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [select.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [select.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [select.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [select.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [select.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [select.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [select.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [select.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [select.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [select.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [select.accessKey: IDL set to true]
+ expected: FAIL
+
+ [select.accessKey: IDL set to false]
+ expected: FAIL
+
+ [select.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [select.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [select.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [select.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [select.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [select.accessKey: IDL set to null]
+ expected: FAIL
+
+ [select.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [select.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [select.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [select.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [select.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [select.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [select.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [select.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [select.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [select.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [select.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [select.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [select.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [select.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [select.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [select.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [select.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [select.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [select.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [select.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [select.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [select.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [select.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [select.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [select.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [select.autofocus: setAttribute() to ""]
+ expected: FAIL
+
+ [select.autofocus: setAttribute() to " foo "]
+ expected: FAIL
+
+ [select.autofocus: setAttribute() to undefined]
+ expected: FAIL
+
+ [select.autofocus: setAttribute() to null]
+ expected: FAIL
+
+ [select.autofocus: setAttribute() to 7]
+ expected: FAIL
+
+ [select.autofocus: setAttribute() to 1.5]
+ expected: FAIL
+
+ [select.autofocus: setAttribute() to true]
+ expected: FAIL
+
+ [select.autofocus: setAttribute() to false]
+ expected: FAIL
+
+ [select.autofocus: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [select.autofocus: setAttribute() to NaN]
+ expected: FAIL
+
+ [select.autofocus: setAttribute() to Infinity]
+ expected: FAIL
+
+ [select.autofocus: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [select.autofocus: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [select.autofocus: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [select.autofocus: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [select.autofocus: setAttribute() to "autofocus"]
+ expected: FAIL
+
+ [select.autofocus: IDL set to ""]
+ expected: FAIL
+
+ [select.autofocus: IDL set to " foo "]
+ expected: FAIL
+
+ [select.autofocus: IDL set to undefined]
+ expected: FAIL
+
+ [select.autofocus: IDL set to null]
+ expected: FAIL
+
+ [select.autofocus: IDL set to 7]
+ expected: FAIL
+
+ [select.autofocus: IDL set to 1.5]
+ expected: FAIL
+
+ [select.autofocus: IDL set to false]
+ expected: FAIL
+
+ [select.autofocus: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [select.autofocus: IDL set to NaN]
+ expected: FAIL
+
+ [select.autofocus: IDL set to Infinity]
+ expected: FAIL
+
+ [select.autofocus: IDL set to -Infinity]
+ expected: FAIL
+
+ [select.autofocus: IDL set to "\\0"]
+ expected: FAIL
+
+ [select.autofocus: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [select.autofocus: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [select.required: setAttribute() to ""]
+ expected: FAIL
+
+ [select.required: setAttribute() to " foo "]
+ expected: FAIL
+
+ [select.required: setAttribute() to undefined]
+ expected: FAIL
+
+ [select.required: setAttribute() to null]
+ expected: FAIL
+
+ [select.required: setAttribute() to 7]
+ expected: FAIL
+
+ [select.required: setAttribute() to 1.5]
+ expected: FAIL
+
+ [select.required: setAttribute() to true]
+ expected: FAIL
+
+ [select.required: setAttribute() to false]
+ expected: FAIL
+
+ [select.required: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [select.required: setAttribute() to NaN]
+ expected: FAIL
+
+ [select.required: setAttribute() to Infinity]
+ expected: FAIL
+
+ [select.required: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [select.required: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [select.required: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [select.required: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [select.required: setAttribute() to "required"]
+ expected: FAIL
+
+ [select.required: IDL set to ""]
+ expected: FAIL
+
+ [select.required: IDL set to " foo "]
+ expected: FAIL
+
+ [select.required: IDL set to undefined]
+ expected: FAIL
+
+ [select.required: IDL set to null]
+ expected: FAIL
+
+ [select.required: IDL set to 7]
+ expected: FAIL
+
+ [select.required: IDL set to 1.5]
+ expected: FAIL
+
+ [select.required: IDL set to false]
+ expected: FAIL
+
+ [select.required: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [select.required: IDL set to NaN]
+ expected: FAIL
+
+ [select.required: IDL set to Infinity]
+ expected: FAIL
+
+ [select.required: IDL set to -Infinity]
+ expected: FAIL
+
+ [select.required: IDL set to "\\0"]
+ expected: FAIL
+
+ [select.required: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [select.required: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to true]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to false]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to null]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [datalist.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [datalist.dir: IDL set to ""]
+ expected: FAIL
+
+ [datalist.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [datalist.dir: IDL set to undefined]
+ expected: FAIL
+
+ [datalist.dir: IDL set to 7]
+ expected: FAIL
+
+ [datalist.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [datalist.dir: IDL set to true]
+ expected: FAIL
+
+ [datalist.dir: IDL set to false]
+ expected: FAIL
+
+ [datalist.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [datalist.dir: IDL set to NaN]
+ expected: FAIL
+
+ [datalist.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [datalist.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [datalist.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [datalist.dir: IDL set to null]
+ expected: FAIL
+
+ [datalist.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [datalist.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [datalist.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [datalist.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [datalist.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [datalist.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [datalist.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [datalist.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [datalist.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [datalist.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [datalist.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [datalist.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [datalist.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [datalist.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [datalist.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [datalist.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [datalist.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [datalist.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [datalist.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [datalist.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [datalist.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [datalist.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [datalist.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [datalist.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [datalist.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [datalist.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [datalist.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [datalist.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [datalist.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [datalist.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [datalist.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [datalist.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [datalist.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [datalist.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [datalist.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [datalist.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [datalist.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [datalist.accessKey: IDL set to true]
+ expected: FAIL
+
+ [datalist.accessKey: IDL set to false]
+ expected: FAIL
+
+ [datalist.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [datalist.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [datalist.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [datalist.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [datalist.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [datalist.accessKey: IDL set to null]
+ expected: FAIL
+
+ [datalist.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [datalist.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [datalist.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [datalist.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [datalist.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [datalist.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [datalist.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [datalist.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [datalist.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [datalist.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [datalist.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [datalist.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [datalist.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [datalist.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [datalist.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [datalist.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [datalist.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [datalist.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [datalist.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [datalist.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [datalist.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [datalist.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [datalist.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [datalist.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [datalist.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to true]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to false]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to null]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [optgroup.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to ""]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to undefined]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to 7]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to true]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to false]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to NaN]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to null]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [optgroup.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [optgroup.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [optgroup.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [optgroup.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [optgroup.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [optgroup.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [optgroup.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [optgroup.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [optgroup.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [optgroup.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [optgroup.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [optgroup.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [optgroup.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [optgroup.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [optgroup.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [optgroup.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [optgroup.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [optgroup.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [optgroup.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [optgroup.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [optgroup.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [optgroup.accessKey: IDL set to true]
+ expected: FAIL
+
+ [optgroup.accessKey: IDL set to false]
+ expected: FAIL
+
+ [optgroup.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [optgroup.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [optgroup.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [optgroup.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [optgroup.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [optgroup.accessKey: IDL set to null]
+ expected: FAIL
+
+ [optgroup.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [optgroup.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [optgroup.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [optgroup.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [optgroup.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [optgroup.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [optgroup.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [optgroup.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [optgroup.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [optgroup.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [optgroup.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [optgroup.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [optgroup.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [optgroup.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [optgroup.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [optgroup.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [optgroup.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [optgroup.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [optgroup.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [optgroup.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [optgroup.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [optgroup.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [optgroup.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [optgroup.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [optgroup.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [optgroup.label: setAttribute() to ""]
+ expected: FAIL
+
+ [optgroup.label: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [optgroup.label: setAttribute() to undefined]
+ expected: FAIL
+
+ [optgroup.label: setAttribute() to 7]
+ expected: FAIL
+
+ [optgroup.label: setAttribute() to 1.5]
+ expected: FAIL
+
+ [optgroup.label: setAttribute() to true]
+ expected: FAIL
+
+ [optgroup.label: setAttribute() to false]
+ expected: FAIL
+
+ [optgroup.label: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [optgroup.label: setAttribute() to NaN]
+ expected: FAIL
+
+ [optgroup.label: setAttribute() to Infinity]
+ expected: FAIL
+
+ [optgroup.label: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [optgroup.label: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [optgroup.label: setAttribute() to null]
+ expected: FAIL
+
+ [optgroup.label: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [optgroup.label: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [optgroup.label: IDL set to ""]
+ expected: FAIL
+
+ [optgroup.label: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [optgroup.label: IDL set to undefined]
+ expected: FAIL
+
+ [optgroup.label: IDL set to 7]
+ expected: FAIL
+
+ [optgroup.label: IDL set to 1.5]
+ expected: FAIL
+
+ [optgroup.label: IDL set to true]
+ expected: FAIL
+
+ [optgroup.label: IDL set to false]
+ expected: FAIL
+
+ [optgroup.label: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [optgroup.label: IDL set to NaN]
+ expected: FAIL
+
+ [optgroup.label: IDL set to Infinity]
+ expected: FAIL
+
+ [optgroup.label: IDL set to -Infinity]
+ expected: FAIL
+
+ [optgroup.label: IDL set to "\\0"]
+ expected: FAIL
+
+ [optgroup.label: IDL set to null]
+ expected: FAIL
+
+ [optgroup.label: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [optgroup.label: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [option.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [option.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [option.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [option.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [option.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [option.dir: setAttribute() to true]
+ expected: FAIL
+
+ [option.dir: setAttribute() to false]
+ expected: FAIL
+
+ [option.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [option.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [option.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [option.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [option.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [option.dir: setAttribute() to null]
+ expected: FAIL
+
+ [option.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [option.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [option.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [option.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [option.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [option.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [option.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [option.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [option.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [option.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [option.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [option.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [option.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [option.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [option.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [option.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [option.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [option.dir: IDL set to ""]
+ expected: FAIL
+
+ [option.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [option.dir: IDL set to undefined]
+ expected: FAIL
+
+ [option.dir: IDL set to 7]
+ expected: FAIL
+
+ [option.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [option.dir: IDL set to true]
+ expected: FAIL
+
+ [option.dir: IDL set to false]
+ expected: FAIL
+
+ [option.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [option.dir: IDL set to NaN]
+ expected: FAIL
+
+ [option.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [option.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [option.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [option.dir: IDL set to null]
+ expected: FAIL
+
+ [option.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [option.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [option.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [option.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [option.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [option.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [option.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [option.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [option.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [option.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [option.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [option.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [option.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [option.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [option.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [option.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [option.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [option.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [option.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [option.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [option.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [option.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [option.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [option.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [option.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [option.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [option.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [option.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [option.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [option.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [option.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [option.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [option.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [option.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [option.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [option.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [option.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [option.accessKey: IDL set to true]
+ expected: FAIL
+
+ [option.accessKey: IDL set to false]
+ expected: FAIL
+
+ [option.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [option.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [option.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [option.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [option.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [option.accessKey: IDL set to null]
+ expected: FAIL
+
+ [option.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [option.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [option.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [option.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [option.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [option.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [option.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [option.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [option.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [option.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [option.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [option.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [option.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [option.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [option.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [option.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [option.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [option.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [option.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [option.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [option.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [option.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [option.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [option.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [option.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to true]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to false]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to null]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [textarea.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [textarea.dir: IDL set to ""]
+ expected: FAIL
+
+ [textarea.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [textarea.dir: IDL set to undefined]
+ expected: FAIL
+
+ [textarea.dir: IDL set to 7]
+ expected: FAIL
+
+ [textarea.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [textarea.dir: IDL set to true]
+ expected: FAIL
+
+ [textarea.dir: IDL set to false]
+ expected: FAIL
+
+ [textarea.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [textarea.dir: IDL set to NaN]
+ expected: FAIL
+
+ [textarea.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [textarea.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [textarea.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [textarea.dir: IDL set to null]
+ expected: FAIL
+
+ [textarea.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [textarea.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [textarea.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [textarea.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [textarea.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [textarea.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [textarea.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [textarea.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [textarea.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [textarea.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [textarea.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [textarea.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [textarea.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [textarea.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [textarea.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [textarea.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [textarea.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [textarea.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [textarea.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [textarea.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [textarea.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [textarea.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [textarea.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [textarea.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [textarea.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [textarea.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [textarea.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [textarea.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [textarea.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [textarea.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [textarea.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [textarea.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [textarea.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [textarea.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [textarea.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [textarea.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [textarea.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [textarea.accessKey: IDL set to true]
+ expected: FAIL
+
+ [textarea.accessKey: IDL set to false]
+ expected: FAIL
+
+ [textarea.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [textarea.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [textarea.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [textarea.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [textarea.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [textarea.accessKey: IDL set to null]
+ expected: FAIL
+
+ [textarea.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [textarea.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [textarea.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [textarea.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [textarea.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [textarea.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [textarea.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [textarea.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [textarea.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [textarea.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [textarea.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [textarea.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [textarea.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [textarea.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [textarea.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [textarea.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [textarea.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [textarea.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [textarea.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [textarea.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [textarea.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [textarea.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [textarea.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [textarea.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [textarea.autofocus: setAttribute() to ""]
+ expected: FAIL
+
+ [textarea.autofocus: setAttribute() to " foo "]
+ expected: FAIL
+
+ [textarea.autofocus: setAttribute() to undefined]
+ expected: FAIL
+
+ [textarea.autofocus: setAttribute() to null]
+ expected: FAIL
+
+ [textarea.autofocus: setAttribute() to 7]
+ expected: FAIL
+
+ [textarea.autofocus: setAttribute() to 1.5]
+ expected: FAIL
+
+ [textarea.autofocus: setAttribute() to true]
+ expected: FAIL
+
+ [textarea.autofocus: setAttribute() to false]
+ expected: FAIL
+
+ [textarea.autofocus: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [textarea.autofocus: setAttribute() to NaN]
+ expected: FAIL
+
+ [textarea.autofocus: setAttribute() to Infinity]
+ expected: FAIL
+
+ [textarea.autofocus: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [textarea.autofocus: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [textarea.autofocus: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [textarea.autofocus: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [textarea.autofocus: setAttribute() to "autofocus"]
+ expected: FAIL
+
+ [textarea.autofocus: IDL set to ""]
+ expected: FAIL
+
+ [textarea.autofocus: IDL set to " foo "]
+ expected: FAIL
+
+ [textarea.autofocus: IDL set to undefined]
+ expected: FAIL
+
+ [textarea.autofocus: IDL set to null]
+ expected: FAIL
+
+ [textarea.autofocus: IDL set to 7]
+ expected: FAIL
+
+ [textarea.autofocus: IDL set to 1.5]
+ expected: FAIL
+
+ [textarea.autofocus: IDL set to false]
+ expected: FAIL
+
+ [textarea.autofocus: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [textarea.autofocus: IDL set to NaN]
+ expected: FAIL
+
+ [textarea.autofocus: IDL set to Infinity]
+ expected: FAIL
+
+ [textarea.autofocus: IDL set to -Infinity]
+ expected: FAIL
+
+ [textarea.autofocus: IDL set to "\\0"]
+ expected: FAIL
+
+ [textarea.autofocus: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [textarea.autofocus: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [textarea.cols: IDL set to 0]
+ expected: FAIL
+
+ [textarea.dirName: setAttribute() to ""]
+ expected: FAIL
+
+ [textarea.dirName: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [textarea.dirName: setAttribute() to undefined]
+ expected: FAIL
+
+ [textarea.dirName: setAttribute() to 7]
+ expected: FAIL
+
+ [textarea.dirName: setAttribute() to 1.5]
+ expected: FAIL
+
+ [textarea.dirName: setAttribute() to true]
+ expected: FAIL
+
+ [textarea.dirName: setAttribute() to false]
+ expected: FAIL
+
+ [textarea.dirName: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [textarea.dirName: setAttribute() to NaN]
+ expected: FAIL
+
+ [textarea.dirName: setAttribute() to Infinity]
+ expected: FAIL
+
+ [textarea.dirName: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [textarea.dirName: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [textarea.dirName: setAttribute() to null]
+ expected: FAIL
+
+ [textarea.dirName: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [textarea.dirName: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [textarea.dirName: IDL set to ""]
+ expected: FAIL
+
+ [textarea.dirName: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [textarea.dirName: IDL set to undefined]
+ expected: FAIL
+
+ [textarea.dirName: IDL set to 7]
+ expected: FAIL
+
+ [textarea.dirName: IDL set to 1.5]
+ expected: FAIL
+
+ [textarea.dirName: IDL set to true]
+ expected: FAIL
+
+ [textarea.dirName: IDL set to false]
+ expected: FAIL
+
+ [textarea.dirName: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [textarea.dirName: IDL set to NaN]
+ expected: FAIL
+
+ [textarea.dirName: IDL set to Infinity]
+ expected: FAIL
+
+ [textarea.dirName: IDL set to -Infinity]
+ expected: FAIL
+
+ [textarea.dirName: IDL set to "\\0"]
+ expected: FAIL
+
+ [textarea.dirName: IDL set to null]
+ expected: FAIL
+
+ [textarea.dirName: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [textarea.dirName: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to ""]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to undefined]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to 7]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to 1.5]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to true]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to false]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to NaN]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to Infinity]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to null]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "verbatim"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "xverbatim"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "verbatim\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "erbatim"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "VERBATIM"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "latin"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "xlatin"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "latin\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "atin"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "LATIN"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "latin-name"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "xlatin-name"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "latin-name\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "atin-name"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "LATIN-NAME"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "latin-prose"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "xlatin-prose"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "latin-prose\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "atin-prose"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "LATIN-PROSE"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "full-width-latin"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "xfull-width-latin"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "full-width-latin\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "ull-width-latin"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "FULL-WIDTH-LATIN"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "kana"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "xkana"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "kana\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "ana"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "KANA"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "katakana"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "xkatakana"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "katakana\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "atakana"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "KATAKANA"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "numeric"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "xnumeric"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "numeric\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "umeric"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "NUMERIC"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "tel"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "xtel"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "tel\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "el"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "TEL"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "email"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "xemail"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "email\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "mail"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "EMAIL"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "url"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "xurl"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "url\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "rl"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "URL"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to ""]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to undefined]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to 7]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to 1.5]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to true]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to false]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to NaN]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to Infinity]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to -Infinity]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to null]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "verbatim"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "xverbatim"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "verbatim\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "erbatim"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "VERBATIM"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "latin"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "xlatin"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "latin\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "atin"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "LATIN"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "latin-name"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "xlatin-name"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "latin-name\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "atin-name"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "LATIN-NAME"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "latin-prose"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "xlatin-prose"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "latin-prose\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "atin-prose"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "LATIN-PROSE"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "full-width-latin"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "xfull-width-latin"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "full-width-latin\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "ull-width-latin"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "FULL-WIDTH-LATIN"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "kana"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "xkana"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "kana\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "ana"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "KANA"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "katakana"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "xkatakana"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "katakana\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "atakana"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "KATAKANA"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "numeric"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "xnumeric"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "numeric\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "umeric"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "NUMERIC"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "tel"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "xtel"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "tel\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "el"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "TEL"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "email"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "xemail"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "email\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "mail"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "EMAIL"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "url"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "xurl"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "url\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "rl"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "URL"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to -2147483649]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to -36]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to -1]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to -0]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to 0]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to 1]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to 2147483648]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to 4294967295]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to 4294967296]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to ""]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to "-1"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to "-0"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to "0"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to "1"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to "\\v7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to "7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to "
7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to "
7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to "᠎7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to undefined]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to 1.5]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to true]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to false]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to NaN]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to Infinity]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to object "2"]
+ expected: FAIL
+
+ [textarea.maxLength: setAttribute() to object "3"]
+ expected: FAIL
+
+ [textarea.maxLength: IDL set to -2147483648]
+ expected: FAIL
+
+ [textarea.maxLength: IDL set to -36]
+ expected: FAIL
+
+ [textarea.maxLength: IDL set to -1]
+ expected: FAIL
+
+ [textarea.maxLength: IDL set to 0]
+ expected: FAIL
+
+ [textarea.maxLength: IDL set to 1]
+ expected: FAIL
+
+ [textarea.maxLength: IDL set to 2147483647]
+ expected: FAIL
+
+ [textarea.rows: IDL set to 0]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to true]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to false]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to null]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [keygen.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [keygen.dir: IDL set to ""]
+ expected: FAIL
+
+ [keygen.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [keygen.dir: IDL set to undefined]
+ expected: FAIL
+
+ [keygen.dir: IDL set to 7]
+ expected: FAIL
+
+ [keygen.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [keygen.dir: IDL set to true]
+ expected: FAIL
+
+ [keygen.dir: IDL set to false]
+ expected: FAIL
+
+ [keygen.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [keygen.dir: IDL set to NaN]
+ expected: FAIL
+
+ [keygen.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [keygen.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [keygen.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [keygen.dir: IDL set to null]
+ expected: FAIL
+
+ [keygen.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [keygen.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [keygen.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [keygen.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [keygen.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [keygen.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [keygen.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [keygen.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [keygen.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [keygen.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [keygen.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [keygen.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [keygen.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [keygen.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [keygen.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [keygen.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [keygen.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [keygen.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [keygen.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [keygen.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [keygen.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [keygen.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [keygen.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [keygen.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [keygen.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [keygen.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [keygen.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [keygen.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [keygen.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [keygen.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [keygen.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [keygen.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [keygen.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [keygen.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [keygen.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [keygen.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [keygen.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [keygen.accessKey: IDL set to true]
+ expected: FAIL
+
+ [keygen.accessKey: IDL set to false]
+ expected: FAIL
+
+ [keygen.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [keygen.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [keygen.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [keygen.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [keygen.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [keygen.accessKey: IDL set to null]
+ expected: FAIL
+
+ [keygen.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [keygen.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [keygen.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [keygen.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [keygen.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [keygen.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [keygen.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [keygen.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [keygen.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [keygen.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [keygen.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [keygen.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [keygen.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [keygen.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [keygen.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [keygen.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [keygen.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [keygen.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [keygen.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [keygen.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [keygen.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [keygen.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [keygen.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [keygen.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [keygen.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [keygen.autofocus: setAttribute() to ""]
+ expected: FAIL
+
+ [keygen.autofocus: setAttribute() to " foo "]
+ expected: FAIL
+
+ [keygen.autofocus: setAttribute() to undefined]
+ expected: FAIL
+
+ [keygen.autofocus: setAttribute() to null]
+ expected: FAIL
+
+ [keygen.autofocus: setAttribute() to 7]
+ expected: FAIL
+
+ [keygen.autofocus: setAttribute() to 1.5]
+ expected: FAIL
+
+ [keygen.autofocus: setAttribute() to true]
+ expected: FAIL
+
+ [keygen.autofocus: setAttribute() to false]
+ expected: FAIL
+
+ [keygen.autofocus: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [keygen.autofocus: setAttribute() to NaN]
+ expected: FAIL
+
+ [keygen.autofocus: setAttribute() to Infinity]
+ expected: FAIL
+
+ [keygen.autofocus: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [keygen.autofocus: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [keygen.autofocus: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [keygen.autofocus: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [keygen.autofocus: setAttribute() to "autofocus"]
+ expected: FAIL
+
+ [keygen.autofocus: IDL set to ""]
+ expected: FAIL
+
+ [keygen.autofocus: IDL set to " foo "]
+ expected: FAIL
+
+ [keygen.autofocus: IDL set to undefined]
+ expected: FAIL
+
+ [keygen.autofocus: IDL set to null]
+ expected: FAIL
+
+ [keygen.autofocus: IDL set to 7]
+ expected: FAIL
+
+ [keygen.autofocus: IDL set to 1.5]
+ expected: FAIL
+
+ [keygen.autofocus: IDL set to false]
+ expected: FAIL
+
+ [keygen.autofocus: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [keygen.autofocus: IDL set to NaN]
+ expected: FAIL
+
+ [keygen.autofocus: IDL set to Infinity]
+ expected: FAIL
+
+ [keygen.autofocus: IDL set to -Infinity]
+ expected: FAIL
+
+ [keygen.autofocus: IDL set to "\\0"]
+ expected: FAIL
+
+ [keygen.autofocus: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [keygen.autofocus: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [keygen.challenge: setAttribute() to ""]
+ expected: FAIL
+
+ [keygen.challenge: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [keygen.challenge: setAttribute() to undefined]
+ expected: FAIL
+
+ [keygen.challenge: setAttribute() to 7]
+ expected: FAIL
+
+ [keygen.challenge: setAttribute() to 1.5]
+ expected: FAIL
+
+ [keygen.challenge: setAttribute() to true]
+ expected: FAIL
+
+ [keygen.challenge: setAttribute() to false]
+ expected: FAIL
+
+ [keygen.challenge: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [keygen.challenge: setAttribute() to NaN]
+ expected: FAIL
+
+ [keygen.challenge: setAttribute() to Infinity]
+ expected: FAIL
+
+ [keygen.challenge: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [keygen.challenge: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [keygen.challenge: setAttribute() to null]
+ expected: FAIL
+
+ [keygen.challenge: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [keygen.challenge: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [keygen.challenge: IDL set to ""]
+ expected: FAIL
+
+ [keygen.challenge: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [keygen.challenge: IDL set to undefined]
+ expected: FAIL
+
+ [keygen.challenge: IDL set to 7]
+ expected: FAIL
+
+ [keygen.challenge: IDL set to 1.5]
+ expected: FAIL
+
+ [keygen.challenge: IDL set to true]
+ expected: FAIL
+
+ [keygen.challenge: IDL set to false]
+ expected: FAIL
+
+ [keygen.challenge: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [keygen.challenge: IDL set to NaN]
+ expected: FAIL
+
+ [keygen.challenge: IDL set to Infinity]
+ expected: FAIL
+
+ [keygen.challenge: IDL set to -Infinity]
+ expected: FAIL
+
+ [keygen.challenge: IDL set to "\\0"]
+ expected: FAIL
+
+ [keygen.challenge: IDL set to null]
+ expected: FAIL
+
+ [keygen.challenge: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [keygen.challenge: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [keygen.disabled: setAttribute() to ""]
+ expected: FAIL
+
+ [keygen.disabled: setAttribute() to " foo "]
+ expected: FAIL
+
+ [keygen.disabled: setAttribute() to undefined]
+ expected: FAIL
+
+ [keygen.disabled: setAttribute() to null]
+ expected: FAIL
+
+ [keygen.disabled: setAttribute() to 7]
+ expected: FAIL
+
+ [keygen.disabled: setAttribute() to 1.5]
+ expected: FAIL
+
+ [keygen.disabled: setAttribute() to true]
+ expected: FAIL
+
+ [keygen.disabled: setAttribute() to false]
+ expected: FAIL
+
+ [keygen.disabled: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [keygen.disabled: setAttribute() to NaN]
+ expected: FAIL
+
+ [keygen.disabled: setAttribute() to Infinity]
+ expected: FAIL
+
+ [keygen.disabled: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [keygen.disabled: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [keygen.disabled: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [keygen.disabled: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [keygen.disabled: setAttribute() to "disabled"]
+ expected: FAIL
+
+ [keygen.disabled: IDL set to ""]
+ expected: FAIL
+
+ [keygen.disabled: IDL set to " foo "]
+ expected: FAIL
+
+ [keygen.disabled: IDL set to undefined]
+ expected: FAIL
+
+ [keygen.disabled: IDL set to null]
+ expected: FAIL
+
+ [keygen.disabled: IDL set to 7]
+ expected: FAIL
+
+ [keygen.disabled: IDL set to 1.5]
+ expected: FAIL
+
+ [keygen.disabled: IDL set to false]
+ expected: FAIL
+
+ [keygen.disabled: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [keygen.disabled: IDL set to NaN]
+ expected: FAIL
+
+ [keygen.disabled: IDL set to Infinity]
+ expected: FAIL
+
+ [keygen.disabled: IDL set to -Infinity]
+ expected: FAIL
+
+ [keygen.disabled: IDL set to "\\0"]
+ expected: FAIL
+
+ [keygen.disabled: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [keygen.disabled: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [keygen.keytype: setAttribute() to "rsa"]
+ expected: FAIL
+
+ [keygen.keytype: setAttribute() to "RSA"]
+ expected: FAIL
+
+ [keygen.keytype: IDL set to ""]
+ expected: FAIL
+
+ [keygen.keytype: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [keygen.keytype: IDL set to undefined]
+ expected: FAIL
+
+ [keygen.keytype: IDL set to 7]
+ expected: FAIL
+
+ [keygen.keytype: IDL set to 1.5]
+ expected: FAIL
+
+ [keygen.keytype: IDL set to true]
+ expected: FAIL
+
+ [keygen.keytype: IDL set to false]
+ expected: FAIL
+
+ [keygen.keytype: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [keygen.keytype: IDL set to NaN]
+ expected: FAIL
+
+ [keygen.keytype: IDL set to Infinity]
+ expected: FAIL
+
+ [keygen.keytype: IDL set to -Infinity]
+ expected: FAIL
+
+ [keygen.keytype: IDL set to "\\0"]
+ expected: FAIL
+
+ [keygen.keytype: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [keygen.keytype: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [keygen.keytype: IDL set to "rsa"]
+ expected: FAIL
+
+ [keygen.keytype: IDL set to "xrsa"]
+ expected: FAIL
+
+ [keygen.keytype: IDL set to "rsa\\0"]
+ expected: FAIL
+
+ [keygen.keytype: IDL set to "sa"]
+ expected: FAIL
+
+ [keygen.keytype: IDL set to "RSA"]
+ expected: FAIL
+
+ [keygen.name: setAttribute() to ""]
+ expected: FAIL
+
+ [keygen.name: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [keygen.name: setAttribute() to undefined]
+ expected: FAIL
+
+ [keygen.name: setAttribute() to 7]
+ expected: FAIL
+
+ [keygen.name: setAttribute() to 1.5]
+ expected: FAIL
+
+ [keygen.name: setAttribute() to true]
+ expected: FAIL
+
+ [keygen.name: setAttribute() to false]
+ expected: FAIL
+
+ [keygen.name: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [keygen.name: setAttribute() to NaN]
+ expected: FAIL
+
+ [keygen.name: setAttribute() to Infinity]
+ expected: FAIL
+
+ [keygen.name: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [keygen.name: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [keygen.name: setAttribute() to null]
+ expected: FAIL
+
+ [keygen.name: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [keygen.name: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [keygen.name: IDL set to ""]
+ expected: FAIL
+
+ [keygen.name: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [keygen.name: IDL set to undefined]
+ expected: FAIL
+
+ [keygen.name: IDL set to 7]
+ expected: FAIL
+
+ [keygen.name: IDL set to 1.5]
+ expected: FAIL
+
+ [keygen.name: IDL set to true]
+ expected: FAIL
+
+ [keygen.name: IDL set to false]
+ expected: FAIL
+
+ [keygen.name: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [keygen.name: IDL set to NaN]
+ expected: FAIL
+
+ [keygen.name: IDL set to Infinity]
+ expected: FAIL
+
+ [keygen.name: IDL set to -Infinity]
+ expected: FAIL
+
+ [keygen.name: IDL set to "\\0"]
+ expected: FAIL
+
+ [keygen.name: IDL set to null]
+ expected: FAIL
+
+ [keygen.name: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [keygen.name: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [output.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [output.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [output.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [output.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [output.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [output.dir: setAttribute() to true]
+ expected: FAIL
+
+ [output.dir: setAttribute() to false]
+ expected: FAIL
+
+ [output.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [output.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [output.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [output.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [output.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [output.dir: setAttribute() to null]
+ expected: FAIL
+
+ [output.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [output.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [output.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [output.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [output.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [output.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [output.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [output.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [output.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [output.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [output.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [output.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [output.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [output.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [output.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [output.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [output.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [output.dir: IDL set to ""]
+ expected: FAIL
+
+ [output.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [output.dir: IDL set to undefined]
+ expected: FAIL
+
+ [output.dir: IDL set to 7]
+ expected: FAIL
+
+ [output.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [output.dir: IDL set to true]
+ expected: FAIL
+
+ [output.dir: IDL set to false]
+ expected: FAIL
+
+ [output.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [output.dir: IDL set to NaN]
+ expected: FAIL
+
+ [output.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [output.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [output.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [output.dir: IDL set to null]
+ expected: FAIL
+
+ [output.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [output.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [output.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [output.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [output.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [output.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [output.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [output.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [output.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [output.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [output.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [output.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [output.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [output.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [output.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [output.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [output.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [output.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [output.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [output.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [output.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [output.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [output.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [output.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [output.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [output.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [output.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [output.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [output.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [output.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [output.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [output.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [output.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [output.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [output.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [output.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [output.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [output.accessKey: IDL set to true]
+ expected: FAIL
+
+ [output.accessKey: IDL set to false]
+ expected: FAIL
+
+ [output.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [output.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [output.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [output.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [output.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [output.accessKey: IDL set to null]
+ expected: FAIL
+
+ [output.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [output.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [output.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [output.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [output.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [output.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [output.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [output.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [output.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [output.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [output.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [output.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [output.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [output.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [output.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [output.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [output.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [output.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [output.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [output.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [output.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [output.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [output.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [output.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [output.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [output.name: setAttribute() to ""]
+ expected: FAIL
+
+ [output.name: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [output.name: setAttribute() to undefined]
+ expected: FAIL
+
+ [output.name: setAttribute() to 7]
+ expected: FAIL
+
+ [output.name: setAttribute() to 1.5]
+ expected: FAIL
+
+ [output.name: setAttribute() to true]
+ expected: FAIL
+
+ [output.name: setAttribute() to false]
+ expected: FAIL
+
+ [output.name: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [output.name: setAttribute() to NaN]
+ expected: FAIL
+
+ [output.name: setAttribute() to Infinity]
+ expected: FAIL
+
+ [output.name: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [output.name: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [output.name: setAttribute() to null]
+ expected: FAIL
+
+ [output.name: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [output.name: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [output.name: IDL set to ""]
+ expected: FAIL
+
+ [output.name: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [output.name: IDL set to undefined]
+ expected: FAIL
+
+ [output.name: IDL set to 7]
+ expected: FAIL
+
+ [output.name: IDL set to 1.5]
+ expected: FAIL
+
+ [output.name: IDL set to true]
+ expected: FAIL
+
+ [output.name: IDL set to false]
+ expected: FAIL
+
+ [output.name: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [output.name: IDL set to NaN]
+ expected: FAIL
+
+ [output.name: IDL set to Infinity]
+ expected: FAIL
+
+ [output.name: IDL set to -Infinity]
+ expected: FAIL
+
+ [output.name: IDL set to "\\0"]
+ expected: FAIL
+
+ [output.name: IDL set to null]
+ expected: FAIL
+
+ [output.name: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [output.name: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to true]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to false]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to null]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [progress.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [progress.dir: IDL set to ""]
+ expected: FAIL
+
+ [progress.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [progress.dir: IDL set to undefined]
+ expected: FAIL
+
+ [progress.dir: IDL set to 7]
+ expected: FAIL
+
+ [progress.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [progress.dir: IDL set to true]
+ expected: FAIL
+
+ [progress.dir: IDL set to false]
+ expected: FAIL
+
+ [progress.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [progress.dir: IDL set to NaN]
+ expected: FAIL
+
+ [progress.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [progress.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [progress.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [progress.dir: IDL set to null]
+ expected: FAIL
+
+ [progress.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [progress.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [progress.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [progress.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [progress.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [progress.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [progress.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [progress.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [progress.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [progress.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [progress.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [progress.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [progress.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [progress.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [progress.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [progress.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [progress.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [progress.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [progress.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [progress.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [progress.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [progress.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [progress.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [progress.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [progress.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [progress.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [progress.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [progress.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [progress.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [progress.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [progress.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [progress.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [progress.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [progress.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [progress.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [progress.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [progress.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [progress.accessKey: IDL set to true]
+ expected: FAIL
+
+ [progress.accessKey: IDL set to false]
+ expected: FAIL
+
+ [progress.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [progress.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [progress.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [progress.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [progress.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [progress.accessKey: IDL set to null]
+ expected: FAIL
+
+ [progress.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [progress.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [progress.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [progress.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [progress.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [progress.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [progress.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [progress.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [progress.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [progress.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [progress.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [progress.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [progress.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [progress.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [progress.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [progress.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [progress.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [progress.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [progress.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [progress.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [progress.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [progress.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [progress.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [progress.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [progress.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to true]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to false]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to null]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [meter.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [meter.dir: IDL set to ""]
+ expected: FAIL
+
+ [meter.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [meter.dir: IDL set to undefined]
+ expected: FAIL
+
+ [meter.dir: IDL set to 7]
+ expected: FAIL
+
+ [meter.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [meter.dir: IDL set to true]
+ expected: FAIL
+
+ [meter.dir: IDL set to false]
+ expected: FAIL
+
+ [meter.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [meter.dir: IDL set to NaN]
+ expected: FAIL
+
+ [meter.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [meter.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [meter.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [meter.dir: IDL set to null]
+ expected: FAIL
+
+ [meter.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [meter.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [meter.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [meter.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [meter.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [meter.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [meter.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [meter.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [meter.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [meter.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [meter.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [meter.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [meter.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [meter.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [meter.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [meter.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [meter.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [meter.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [meter.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [meter.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [meter.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [meter.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [meter.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [meter.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [meter.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [meter.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [meter.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [meter.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [meter.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [meter.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [meter.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [meter.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [meter.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [meter.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [meter.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [meter.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [meter.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [meter.accessKey: IDL set to true]
+ expected: FAIL
+
+ [meter.accessKey: IDL set to false]
+ expected: FAIL
+
+ [meter.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [meter.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [meter.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [meter.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [meter.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [meter.accessKey: IDL set to null]
+ expected: FAIL
+
+ [meter.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [meter.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [meter.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [meter.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [meter.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [meter.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [meter.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [meter.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [meter.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [meter.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [meter.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [meter.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [meter.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [meter.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [meter.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [meter.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [meter.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [meter.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [meter.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [meter.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [meter.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [meter.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [meter.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [meter.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [meter.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/dom/reflection-grouping.html.ini b/tests/wpt/metadata/html/dom/reflection-grouping.html.ini
index ab78b68717b..b122635198e 100644
--- a/tests/wpt/metadata/html/dom/reflection-grouping.html.ini
+++ b/tests/wpt/metadata/html/dom/reflection-grouping.html.ini
@@ -13953,3 +13953,6105 @@
[data.itemValue (<data value>): IDL set to object "test-valueOf" followed by IDL get]
expected: FAIL
+ [p.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [p.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [p.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [p.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [p.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [p.dir: setAttribute() to true]
+ expected: FAIL
+
+ [p.dir: setAttribute() to false]
+ expected: FAIL
+
+ [p.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [p.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [p.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [p.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [p.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [p.dir: setAttribute() to null]
+ expected: FAIL
+
+ [p.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [p.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [p.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [p.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [p.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [p.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [p.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [p.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [p.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [p.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [p.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [p.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [p.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [p.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [p.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [p.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [p.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [p.dir: IDL set to ""]
+ expected: FAIL
+
+ [p.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [p.dir: IDL set to undefined]
+ expected: FAIL
+
+ [p.dir: IDL set to 7]
+ expected: FAIL
+
+ [p.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [p.dir: IDL set to true]
+ expected: FAIL
+
+ [p.dir: IDL set to false]
+ expected: FAIL
+
+ [p.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [p.dir: IDL set to NaN]
+ expected: FAIL
+
+ [p.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [p.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [p.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [p.dir: IDL set to null]
+ expected: FAIL
+
+ [p.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [p.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [p.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [p.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [p.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [p.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [p.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [p.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [p.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [p.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [p.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [p.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [p.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [p.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [p.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [p.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [p.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [p.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [p.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [p.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [p.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [p.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [p.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [p.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [p.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [p.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [p.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [p.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [p.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [p.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [p.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [p.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [p.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [p.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [p.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [p.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [p.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [p.accessKey: IDL set to true]
+ expected: FAIL
+
+ [p.accessKey: IDL set to false]
+ expected: FAIL
+
+ [p.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [p.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [p.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [p.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [p.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [p.accessKey: IDL set to null]
+ expected: FAIL
+
+ [p.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [p.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [p.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [p.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [p.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [p.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [p.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [p.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [p.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [p.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [p.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [p.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [p.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [p.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [p.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [p.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [p.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [p.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [p.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [p.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [p.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [p.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [p.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [p.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [p.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [p.align: setAttribute() to ""]
+ expected: FAIL
+
+ [p.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [p.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [p.align: setAttribute() to 7]
+ expected: FAIL
+
+ [p.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [p.align: setAttribute() to true]
+ expected: FAIL
+
+ [p.align: setAttribute() to false]
+ expected: FAIL
+
+ [p.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [p.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [p.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [p.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [p.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [p.align: setAttribute() to null]
+ expected: FAIL
+
+ [p.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [p.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [p.align: IDL set to ""]
+ expected: FAIL
+
+ [p.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [p.align: IDL set to undefined]
+ expected: FAIL
+
+ [p.align: IDL set to 7]
+ expected: FAIL
+
+ [p.align: IDL set to 1.5]
+ expected: FAIL
+
+ [p.align: IDL set to true]
+ expected: FAIL
+
+ [p.align: IDL set to false]
+ expected: FAIL
+
+ [p.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [p.align: IDL set to NaN]
+ expected: FAIL
+
+ [p.align: IDL set to Infinity]
+ expected: FAIL
+
+ [p.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [p.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [p.align: IDL set to null]
+ expected: FAIL
+
+ [p.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [p.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to true]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to false]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to null]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [hr.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [hr.dir: IDL set to ""]
+ expected: FAIL
+
+ [hr.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [hr.dir: IDL set to undefined]
+ expected: FAIL
+
+ [hr.dir: IDL set to 7]
+ expected: FAIL
+
+ [hr.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [hr.dir: IDL set to true]
+ expected: FAIL
+
+ [hr.dir: IDL set to false]
+ expected: FAIL
+
+ [hr.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [hr.dir: IDL set to NaN]
+ expected: FAIL
+
+ [hr.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [hr.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [hr.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [hr.dir: IDL set to null]
+ expected: FAIL
+
+ [hr.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [hr.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [hr.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [hr.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [hr.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [hr.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [hr.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [hr.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [hr.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [hr.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [hr.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [hr.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [hr.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [hr.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [hr.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [hr.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [hr.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [hr.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [hr.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [hr.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [hr.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [hr.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [hr.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [hr.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [hr.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [hr.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [hr.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [hr.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [hr.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [hr.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [hr.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [hr.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [hr.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [hr.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [hr.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [hr.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [hr.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [hr.accessKey: IDL set to true]
+ expected: FAIL
+
+ [hr.accessKey: IDL set to false]
+ expected: FAIL
+
+ [hr.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [hr.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [hr.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [hr.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [hr.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [hr.accessKey: IDL set to null]
+ expected: FAIL
+
+ [hr.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [hr.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [hr.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [hr.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [hr.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [hr.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [hr.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [hr.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [hr.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [hr.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [hr.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [hr.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [hr.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [hr.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [hr.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [hr.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [hr.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [hr.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [hr.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [hr.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [hr.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [hr.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [hr.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [hr.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [hr.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [hr.noShade: setAttribute() to ""]
+ expected: FAIL
+
+ [hr.noShade: setAttribute() to " foo "]
+ expected: FAIL
+
+ [hr.noShade: setAttribute() to undefined]
+ expected: FAIL
+
+ [hr.noShade: setAttribute() to null]
+ expected: FAIL
+
+ [hr.noShade: setAttribute() to 7]
+ expected: FAIL
+
+ [hr.noShade: setAttribute() to 1.5]
+ expected: FAIL
+
+ [hr.noShade: setAttribute() to true]
+ expected: FAIL
+
+ [hr.noShade: setAttribute() to false]
+ expected: FAIL
+
+ [hr.noShade: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [hr.noShade: setAttribute() to NaN]
+ expected: FAIL
+
+ [hr.noShade: setAttribute() to Infinity]
+ expected: FAIL
+
+ [hr.noShade: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [hr.noShade: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [hr.noShade: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [hr.noShade: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [hr.noShade: setAttribute() to "noShade"]
+ expected: FAIL
+
+ [hr.noShade: IDL set to ""]
+ expected: FAIL
+
+ [hr.noShade: IDL set to " foo "]
+ expected: FAIL
+
+ [hr.noShade: IDL set to undefined]
+ expected: FAIL
+
+ [hr.noShade: IDL set to null]
+ expected: FAIL
+
+ [hr.noShade: IDL set to 7]
+ expected: FAIL
+
+ [hr.noShade: IDL set to 1.5]
+ expected: FAIL
+
+ [hr.noShade: IDL set to false]
+ expected: FAIL
+
+ [hr.noShade: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [hr.noShade: IDL set to NaN]
+ expected: FAIL
+
+ [hr.noShade: IDL set to Infinity]
+ expected: FAIL
+
+ [hr.noShade: IDL set to -Infinity]
+ expected: FAIL
+
+ [hr.noShade: IDL set to "\\0"]
+ expected: FAIL
+
+ [hr.noShade: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [hr.noShade: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [hr.size: setAttribute() to ""]
+ expected: FAIL
+
+ [hr.size: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [hr.size: setAttribute() to undefined]
+ expected: FAIL
+
+ [hr.size: setAttribute() to 7]
+ expected: FAIL
+
+ [hr.size: setAttribute() to 1.5]
+ expected: FAIL
+
+ [hr.size: setAttribute() to true]
+ expected: FAIL
+
+ [hr.size: setAttribute() to false]
+ expected: FAIL
+
+ [hr.size: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [hr.size: setAttribute() to NaN]
+ expected: FAIL
+
+ [hr.size: setAttribute() to Infinity]
+ expected: FAIL
+
+ [hr.size: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [hr.size: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [hr.size: setAttribute() to null]
+ expected: FAIL
+
+ [hr.size: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [hr.size: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [hr.size: IDL set to ""]
+ expected: FAIL
+
+ [hr.size: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [hr.size: IDL set to undefined]
+ expected: FAIL
+
+ [hr.size: IDL set to 7]
+ expected: FAIL
+
+ [hr.size: IDL set to 1.5]
+ expected: FAIL
+
+ [hr.size: IDL set to true]
+ expected: FAIL
+
+ [hr.size: IDL set to false]
+ expected: FAIL
+
+ [hr.size: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [hr.size: IDL set to NaN]
+ expected: FAIL
+
+ [hr.size: IDL set to Infinity]
+ expected: FAIL
+
+ [hr.size: IDL set to -Infinity]
+ expected: FAIL
+
+ [hr.size: IDL set to "\\0"]
+ expected: FAIL
+
+ [hr.size: IDL set to null]
+ expected: FAIL
+
+ [hr.size: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [hr.size: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to true]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to false]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to null]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [pre.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [pre.dir: IDL set to ""]
+ expected: FAIL
+
+ [pre.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [pre.dir: IDL set to undefined]
+ expected: FAIL
+
+ [pre.dir: IDL set to 7]
+ expected: FAIL
+
+ [pre.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [pre.dir: IDL set to true]
+ expected: FAIL
+
+ [pre.dir: IDL set to false]
+ expected: FAIL
+
+ [pre.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [pre.dir: IDL set to NaN]
+ expected: FAIL
+
+ [pre.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [pre.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [pre.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [pre.dir: IDL set to null]
+ expected: FAIL
+
+ [pre.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [pre.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [pre.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [pre.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [pre.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [pre.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [pre.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [pre.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [pre.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [pre.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [pre.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [pre.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [pre.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [pre.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [pre.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [pre.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [pre.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [pre.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [pre.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [pre.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [pre.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [pre.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [pre.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [pre.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [pre.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [pre.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [pre.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [pre.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [pre.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [pre.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [pre.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [pre.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [pre.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [pre.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [pre.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [pre.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [pre.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [pre.accessKey: IDL set to true]
+ expected: FAIL
+
+ [pre.accessKey: IDL set to false]
+ expected: FAIL
+
+ [pre.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [pre.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [pre.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [pre.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [pre.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [pre.accessKey: IDL set to null]
+ expected: FAIL
+
+ [pre.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [pre.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [pre.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [pre.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [pre.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [pre.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [pre.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [pre.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [pre.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [pre.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [pre.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [pre.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [pre.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [pre.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [pre.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [pre.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [pre.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [pre.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [pre.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [pre.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [pre.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [pre.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [pre.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [pre.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [pre.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [pre.width: setAttribute() to -36]
+ expected: FAIL
+
+ [pre.width: setAttribute() to -1]
+ expected: FAIL
+
+ [pre.width: setAttribute() to 0]
+ expected: FAIL
+
+ [pre.width: setAttribute() to 1]
+ expected: FAIL
+
+ [pre.width: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [pre.width: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [pre.width: setAttribute() to 2147483648]
+ expected: FAIL
+
+ [pre.width: setAttribute() to -2147483649]
+ expected: FAIL
+
+ [pre.width: setAttribute() to 4294967295]
+ expected: FAIL
+
+ [pre.width: setAttribute() to 4294967296]
+ expected: FAIL
+
+ [pre.width: setAttribute() to ""]
+ expected: FAIL
+
+ [pre.width: setAttribute() to "-1"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to "-0"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to "0"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to "1"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [pre.width: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to "\\v7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to "7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to "
7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to "
7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to "᠎7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to " 7"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to undefined]
+ expected: FAIL
+
+ [pre.width: setAttribute() to 1.5]
+ expected: FAIL
+
+ [pre.width: setAttribute() to true]
+ expected: FAIL
+
+ [pre.width: setAttribute() to false]
+ expected: FAIL
+
+ [pre.width: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to NaN]
+ expected: FAIL
+
+ [pre.width: setAttribute() to Infinity]
+ expected: FAIL
+
+ [pre.width: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [pre.width: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to object "2"]
+ expected: FAIL
+
+ [pre.width: setAttribute() to object "3"]
+ expected: FAIL
+
+ [pre.width: IDL set to -36]
+ expected: FAIL
+
+ [pre.width: IDL set to -1]
+ expected: FAIL
+
+ [pre.width: IDL set to 0]
+ expected: FAIL
+
+ [pre.width: IDL set to 1]
+ expected: FAIL
+
+ [pre.width: IDL set to 2147483647]
+ expected: FAIL
+
+ [pre.width: IDL set to -2147483648]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to true]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to false]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to null]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [blockquote.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to ""]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to undefined]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to 7]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to true]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to false]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to NaN]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to null]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [blockquote.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [blockquote.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [blockquote.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [blockquote.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [blockquote.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [blockquote.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [blockquote.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [blockquote.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [blockquote.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [blockquote.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [blockquote.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [blockquote.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [blockquote.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [blockquote.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [blockquote.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [blockquote.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [blockquote.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [blockquote.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [blockquote.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [blockquote.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [blockquote.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [blockquote.accessKey: IDL set to true]
+ expected: FAIL
+
+ [blockquote.accessKey: IDL set to false]
+ expected: FAIL
+
+ [blockquote.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [blockquote.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [blockquote.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [blockquote.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [blockquote.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [blockquote.accessKey: IDL set to null]
+ expected: FAIL
+
+ [blockquote.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [blockquote.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [blockquote.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [blockquote.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [blockquote.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [blockquote.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [blockquote.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [blockquote.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [blockquote.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [blockquote.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [blockquote.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [blockquote.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [blockquote.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [blockquote.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [blockquote.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [blockquote.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [blockquote.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [blockquote.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [blockquote.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [blockquote.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [blockquote.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [blockquote.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [blockquote.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [blockquote.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [blockquote.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [blockquote.cite: setAttribute() to ""]
+ expected: FAIL
+
+ [blockquote.cite: setAttribute() to " foo "]
+ expected: FAIL
+
+ [blockquote.cite: setAttribute() to "http://site.example/"]
+ expected: FAIL
+
+ [blockquote.cite: setAttribute() to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [blockquote.cite: setAttribute() to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [blockquote.cite: setAttribute() to undefined]
+ expected: FAIL
+
+ [blockquote.cite: setAttribute() to 7]
+ expected: FAIL
+
+ [blockquote.cite: setAttribute() to 1.5]
+ expected: FAIL
+
+ [blockquote.cite: setAttribute() to true]
+ expected: FAIL
+
+ [blockquote.cite: setAttribute() to false]
+ expected: FAIL
+
+ [blockquote.cite: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [blockquote.cite: setAttribute() to NaN]
+ expected: FAIL
+
+ [blockquote.cite: setAttribute() to Infinity]
+ expected: FAIL
+
+ [blockquote.cite: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [blockquote.cite: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [blockquote.cite: setAttribute() to null]
+ expected: FAIL
+
+ [blockquote.cite: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [blockquote.cite: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [blockquote.cite: IDL set to ""]
+ expected: FAIL
+
+ [blockquote.cite: IDL set to " foo "]
+ expected: FAIL
+
+ [blockquote.cite: IDL set to "http://site.example/"]
+ expected: FAIL
+
+ [blockquote.cite: IDL set to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [blockquote.cite: IDL set to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [blockquote.cite: IDL set to undefined]
+ expected: FAIL
+
+ [blockquote.cite: IDL set to 7]
+ expected: FAIL
+
+ [blockquote.cite: IDL set to 1.5]
+ expected: FAIL
+
+ [blockquote.cite: IDL set to true]
+ expected: FAIL
+
+ [blockquote.cite: IDL set to false]
+ expected: FAIL
+
+ [blockquote.cite: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [blockquote.cite: IDL set to NaN]
+ expected: FAIL
+
+ [blockquote.cite: IDL set to Infinity]
+ expected: FAIL
+
+ [blockquote.cite: IDL set to -Infinity]
+ expected: FAIL
+
+ [blockquote.cite: IDL set to "\\0"]
+ expected: FAIL
+
+ [blockquote.cite: IDL set to null]
+ expected: FAIL
+
+ [blockquote.cite: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [blockquote.cite: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to true]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to false]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to null]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [ol.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [ol.dir: IDL set to ""]
+ expected: FAIL
+
+ [ol.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ol.dir: IDL set to undefined]
+ expected: FAIL
+
+ [ol.dir: IDL set to 7]
+ expected: FAIL
+
+ [ol.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [ol.dir: IDL set to true]
+ expected: FAIL
+
+ [ol.dir: IDL set to false]
+ expected: FAIL
+
+ [ol.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [ol.dir: IDL set to NaN]
+ expected: FAIL
+
+ [ol.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [ol.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [ol.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [ol.dir: IDL set to null]
+ expected: FAIL
+
+ [ol.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [ol.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [ol.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [ol.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [ol.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [ol.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [ol.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [ol.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [ol.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [ol.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [ol.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [ol.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [ol.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [ol.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [ol.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [ol.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [ol.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [ol.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [ol.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ol.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [ol.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [ol.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [ol.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [ol.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [ol.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [ol.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [ol.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [ol.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [ol.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [ol.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [ol.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [ol.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [ol.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [ol.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ol.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [ol.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [ol.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [ol.accessKey: IDL set to true]
+ expected: FAIL
+
+ [ol.accessKey: IDL set to false]
+ expected: FAIL
+
+ [ol.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [ol.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [ol.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [ol.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [ol.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [ol.accessKey: IDL set to null]
+ expected: FAIL
+
+ [ol.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [ol.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [ol.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [ol.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [ol.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [ol.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [ol.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [ol.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [ol.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [ol.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [ol.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [ol.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [ol.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [ol.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [ol.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [ol.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [ol.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [ol.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [ol.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [ol.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [ol.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [ol.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [ol.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [ol.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [ol.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [ol.reversed: setAttribute() to ""]
+ expected: FAIL
+
+ [ol.reversed: setAttribute() to " foo "]
+ expected: FAIL
+
+ [ol.reversed: setAttribute() to undefined]
+ expected: FAIL
+
+ [ol.reversed: setAttribute() to null]
+ expected: FAIL
+
+ [ol.reversed: setAttribute() to 7]
+ expected: FAIL
+
+ [ol.reversed: setAttribute() to 1.5]
+ expected: FAIL
+
+ [ol.reversed: setAttribute() to true]
+ expected: FAIL
+
+ [ol.reversed: setAttribute() to false]
+ expected: FAIL
+
+ [ol.reversed: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [ol.reversed: setAttribute() to NaN]
+ expected: FAIL
+
+ [ol.reversed: setAttribute() to Infinity]
+ expected: FAIL
+
+ [ol.reversed: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [ol.reversed: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [ol.reversed: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [ol.reversed: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [ol.reversed: setAttribute() to "reversed"]
+ expected: FAIL
+
+ [ol.reversed: IDL set to ""]
+ expected: FAIL
+
+ [ol.reversed: IDL set to " foo "]
+ expected: FAIL
+
+ [ol.reversed: IDL set to undefined]
+ expected: FAIL
+
+ [ol.reversed: IDL set to null]
+ expected: FAIL
+
+ [ol.reversed: IDL set to 7]
+ expected: FAIL
+
+ [ol.reversed: IDL set to 1.5]
+ expected: FAIL
+
+ [ol.reversed: IDL set to false]
+ expected: FAIL
+
+ [ol.reversed: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [ol.reversed: IDL set to NaN]
+ expected: FAIL
+
+ [ol.reversed: IDL set to Infinity]
+ expected: FAIL
+
+ [ol.reversed: IDL set to -Infinity]
+ expected: FAIL
+
+ [ol.reversed: IDL set to "\\0"]
+ expected: FAIL
+
+ [ol.reversed: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [ol.reversed: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to -36]
+ expected: FAIL
+
+ [ol.start: setAttribute() to -1]
+ expected: FAIL
+
+ [ol.start: setAttribute() to 0]
+ expected: FAIL
+
+ [ol.start: setAttribute() to 1]
+ expected: FAIL
+
+ [ol.start: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [ol.start: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [ol.start: setAttribute() to 2147483648]
+ expected: FAIL
+
+ [ol.start: setAttribute() to -2147483649]
+ expected: FAIL
+
+ [ol.start: setAttribute() to 4294967295]
+ expected: FAIL
+
+ [ol.start: setAttribute() to 4294967296]
+ expected: FAIL
+
+ [ol.start: setAttribute() to ""]
+ expected: FAIL
+
+ [ol.start: setAttribute() to "-1"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to "-0"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to "0"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to "1"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ol.start: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to "\\v7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to " 7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to " 7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to "7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to "
7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to "
7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to " 7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to "᠎7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to " 7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to " 7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to " 7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to " 7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to " 7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to " 7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to " 7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to " 7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to " 7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to " 7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to " 7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to " 7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to " 7"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to undefined]
+ expected: FAIL
+
+ [ol.start: setAttribute() to 1.5]
+ expected: FAIL
+
+ [ol.start: setAttribute() to true]
+ expected: FAIL
+
+ [ol.start: setAttribute() to false]
+ expected: FAIL
+
+ [ol.start: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to NaN]
+ expected: FAIL
+
+ [ol.start: setAttribute() to Infinity]
+ expected: FAIL
+
+ [ol.start: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [ol.start: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to object "2"]
+ expected: FAIL
+
+ [ol.start: setAttribute() to object "3"]
+ expected: FAIL
+
+ [ol.start: IDL set to -36]
+ expected: FAIL
+
+ [ol.start: IDL set to -1]
+ expected: FAIL
+
+ [ol.start: IDL set to 0]
+ expected: FAIL
+
+ [ol.start: IDL set to 1]
+ expected: FAIL
+
+ [ol.start: IDL set to 2147483647]
+ expected: FAIL
+
+ [ol.start: IDL set to -2147483648]
+ expected: FAIL
+
+ [ol.type: setAttribute() to ""]
+ expected: FAIL
+
+ [ol.type: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ol.type: setAttribute() to undefined]
+ expected: FAIL
+
+ [ol.type: setAttribute() to 7]
+ expected: FAIL
+
+ [ol.type: setAttribute() to 1.5]
+ expected: FAIL
+
+ [ol.type: setAttribute() to true]
+ expected: FAIL
+
+ [ol.type: setAttribute() to false]
+ expected: FAIL
+
+ [ol.type: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [ol.type: setAttribute() to NaN]
+ expected: FAIL
+
+ [ol.type: setAttribute() to Infinity]
+ expected: FAIL
+
+ [ol.type: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [ol.type: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [ol.type: setAttribute() to null]
+ expected: FAIL
+
+ [ol.type: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [ol.type: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [ol.type: IDL set to ""]
+ expected: FAIL
+
+ [ol.type: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ol.type: IDL set to undefined]
+ expected: FAIL
+
+ [ol.type: IDL set to 7]
+ expected: FAIL
+
+ [ol.type: IDL set to 1.5]
+ expected: FAIL
+
+ [ol.type: IDL set to true]
+ expected: FAIL
+
+ [ol.type: IDL set to false]
+ expected: FAIL
+
+ [ol.type: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [ol.type: IDL set to NaN]
+ expected: FAIL
+
+ [ol.type: IDL set to Infinity]
+ expected: FAIL
+
+ [ol.type: IDL set to -Infinity]
+ expected: FAIL
+
+ [ol.type: IDL set to "\\0"]
+ expected: FAIL
+
+ [ol.type: IDL set to null]
+ expected: FAIL
+
+ [ol.type: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [ol.type: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [ol.compact: setAttribute() to ""]
+ expected: FAIL
+
+ [ol.compact: setAttribute() to " foo "]
+ expected: FAIL
+
+ [ol.compact: setAttribute() to undefined]
+ expected: FAIL
+
+ [ol.compact: setAttribute() to null]
+ expected: FAIL
+
+ [ol.compact: setAttribute() to 7]
+ expected: FAIL
+
+ [ol.compact: setAttribute() to 1.5]
+ expected: FAIL
+
+ [ol.compact: setAttribute() to true]
+ expected: FAIL
+
+ [ol.compact: setAttribute() to false]
+ expected: FAIL
+
+ [ol.compact: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [ol.compact: setAttribute() to NaN]
+ expected: FAIL
+
+ [ol.compact: setAttribute() to Infinity]
+ expected: FAIL
+
+ [ol.compact: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [ol.compact: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [ol.compact: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [ol.compact: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [ol.compact: setAttribute() to "compact"]
+ expected: FAIL
+
+ [ol.compact: IDL set to ""]
+ expected: FAIL
+
+ [ol.compact: IDL set to " foo "]
+ expected: FAIL
+
+ [ol.compact: IDL set to undefined]
+ expected: FAIL
+
+ [ol.compact: IDL set to null]
+ expected: FAIL
+
+ [ol.compact: IDL set to 7]
+ expected: FAIL
+
+ [ol.compact: IDL set to 1.5]
+ expected: FAIL
+
+ [ol.compact: IDL set to false]
+ expected: FAIL
+
+ [ol.compact: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [ol.compact: IDL set to NaN]
+ expected: FAIL
+
+ [ol.compact: IDL set to Infinity]
+ expected: FAIL
+
+ [ol.compact: IDL set to -Infinity]
+ expected: FAIL
+
+ [ol.compact: IDL set to "\\0"]
+ expected: FAIL
+
+ [ol.compact: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [ol.compact: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to true]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to false]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to null]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [ul.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [ul.dir: IDL set to ""]
+ expected: FAIL
+
+ [ul.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ul.dir: IDL set to undefined]
+ expected: FAIL
+
+ [ul.dir: IDL set to 7]
+ expected: FAIL
+
+ [ul.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [ul.dir: IDL set to true]
+ expected: FAIL
+
+ [ul.dir: IDL set to false]
+ expected: FAIL
+
+ [ul.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [ul.dir: IDL set to NaN]
+ expected: FAIL
+
+ [ul.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [ul.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [ul.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [ul.dir: IDL set to null]
+ expected: FAIL
+
+ [ul.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [ul.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [ul.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [ul.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [ul.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [ul.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [ul.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [ul.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [ul.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [ul.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [ul.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [ul.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [ul.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [ul.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [ul.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [ul.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [ul.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [ul.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [ul.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ul.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [ul.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [ul.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [ul.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [ul.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [ul.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [ul.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [ul.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [ul.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [ul.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [ul.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [ul.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [ul.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [ul.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [ul.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ul.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [ul.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [ul.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [ul.accessKey: IDL set to true]
+ expected: FAIL
+
+ [ul.accessKey: IDL set to false]
+ expected: FAIL
+
+ [ul.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [ul.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [ul.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [ul.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [ul.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [ul.accessKey: IDL set to null]
+ expected: FAIL
+
+ [ul.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [ul.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [ul.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [ul.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [ul.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [ul.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [ul.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [ul.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [ul.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [ul.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [ul.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [ul.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [ul.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [ul.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [ul.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [ul.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [ul.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [ul.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [ul.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [ul.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [ul.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [ul.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [ul.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [ul.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [ul.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [ul.compact: setAttribute() to ""]
+ expected: FAIL
+
+ [ul.compact: setAttribute() to " foo "]
+ expected: FAIL
+
+ [ul.compact: setAttribute() to undefined]
+ expected: FAIL
+
+ [ul.compact: setAttribute() to null]
+ expected: FAIL
+
+ [ul.compact: setAttribute() to 7]
+ expected: FAIL
+
+ [ul.compact: setAttribute() to 1.5]
+ expected: FAIL
+
+ [ul.compact: setAttribute() to true]
+ expected: FAIL
+
+ [ul.compact: setAttribute() to false]
+ expected: FAIL
+
+ [ul.compact: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [ul.compact: setAttribute() to NaN]
+ expected: FAIL
+
+ [ul.compact: setAttribute() to Infinity]
+ expected: FAIL
+
+ [ul.compact: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [ul.compact: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [ul.compact: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [ul.compact: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [ul.compact: setAttribute() to "compact"]
+ expected: FAIL
+
+ [ul.compact: IDL set to ""]
+ expected: FAIL
+
+ [ul.compact: IDL set to " foo "]
+ expected: FAIL
+
+ [ul.compact: IDL set to undefined]
+ expected: FAIL
+
+ [ul.compact: IDL set to null]
+ expected: FAIL
+
+ [ul.compact: IDL set to 7]
+ expected: FAIL
+
+ [ul.compact: IDL set to 1.5]
+ expected: FAIL
+
+ [ul.compact: IDL set to false]
+ expected: FAIL
+
+ [ul.compact: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [ul.compact: IDL set to NaN]
+ expected: FAIL
+
+ [ul.compact: IDL set to Infinity]
+ expected: FAIL
+
+ [ul.compact: IDL set to -Infinity]
+ expected: FAIL
+
+ [ul.compact: IDL set to "\\0"]
+ expected: FAIL
+
+ [ul.compact: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [ul.compact: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [ul.type: setAttribute() to ""]
+ expected: FAIL
+
+ [ul.type: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ul.type: setAttribute() to undefined]
+ expected: FAIL
+
+ [ul.type: setAttribute() to 7]
+ expected: FAIL
+
+ [ul.type: setAttribute() to 1.5]
+ expected: FAIL
+
+ [ul.type: setAttribute() to true]
+ expected: FAIL
+
+ [ul.type: setAttribute() to false]
+ expected: FAIL
+
+ [ul.type: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [ul.type: setAttribute() to NaN]
+ expected: FAIL
+
+ [ul.type: setAttribute() to Infinity]
+ expected: FAIL
+
+ [ul.type: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [ul.type: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [ul.type: setAttribute() to null]
+ expected: FAIL
+
+ [ul.type: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [ul.type: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [ul.type: IDL set to ""]
+ expected: FAIL
+
+ [ul.type: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ul.type: IDL set to undefined]
+ expected: FAIL
+
+ [ul.type: IDL set to 7]
+ expected: FAIL
+
+ [ul.type: IDL set to 1.5]
+ expected: FAIL
+
+ [ul.type: IDL set to true]
+ expected: FAIL
+
+ [ul.type: IDL set to false]
+ expected: FAIL
+
+ [ul.type: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [ul.type: IDL set to NaN]
+ expected: FAIL
+
+ [ul.type: IDL set to Infinity]
+ expected: FAIL
+
+ [ul.type: IDL set to -Infinity]
+ expected: FAIL
+
+ [ul.type: IDL set to "\\0"]
+ expected: FAIL
+
+ [ul.type: IDL set to null]
+ expected: FAIL
+
+ [ul.type: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [ul.type: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [li.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [li.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [li.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [li.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [li.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [li.dir: setAttribute() to true]
+ expected: FAIL
+
+ [li.dir: setAttribute() to false]
+ expected: FAIL
+
+ [li.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [li.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [li.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [li.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [li.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [li.dir: setAttribute() to null]
+ expected: FAIL
+
+ [li.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [li.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [li.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [li.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [li.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [li.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [li.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [li.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [li.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [li.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [li.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [li.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [li.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [li.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [li.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [li.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [li.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [li.dir: IDL set to ""]
+ expected: FAIL
+
+ [li.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [li.dir: IDL set to undefined]
+ expected: FAIL
+
+ [li.dir: IDL set to 7]
+ expected: FAIL
+
+ [li.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [li.dir: IDL set to true]
+ expected: FAIL
+
+ [li.dir: IDL set to false]
+ expected: FAIL
+
+ [li.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [li.dir: IDL set to NaN]
+ expected: FAIL
+
+ [li.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [li.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [li.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [li.dir: IDL set to null]
+ expected: FAIL
+
+ [li.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [li.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [li.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [li.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [li.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [li.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [li.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [li.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [li.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [li.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [li.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [li.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [li.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [li.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [li.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [li.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [li.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [li.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [li.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [li.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [li.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [li.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [li.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [li.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [li.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [li.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [li.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [li.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [li.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [li.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [li.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [li.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [li.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [li.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [li.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [li.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [li.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [li.accessKey: IDL set to true]
+ expected: FAIL
+
+ [li.accessKey: IDL set to false]
+ expected: FAIL
+
+ [li.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [li.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [li.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [li.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [li.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [li.accessKey: IDL set to null]
+ expected: FAIL
+
+ [li.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [li.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [li.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [li.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [li.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [li.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [li.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [li.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [li.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [li.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [li.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [li.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [li.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [li.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [li.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [li.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [li.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [li.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [li.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [li.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [li.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [li.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [li.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [li.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [li.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [li.type: setAttribute() to ""]
+ expected: FAIL
+
+ [li.type: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [li.type: setAttribute() to undefined]
+ expected: FAIL
+
+ [li.type: setAttribute() to 7]
+ expected: FAIL
+
+ [li.type: setAttribute() to 1.5]
+ expected: FAIL
+
+ [li.type: setAttribute() to true]
+ expected: FAIL
+
+ [li.type: setAttribute() to false]
+ expected: FAIL
+
+ [li.type: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [li.type: setAttribute() to NaN]
+ expected: FAIL
+
+ [li.type: setAttribute() to Infinity]
+ expected: FAIL
+
+ [li.type: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [li.type: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [li.type: setAttribute() to null]
+ expected: FAIL
+
+ [li.type: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [li.type: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [li.type: IDL set to ""]
+ expected: FAIL
+
+ [li.type: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [li.type: IDL set to undefined]
+ expected: FAIL
+
+ [li.type: IDL set to 7]
+ expected: FAIL
+
+ [li.type: IDL set to 1.5]
+ expected: FAIL
+
+ [li.type: IDL set to true]
+ expected: FAIL
+
+ [li.type: IDL set to false]
+ expected: FAIL
+
+ [li.type: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [li.type: IDL set to NaN]
+ expected: FAIL
+
+ [li.type: IDL set to Infinity]
+ expected: FAIL
+
+ [li.type: IDL set to -Infinity]
+ expected: FAIL
+
+ [li.type: IDL set to "\\0"]
+ expected: FAIL
+
+ [li.type: IDL set to null]
+ expected: FAIL
+
+ [li.type: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [li.type: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to true]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to false]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to null]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [dl.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [dl.dir: IDL set to ""]
+ expected: FAIL
+
+ [dl.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dl.dir: IDL set to undefined]
+ expected: FAIL
+
+ [dl.dir: IDL set to 7]
+ expected: FAIL
+
+ [dl.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [dl.dir: IDL set to true]
+ expected: FAIL
+
+ [dl.dir: IDL set to false]
+ expected: FAIL
+
+ [dl.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [dl.dir: IDL set to NaN]
+ expected: FAIL
+
+ [dl.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [dl.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [dl.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [dl.dir: IDL set to null]
+ expected: FAIL
+
+ [dl.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [dl.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [dl.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [dl.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [dl.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [dl.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [dl.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [dl.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [dl.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [dl.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [dl.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [dl.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [dl.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [dl.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [dl.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [dl.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [dl.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [dl.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [dl.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dl.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [dl.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [dl.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [dl.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [dl.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [dl.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [dl.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [dl.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [dl.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [dl.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [dl.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [dl.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [dl.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [dl.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [dl.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dl.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [dl.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [dl.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [dl.accessKey: IDL set to true]
+ expected: FAIL
+
+ [dl.accessKey: IDL set to false]
+ expected: FAIL
+
+ [dl.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [dl.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [dl.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [dl.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [dl.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [dl.accessKey: IDL set to null]
+ expected: FAIL
+
+ [dl.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [dl.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [dl.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [dl.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [dl.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [dl.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [dl.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [dl.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [dl.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [dl.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [dl.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [dl.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [dl.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [dl.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [dl.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [dl.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [dl.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [dl.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [dl.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [dl.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [dl.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [dl.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [dl.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [dl.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [dl.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [dl.compact: setAttribute() to ""]
+ expected: FAIL
+
+ [dl.compact: setAttribute() to " foo "]
+ expected: FAIL
+
+ [dl.compact: setAttribute() to undefined]
+ expected: FAIL
+
+ [dl.compact: setAttribute() to null]
+ expected: FAIL
+
+ [dl.compact: setAttribute() to 7]
+ expected: FAIL
+
+ [dl.compact: setAttribute() to 1.5]
+ expected: FAIL
+
+ [dl.compact: setAttribute() to true]
+ expected: FAIL
+
+ [dl.compact: setAttribute() to false]
+ expected: FAIL
+
+ [dl.compact: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [dl.compact: setAttribute() to NaN]
+ expected: FAIL
+
+ [dl.compact: setAttribute() to Infinity]
+ expected: FAIL
+
+ [dl.compact: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [dl.compact: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [dl.compact: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [dl.compact: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [dl.compact: setAttribute() to "compact"]
+ expected: FAIL
+
+ [dl.compact: IDL set to ""]
+ expected: FAIL
+
+ [dl.compact: IDL set to " foo "]
+ expected: FAIL
+
+ [dl.compact: IDL set to undefined]
+ expected: FAIL
+
+ [dl.compact: IDL set to null]
+ expected: FAIL
+
+ [dl.compact: IDL set to 7]
+ expected: FAIL
+
+ [dl.compact: IDL set to 1.5]
+ expected: FAIL
+
+ [dl.compact: IDL set to false]
+ expected: FAIL
+
+ [dl.compact: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [dl.compact: IDL set to NaN]
+ expected: FAIL
+
+ [dl.compact: IDL set to Infinity]
+ expected: FAIL
+
+ [dl.compact: IDL set to -Infinity]
+ expected: FAIL
+
+ [dl.compact: IDL set to "\\0"]
+ expected: FAIL
+
+ [dl.compact: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [dl.compact: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to true]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to false]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to null]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [dt.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [dt.dir: IDL set to ""]
+ expected: FAIL
+
+ [dt.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dt.dir: IDL set to undefined]
+ expected: FAIL
+
+ [dt.dir: IDL set to 7]
+ expected: FAIL
+
+ [dt.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [dt.dir: IDL set to true]
+ expected: FAIL
+
+ [dt.dir: IDL set to false]
+ expected: FAIL
+
+ [dt.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [dt.dir: IDL set to NaN]
+ expected: FAIL
+
+ [dt.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [dt.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [dt.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [dt.dir: IDL set to null]
+ expected: FAIL
+
+ [dt.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [dt.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [dt.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [dt.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [dt.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [dt.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [dt.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [dt.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [dt.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [dt.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [dt.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [dt.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [dt.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [dt.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [dt.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [dt.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [dt.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [dt.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [dt.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dt.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [dt.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [dt.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [dt.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [dt.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [dt.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [dt.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [dt.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [dt.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [dt.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [dt.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [dt.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [dt.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [dt.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [dt.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dt.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [dt.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [dt.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [dt.accessKey: IDL set to true]
+ expected: FAIL
+
+ [dt.accessKey: IDL set to false]
+ expected: FAIL
+
+ [dt.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [dt.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [dt.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [dt.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [dt.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [dt.accessKey: IDL set to null]
+ expected: FAIL
+
+ [dt.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [dt.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [dt.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [dt.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [dt.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [dt.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [dt.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [dt.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [dt.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [dt.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [dt.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [dt.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [dt.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [dt.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [dt.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [dt.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [dt.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [dt.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [dt.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [dt.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [dt.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [dt.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [dt.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [dt.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [dt.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to true]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to false]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to null]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [dd.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [dd.dir: IDL set to ""]
+ expected: FAIL
+
+ [dd.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dd.dir: IDL set to undefined]
+ expected: FAIL
+
+ [dd.dir: IDL set to 7]
+ expected: FAIL
+
+ [dd.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [dd.dir: IDL set to true]
+ expected: FAIL
+
+ [dd.dir: IDL set to false]
+ expected: FAIL
+
+ [dd.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [dd.dir: IDL set to NaN]
+ expected: FAIL
+
+ [dd.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [dd.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [dd.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [dd.dir: IDL set to null]
+ expected: FAIL
+
+ [dd.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [dd.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [dd.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [dd.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [dd.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [dd.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [dd.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [dd.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [dd.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [dd.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [dd.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [dd.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [dd.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [dd.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [dd.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [dd.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [dd.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [dd.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [dd.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dd.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [dd.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [dd.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [dd.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [dd.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [dd.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [dd.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [dd.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [dd.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [dd.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [dd.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [dd.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [dd.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [dd.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [dd.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dd.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [dd.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [dd.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [dd.accessKey: IDL set to true]
+ expected: FAIL
+
+ [dd.accessKey: IDL set to false]
+ expected: FAIL
+
+ [dd.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [dd.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [dd.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [dd.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [dd.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [dd.accessKey: IDL set to null]
+ expected: FAIL
+
+ [dd.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [dd.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [dd.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [dd.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [dd.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [dd.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [dd.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [dd.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [dd.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [dd.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [dd.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [dd.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [dd.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [dd.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [dd.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [dd.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [dd.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [dd.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [dd.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [dd.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [dd.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [dd.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [dd.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [dd.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [dd.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to true]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to false]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to null]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [figure.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [figure.dir: IDL set to ""]
+ expected: FAIL
+
+ [figure.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [figure.dir: IDL set to undefined]
+ expected: FAIL
+
+ [figure.dir: IDL set to 7]
+ expected: FAIL
+
+ [figure.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [figure.dir: IDL set to true]
+ expected: FAIL
+
+ [figure.dir: IDL set to false]
+ expected: FAIL
+
+ [figure.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [figure.dir: IDL set to NaN]
+ expected: FAIL
+
+ [figure.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [figure.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [figure.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [figure.dir: IDL set to null]
+ expected: FAIL
+
+ [figure.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [figure.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [figure.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [figure.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [figure.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [figure.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [figure.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [figure.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [figure.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [figure.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [figure.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [figure.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [figure.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [figure.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [figure.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [figure.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [figure.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [figure.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [figure.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [figure.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [figure.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [figure.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [figure.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [figure.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [figure.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [figure.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [figure.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [figure.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [figure.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [figure.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [figure.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [figure.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [figure.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [figure.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [figure.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [figure.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [figure.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [figure.accessKey: IDL set to true]
+ expected: FAIL
+
+ [figure.accessKey: IDL set to false]
+ expected: FAIL
+
+ [figure.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [figure.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [figure.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [figure.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [figure.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [figure.accessKey: IDL set to null]
+ expected: FAIL
+
+ [figure.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [figure.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [figure.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [figure.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [figure.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [figure.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [figure.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [figure.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [figure.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [figure.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [figure.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [figure.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [figure.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [figure.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [figure.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [figure.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [figure.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [figure.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [figure.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [figure.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [figure.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [figure.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [figure.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [figure.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [figure.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to true]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to false]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to null]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [figcaption.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to ""]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to undefined]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to 7]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to true]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to false]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to NaN]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to null]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [figcaption.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [figcaption.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [figcaption.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [figcaption.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [figcaption.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [figcaption.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [figcaption.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [figcaption.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [figcaption.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [figcaption.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [figcaption.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [figcaption.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [figcaption.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [figcaption.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [figcaption.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [figcaption.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [figcaption.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [figcaption.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [figcaption.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [figcaption.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [figcaption.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [figcaption.accessKey: IDL set to true]
+ expected: FAIL
+
+ [figcaption.accessKey: IDL set to false]
+ expected: FAIL
+
+ [figcaption.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [figcaption.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [figcaption.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [figcaption.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [figcaption.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [figcaption.accessKey: IDL set to null]
+ expected: FAIL
+
+ [figcaption.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [figcaption.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [figcaption.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [figcaption.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [figcaption.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [figcaption.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [figcaption.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [figcaption.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [figcaption.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [figcaption.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [figcaption.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [figcaption.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [figcaption.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [figcaption.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [figcaption.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [figcaption.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [figcaption.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [figcaption.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [figcaption.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [figcaption.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [figcaption.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [figcaption.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [figcaption.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [figcaption.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [figcaption.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [main.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [main.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [main.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [main.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [main.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [main.dir: setAttribute() to true]
+ expected: FAIL
+
+ [main.dir: setAttribute() to false]
+ expected: FAIL
+
+ [main.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [main.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [main.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [main.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [main.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [main.dir: setAttribute() to null]
+ expected: FAIL
+
+ [main.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [main.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [main.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [main.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [main.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [main.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [main.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [main.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [main.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [main.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [main.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [main.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [main.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [main.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [main.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [main.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [main.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [main.dir: IDL set to ""]
+ expected: FAIL
+
+ [main.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [main.dir: IDL set to undefined]
+ expected: FAIL
+
+ [main.dir: IDL set to 7]
+ expected: FAIL
+
+ [main.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [main.dir: IDL set to true]
+ expected: FAIL
+
+ [main.dir: IDL set to false]
+ expected: FAIL
+
+ [main.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [main.dir: IDL set to NaN]
+ expected: FAIL
+
+ [main.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [main.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [main.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [main.dir: IDL set to null]
+ expected: FAIL
+
+ [main.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [main.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [main.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [main.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [main.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [main.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [main.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [main.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [main.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [main.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [main.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [main.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [main.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [main.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [main.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [main.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [main.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [main.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [main.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [main.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [main.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [main.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [main.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [main.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [main.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [main.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [main.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [main.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [main.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [main.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [main.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [main.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [main.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [main.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [main.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [main.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [main.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [main.accessKey: IDL set to true]
+ expected: FAIL
+
+ [main.accessKey: IDL set to false]
+ expected: FAIL
+
+ [main.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [main.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [main.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [main.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [main.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [main.accessKey: IDL set to null]
+ expected: FAIL
+
+ [main.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [main.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [main.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [main.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [main.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [main.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [main.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [main.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [main.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [main.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [main.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [main.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [main.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [main.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [main.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [main.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [main.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [main.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [main.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [main.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [main.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [main.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [main.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [main.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [main.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [div.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [div.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [div.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [div.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [div.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [div.dir: setAttribute() to true]
+ expected: FAIL
+
+ [div.dir: setAttribute() to false]
+ expected: FAIL
+
+ [div.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [div.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [div.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [div.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [div.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [div.dir: setAttribute() to null]
+ expected: FAIL
+
+ [div.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [div.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [div.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [div.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [div.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [div.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [div.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [div.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [div.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [div.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [div.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [div.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [div.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [div.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [div.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [div.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [div.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [div.dir: IDL set to ""]
+ expected: FAIL
+
+ [div.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [div.dir: IDL set to undefined]
+ expected: FAIL
+
+ [div.dir: IDL set to 7]
+ expected: FAIL
+
+ [div.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [div.dir: IDL set to true]
+ expected: FAIL
+
+ [div.dir: IDL set to false]
+ expected: FAIL
+
+ [div.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [div.dir: IDL set to NaN]
+ expected: FAIL
+
+ [div.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [div.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [div.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [div.dir: IDL set to null]
+ expected: FAIL
+
+ [div.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [div.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [div.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [div.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [div.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [div.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [div.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [div.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [div.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [div.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [div.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [div.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [div.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [div.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [div.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [div.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [div.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [div.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [div.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [div.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [div.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [div.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [div.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [div.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [div.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [div.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [div.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [div.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [div.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [div.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [div.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [div.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [div.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [div.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [div.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [div.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [div.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [div.accessKey: IDL set to true]
+ expected: FAIL
+
+ [div.accessKey: IDL set to false]
+ expected: FAIL
+
+ [div.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [div.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [div.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [div.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [div.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [div.accessKey: IDL set to null]
+ expected: FAIL
+
+ [div.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [div.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [div.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [div.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [div.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [div.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [div.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [div.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [div.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [div.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [div.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [div.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [div.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [div.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [div.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [div.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [div.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [div.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [div.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [div.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [div.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [div.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [div.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [div.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [div.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/dom/reflection-metadata.html.ini b/tests/wpt/metadata/html/dom/reflection-metadata.html.ini
index c71a4f117a5..74061a4a1b7 100644
--- a/tests/wpt/metadata/html/dom/reflection-metadata.html.ini
+++ b/tests/wpt/metadata/html/dom/reflection-metadata.html.ini
@@ -7386,3 +7386,2637 @@
[link.crossOrigin: IDL set to null followed by getAttribute()]
expected: FAIL
+ [head.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [head.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [head.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [head.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [head.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [head.dir: setAttribute() to true]
+ expected: FAIL
+
+ [head.dir: setAttribute() to false]
+ expected: FAIL
+
+ [head.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [head.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [head.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [head.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [head.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [head.dir: setAttribute() to null]
+ expected: FAIL
+
+ [head.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [head.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [head.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [head.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [head.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [head.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [head.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [head.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [head.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [head.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [head.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [head.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [head.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [head.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [head.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [head.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [head.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [head.dir: IDL set to ""]
+ expected: FAIL
+
+ [head.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [head.dir: IDL set to undefined]
+ expected: FAIL
+
+ [head.dir: IDL set to 7]
+ expected: FAIL
+
+ [head.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [head.dir: IDL set to true]
+ expected: FAIL
+
+ [head.dir: IDL set to false]
+ expected: FAIL
+
+ [head.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [head.dir: IDL set to NaN]
+ expected: FAIL
+
+ [head.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [head.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [head.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [head.dir: IDL set to null]
+ expected: FAIL
+
+ [head.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [head.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [head.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [head.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [head.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [head.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [head.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [head.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [head.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [head.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [head.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [head.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [head.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [head.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [head.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [head.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [head.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [head.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [head.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [head.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [head.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [head.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [head.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [head.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [head.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [head.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [head.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [head.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [head.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [head.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [head.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [head.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [head.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [head.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [head.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [head.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [head.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [head.accessKey: IDL set to true]
+ expected: FAIL
+
+ [head.accessKey: IDL set to false]
+ expected: FAIL
+
+ [head.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [head.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [head.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [head.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [head.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [head.accessKey: IDL set to null]
+ expected: FAIL
+
+ [head.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [head.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [head.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [head.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [head.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [head.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [head.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [head.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [head.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [head.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [head.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [head.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [head.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [head.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [head.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [head.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [head.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [head.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [head.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [head.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [head.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [head.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [head.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [head.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [head.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [title.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [title.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [title.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [title.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [title.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [title.dir: setAttribute() to true]
+ expected: FAIL
+
+ [title.dir: setAttribute() to false]
+ expected: FAIL
+
+ [title.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [title.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [title.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [title.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [title.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [title.dir: setAttribute() to null]
+ expected: FAIL
+
+ [title.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [title.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [title.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [title.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [title.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [title.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [title.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [title.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [title.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [title.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [title.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [title.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [title.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [title.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [title.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [title.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [title.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [title.dir: IDL set to ""]
+ expected: FAIL
+
+ [title.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [title.dir: IDL set to undefined]
+ expected: FAIL
+
+ [title.dir: IDL set to 7]
+ expected: FAIL
+
+ [title.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [title.dir: IDL set to true]
+ expected: FAIL
+
+ [title.dir: IDL set to false]
+ expected: FAIL
+
+ [title.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [title.dir: IDL set to NaN]
+ expected: FAIL
+
+ [title.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [title.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [title.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [title.dir: IDL set to null]
+ expected: FAIL
+
+ [title.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [title.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [title.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [title.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [title.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [title.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [title.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [title.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [title.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [title.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [title.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [title.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [title.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [title.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [title.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [title.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [title.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [title.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [title.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [title.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [title.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [title.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [title.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [title.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [title.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [title.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [title.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [title.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [title.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [title.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [title.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [title.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [title.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [title.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [title.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [title.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [title.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [title.accessKey: IDL set to true]
+ expected: FAIL
+
+ [title.accessKey: IDL set to false]
+ expected: FAIL
+
+ [title.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [title.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [title.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [title.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [title.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [title.accessKey: IDL set to null]
+ expected: FAIL
+
+ [title.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [title.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [title.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [title.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [title.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [title.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [title.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [title.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [title.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [title.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [title.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [title.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [title.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [title.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [title.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [title.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [title.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [title.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [title.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [title.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [title.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [title.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [title.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [title.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [title.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [base.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [base.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [base.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [base.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [base.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [base.dir: setAttribute() to true]
+ expected: FAIL
+
+ [base.dir: setAttribute() to false]
+ expected: FAIL
+
+ [base.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [base.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [base.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [base.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [base.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [base.dir: setAttribute() to null]
+ expected: FAIL
+
+ [base.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [base.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [base.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [base.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [base.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [base.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [base.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [base.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [base.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [base.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [base.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [base.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [base.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [base.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [base.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [base.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [base.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [base.dir: IDL set to ""]
+ expected: FAIL
+
+ [base.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [base.dir: IDL set to undefined]
+ expected: FAIL
+
+ [base.dir: IDL set to 7]
+ expected: FAIL
+
+ [base.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [base.dir: IDL set to true]
+ expected: FAIL
+
+ [base.dir: IDL set to false]
+ expected: FAIL
+
+ [base.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [base.dir: IDL set to NaN]
+ expected: FAIL
+
+ [base.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [base.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [base.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [base.dir: IDL set to null]
+ expected: FAIL
+
+ [base.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [base.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [base.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [base.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [base.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [base.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [base.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [base.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [base.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [base.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [base.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [base.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [base.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [base.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [base.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [base.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [base.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [base.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [base.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [base.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [base.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [base.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [base.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [base.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [base.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [base.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [base.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [base.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [base.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [base.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [base.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [base.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [base.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [base.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [base.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [base.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [base.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [base.accessKey: IDL set to true]
+ expected: FAIL
+
+ [base.accessKey: IDL set to false]
+ expected: FAIL
+
+ [base.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [base.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [base.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [base.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [base.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [base.accessKey: IDL set to null]
+ expected: FAIL
+
+ [base.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [base.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [base.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [base.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [base.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [base.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [base.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [base.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [base.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [base.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [base.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [base.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [base.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [base.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [base.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [base.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [base.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [base.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [base.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [base.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [base.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [base.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [base.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [base.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [base.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [base.target: setAttribute() to ""]
+ expected: FAIL
+
+ [base.target: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [base.target: setAttribute() to undefined]
+ expected: FAIL
+
+ [base.target: setAttribute() to 7]
+ expected: FAIL
+
+ [base.target: setAttribute() to 1.5]
+ expected: FAIL
+
+ [base.target: setAttribute() to true]
+ expected: FAIL
+
+ [base.target: setAttribute() to false]
+ expected: FAIL
+
+ [base.target: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [base.target: setAttribute() to NaN]
+ expected: FAIL
+
+ [base.target: setAttribute() to Infinity]
+ expected: FAIL
+
+ [base.target: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [base.target: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [base.target: setAttribute() to null]
+ expected: FAIL
+
+ [base.target: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [base.target: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [base.target: IDL set to ""]
+ expected: FAIL
+
+ [base.target: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [base.target: IDL set to undefined]
+ expected: FAIL
+
+ [base.target: IDL set to 7]
+ expected: FAIL
+
+ [base.target: IDL set to 1.5]
+ expected: FAIL
+
+ [base.target: IDL set to true]
+ expected: FAIL
+
+ [base.target: IDL set to false]
+ expected: FAIL
+
+ [base.target: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [base.target: IDL set to NaN]
+ expected: FAIL
+
+ [base.target: IDL set to Infinity]
+ expected: FAIL
+
+ [base.target: IDL set to -Infinity]
+ expected: FAIL
+
+ [base.target: IDL set to "\\0"]
+ expected: FAIL
+
+ [base.target: IDL set to null]
+ expected: FAIL
+
+ [base.target: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [base.target: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [link.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [link.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [link.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [link.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [link.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [link.dir: setAttribute() to true]
+ expected: FAIL
+
+ [link.dir: setAttribute() to false]
+ expected: FAIL
+
+ [link.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [link.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [link.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [link.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [link.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [link.dir: setAttribute() to null]
+ expected: FAIL
+
+ [link.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [link.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [link.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [link.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [link.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [link.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [link.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [link.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [link.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [link.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [link.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [link.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [link.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [link.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [link.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [link.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [link.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [link.dir: IDL set to ""]
+ expected: FAIL
+
+ [link.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [link.dir: IDL set to undefined]
+ expected: FAIL
+
+ [link.dir: IDL set to 7]
+ expected: FAIL
+
+ [link.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [link.dir: IDL set to true]
+ expected: FAIL
+
+ [link.dir: IDL set to false]
+ expected: FAIL
+
+ [link.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [link.dir: IDL set to NaN]
+ expected: FAIL
+
+ [link.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [link.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [link.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [link.dir: IDL set to null]
+ expected: FAIL
+
+ [link.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [link.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [link.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [link.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [link.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [link.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [link.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [link.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [link.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [link.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [link.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [link.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [link.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [link.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [link.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [link.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [link.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [link.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [link.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [link.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [link.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [link.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [link.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [link.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [link.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [link.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [link.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [link.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [link.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [link.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [link.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [link.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [link.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [link.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [link.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [link.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [link.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [link.accessKey: IDL set to true]
+ expected: FAIL
+
+ [link.accessKey: IDL set to false]
+ expected: FAIL
+
+ [link.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [link.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [link.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [link.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [link.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [link.accessKey: IDL set to null]
+ expected: FAIL
+
+ [link.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [link.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [link.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [link.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [link.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [link.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [link.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [link.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [link.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [link.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [link.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [link.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [link.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [link.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [link.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [link.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [link.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [link.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [link.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [link.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [link.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [link.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [link.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [link.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [link.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to ""]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to undefined]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to 7]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to 1.5]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to true]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to false]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to NaN]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to Infinity]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to null]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to "anonymous"]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to "xanonymous"]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to "anonymous\\0"]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to "nonymous"]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to "ANONYMOUS"]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to "use-credentials"]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to "xuse-credentials"]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to "use-credentials\\0"]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to "se-credentials"]
+ expected: FAIL
+
+ [link.crossOrigin: setAttribute() to "USE-CREDENTIALS"]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to ""]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to undefined]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to 7]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to 1.5]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to true]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to false]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to NaN]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to Infinity]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to -Infinity]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to "\\0"]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to null]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to "anonymous"]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to "xanonymous"]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to "anonymous\\0"]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to "nonymous"]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to "ANONYMOUS"]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to "use-credentials"]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to "xuse-credentials"]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to "use-credentials\\0"]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to "se-credentials"]
+ expected: FAIL
+
+ [link.crossOrigin: IDL set to "USE-CREDENTIALS"]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to true]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to false]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to null]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [meta.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [meta.dir: IDL set to ""]
+ expected: FAIL
+
+ [meta.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [meta.dir: IDL set to undefined]
+ expected: FAIL
+
+ [meta.dir: IDL set to 7]
+ expected: FAIL
+
+ [meta.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [meta.dir: IDL set to true]
+ expected: FAIL
+
+ [meta.dir: IDL set to false]
+ expected: FAIL
+
+ [meta.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [meta.dir: IDL set to NaN]
+ expected: FAIL
+
+ [meta.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [meta.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [meta.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [meta.dir: IDL set to null]
+ expected: FAIL
+
+ [meta.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [meta.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [meta.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [meta.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [meta.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [meta.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [meta.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [meta.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [meta.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [meta.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [meta.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [meta.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [meta.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [meta.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [meta.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [meta.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [meta.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [meta.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [meta.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [meta.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [meta.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [meta.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [meta.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [meta.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [meta.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [meta.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [meta.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [meta.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [meta.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [meta.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [meta.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [meta.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [meta.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [meta.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [meta.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [meta.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [meta.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [meta.accessKey: IDL set to true]
+ expected: FAIL
+
+ [meta.accessKey: IDL set to false]
+ expected: FAIL
+
+ [meta.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [meta.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [meta.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [meta.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [meta.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [meta.accessKey: IDL set to null]
+ expected: FAIL
+
+ [meta.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [meta.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [meta.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [meta.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [meta.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [meta.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [meta.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [meta.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [meta.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [meta.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [meta.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [meta.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [meta.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [meta.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [meta.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [meta.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [meta.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [meta.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [meta.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [meta.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [meta.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [meta.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [meta.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [meta.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [meta.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): setAttribute() to ""]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): setAttribute() to undefined]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): setAttribute() to 7]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): setAttribute() to true]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): setAttribute() to false]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): setAttribute() to NaN]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): setAttribute() to null]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): IDL set to ""]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): IDL set to undefined]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): IDL set to 7]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): IDL set to 1.5]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): IDL set to true]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): IDL set to false]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): IDL set to NaN]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): IDL set to Infinity]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): IDL set to -Infinity]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): IDL set to "\\0"]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): IDL set to null]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [meta.httpEquiv (<meta http-equiv>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [meta.scheme: setAttribute() to ""]
+ expected: FAIL
+
+ [meta.scheme: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [meta.scheme: setAttribute() to undefined]
+ expected: FAIL
+
+ [meta.scheme: setAttribute() to 7]
+ expected: FAIL
+
+ [meta.scheme: setAttribute() to 1.5]
+ expected: FAIL
+
+ [meta.scheme: setAttribute() to true]
+ expected: FAIL
+
+ [meta.scheme: setAttribute() to false]
+ expected: FAIL
+
+ [meta.scheme: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [meta.scheme: setAttribute() to NaN]
+ expected: FAIL
+
+ [meta.scheme: setAttribute() to Infinity]
+ expected: FAIL
+
+ [meta.scheme: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [meta.scheme: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [meta.scheme: setAttribute() to null]
+ expected: FAIL
+
+ [meta.scheme: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [meta.scheme: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [meta.scheme: IDL set to ""]
+ expected: FAIL
+
+ [meta.scheme: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [meta.scheme: IDL set to undefined]
+ expected: FAIL
+
+ [meta.scheme: IDL set to 7]
+ expected: FAIL
+
+ [meta.scheme: IDL set to 1.5]
+ expected: FAIL
+
+ [meta.scheme: IDL set to true]
+ expected: FAIL
+
+ [meta.scheme: IDL set to false]
+ expected: FAIL
+
+ [meta.scheme: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [meta.scheme: IDL set to NaN]
+ expected: FAIL
+
+ [meta.scheme: IDL set to Infinity]
+ expected: FAIL
+
+ [meta.scheme: IDL set to -Infinity]
+ expected: FAIL
+
+ [meta.scheme: IDL set to "\\0"]
+ expected: FAIL
+
+ [meta.scheme: IDL set to null]
+ expected: FAIL
+
+ [meta.scheme: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [meta.scheme: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [style.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [style.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [style.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [style.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [style.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [style.dir: setAttribute() to true]
+ expected: FAIL
+
+ [style.dir: setAttribute() to false]
+ expected: FAIL
+
+ [style.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [style.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [style.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [style.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [style.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [style.dir: setAttribute() to null]
+ expected: FAIL
+
+ [style.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [style.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [style.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [style.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [style.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [style.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [style.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [style.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [style.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [style.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [style.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [style.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [style.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [style.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [style.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [style.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [style.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [style.dir: IDL set to ""]
+ expected: FAIL
+
+ [style.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [style.dir: IDL set to undefined]
+ expected: FAIL
+
+ [style.dir: IDL set to 7]
+ expected: FAIL
+
+ [style.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [style.dir: IDL set to true]
+ expected: FAIL
+
+ [style.dir: IDL set to false]
+ expected: FAIL
+
+ [style.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [style.dir: IDL set to NaN]
+ expected: FAIL
+
+ [style.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [style.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [style.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [style.dir: IDL set to null]
+ expected: FAIL
+
+ [style.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [style.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [style.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [style.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [style.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [style.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [style.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [style.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [style.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [style.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [style.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [style.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [style.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [style.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [style.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [style.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [style.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [style.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [style.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [style.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [style.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [style.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [style.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [style.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [style.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [style.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [style.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [style.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [style.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [style.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [style.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [style.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [style.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [style.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [style.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [style.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [style.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [style.accessKey: IDL set to true]
+ expected: FAIL
+
+ [style.accessKey: IDL set to false]
+ expected: FAIL
+
+ [style.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [style.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [style.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [style.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [style.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [style.accessKey: IDL set to null]
+ expected: FAIL
+
+ [style.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [style.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [style.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [style.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [style.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [style.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [style.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [style.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [style.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [style.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [style.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [style.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [style.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [style.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [style.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [style.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [style.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [style.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [style.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [style.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [style.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [style.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [style.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [style.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [style.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [style.media: setAttribute() to ""]
+ expected: FAIL
+
+ [style.media: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [style.media: setAttribute() to undefined]
+ expected: FAIL
+
+ [style.media: setAttribute() to 7]
+ expected: FAIL
+
+ [style.media: setAttribute() to 1.5]
+ expected: FAIL
+
+ [style.media: setAttribute() to true]
+ expected: FAIL
+
+ [style.media: setAttribute() to false]
+ expected: FAIL
+
+ [style.media: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [style.media: setAttribute() to NaN]
+ expected: FAIL
+
+ [style.media: setAttribute() to Infinity]
+ expected: FAIL
+
+ [style.media: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [style.media: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [style.media: setAttribute() to null]
+ expected: FAIL
+
+ [style.media: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [style.media: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [style.media: IDL set to ""]
+ expected: FAIL
+
+ [style.media: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [style.media: IDL set to undefined]
+ expected: FAIL
+
+ [style.media: IDL set to 7]
+ expected: FAIL
+
+ [style.media: IDL set to 1.5]
+ expected: FAIL
+
+ [style.media: IDL set to true]
+ expected: FAIL
+
+ [style.media: IDL set to false]
+ expected: FAIL
+
+ [style.media: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [style.media: IDL set to NaN]
+ expected: FAIL
+
+ [style.media: IDL set to Infinity]
+ expected: FAIL
+
+ [style.media: IDL set to -Infinity]
+ expected: FAIL
+
+ [style.media: IDL set to "\\0"]
+ expected: FAIL
+
+ [style.media: IDL set to null]
+ expected: FAIL
+
+ [style.media: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [style.media: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [style.type: setAttribute() to ""]
+ expected: FAIL
+
+ [style.type: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [style.type: setAttribute() to undefined]
+ expected: FAIL
+
+ [style.type: setAttribute() to 7]
+ expected: FAIL
+
+ [style.type: setAttribute() to 1.5]
+ expected: FAIL
+
+ [style.type: setAttribute() to true]
+ expected: FAIL
+
+ [style.type: setAttribute() to false]
+ expected: FAIL
+
+ [style.type: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [style.type: setAttribute() to NaN]
+ expected: FAIL
+
+ [style.type: setAttribute() to Infinity]
+ expected: FAIL
+
+ [style.type: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [style.type: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [style.type: setAttribute() to null]
+ expected: FAIL
+
+ [style.type: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [style.type: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [style.type: IDL set to ""]
+ expected: FAIL
+
+ [style.type: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [style.type: IDL set to undefined]
+ expected: FAIL
+
+ [style.type: IDL set to 7]
+ expected: FAIL
+
+ [style.type: IDL set to 1.5]
+ expected: FAIL
+
+ [style.type: IDL set to true]
+ expected: FAIL
+
+ [style.type: IDL set to false]
+ expected: FAIL
+
+ [style.type: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [style.type: IDL set to NaN]
+ expected: FAIL
+
+ [style.type: IDL set to Infinity]
+ expected: FAIL
+
+ [style.type: IDL set to -Infinity]
+ expected: FAIL
+
+ [style.type: IDL set to "\\0"]
+ expected: FAIL
+
+ [style.type: IDL set to null]
+ expected: FAIL
+
+ [style.type: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [style.type: IDL set to object "test-valueOf"]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/dom/reflection-misc.html.ini b/tests/wpt/metadata/html/dom/reflection-misc.html.ini
index bfe086b35fd..c14c806b41a 100644
--- a/tests/wpt/metadata/html/dom/reflection-misc.html.ini
+++ b/tests/wpt/metadata/html/dom/reflection-misc.html.ini
@@ -12231,3 +12231,5286 @@
[dialog.itemId: IDL set to object "test-valueOf" followed by IDL get]
expected: FAIL
+ [html.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [html.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [html.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [html.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [html.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [html.dir: setAttribute() to true]
+ expected: FAIL
+
+ [html.dir: setAttribute() to false]
+ expected: FAIL
+
+ [html.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [html.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [html.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [html.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [html.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [html.dir: setAttribute() to null]
+ expected: FAIL
+
+ [html.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [html.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [html.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [html.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [html.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [html.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [html.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [html.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [html.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [html.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [html.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [html.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [html.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [html.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [html.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [html.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [html.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [html.dir: IDL set to ""]
+ expected: FAIL
+
+ [html.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [html.dir: IDL set to undefined]
+ expected: FAIL
+
+ [html.dir: IDL set to 7]
+ expected: FAIL
+
+ [html.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [html.dir: IDL set to true]
+ expected: FAIL
+
+ [html.dir: IDL set to false]
+ expected: FAIL
+
+ [html.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [html.dir: IDL set to NaN]
+ expected: FAIL
+
+ [html.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [html.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [html.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [html.dir: IDL set to null]
+ expected: FAIL
+
+ [html.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [html.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [html.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [html.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [html.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [html.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [html.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [html.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [html.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [html.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [html.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [html.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [html.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [html.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [html.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [html.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [html.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [html.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [html.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [html.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [html.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [html.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [html.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [html.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [html.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [html.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [html.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [html.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [html.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [html.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [html.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [html.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [html.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [html.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [html.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [html.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [html.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [html.accessKey: IDL set to true]
+ expected: FAIL
+
+ [html.accessKey: IDL set to false]
+ expected: FAIL
+
+ [html.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [html.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [html.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [html.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [html.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [html.accessKey: IDL set to null]
+ expected: FAIL
+
+ [html.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [html.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [html.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [html.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [html.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [html.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [html.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [html.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [html.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [html.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [html.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [html.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [html.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [html.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [html.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [html.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [html.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [html.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [html.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [html.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [html.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [html.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [html.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [html.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [html.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [html.version: setAttribute() to ""]
+ expected: FAIL
+
+ [html.version: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [html.version: setAttribute() to undefined]
+ expected: FAIL
+
+ [html.version: setAttribute() to 7]
+ expected: FAIL
+
+ [html.version: setAttribute() to 1.5]
+ expected: FAIL
+
+ [html.version: setAttribute() to true]
+ expected: FAIL
+
+ [html.version: setAttribute() to false]
+ expected: FAIL
+
+ [html.version: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [html.version: setAttribute() to NaN]
+ expected: FAIL
+
+ [html.version: setAttribute() to Infinity]
+ expected: FAIL
+
+ [html.version: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [html.version: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [html.version: setAttribute() to null]
+ expected: FAIL
+
+ [html.version: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [html.version: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [html.version: IDL set to ""]
+ expected: FAIL
+
+ [html.version: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [html.version: IDL set to undefined]
+ expected: FAIL
+
+ [html.version: IDL set to 7]
+ expected: FAIL
+
+ [html.version: IDL set to 1.5]
+ expected: FAIL
+
+ [html.version: IDL set to true]
+ expected: FAIL
+
+ [html.version: IDL set to false]
+ expected: FAIL
+
+ [html.version: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [html.version: IDL set to NaN]
+ expected: FAIL
+
+ [html.version: IDL set to Infinity]
+ expected: FAIL
+
+ [html.version: IDL set to -Infinity]
+ expected: FAIL
+
+ [html.version: IDL set to "\\0"]
+ expected: FAIL
+
+ [html.version: IDL set to null]
+ expected: FAIL
+
+ [html.version: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [html.version: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [script.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [script.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [script.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [script.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [script.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [script.dir: setAttribute() to true]
+ expected: FAIL
+
+ [script.dir: setAttribute() to false]
+ expected: FAIL
+
+ [script.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [script.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [script.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [script.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [script.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [script.dir: setAttribute() to null]
+ expected: FAIL
+
+ [script.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [script.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [script.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [script.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [script.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [script.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [script.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [script.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [script.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [script.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [script.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [script.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [script.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [script.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [script.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [script.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [script.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [script.dir: IDL set to ""]
+ expected: FAIL
+
+ [script.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [script.dir: IDL set to undefined]
+ expected: FAIL
+
+ [script.dir: IDL set to 7]
+ expected: FAIL
+
+ [script.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [script.dir: IDL set to true]
+ expected: FAIL
+
+ [script.dir: IDL set to false]
+ expected: FAIL
+
+ [script.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [script.dir: IDL set to NaN]
+ expected: FAIL
+
+ [script.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [script.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [script.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [script.dir: IDL set to null]
+ expected: FAIL
+
+ [script.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [script.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [script.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [script.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [script.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [script.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [script.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [script.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [script.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [script.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [script.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [script.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [script.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [script.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [script.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [script.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [script.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [script.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [script.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [script.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [script.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [script.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [script.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [script.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [script.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [script.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [script.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [script.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [script.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [script.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [script.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [script.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [script.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [script.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [script.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [script.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [script.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [script.accessKey: IDL set to true]
+ expected: FAIL
+
+ [script.accessKey: IDL set to false]
+ expected: FAIL
+
+ [script.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [script.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [script.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [script.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [script.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [script.accessKey: IDL set to null]
+ expected: FAIL
+
+ [script.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [script.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [script.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [script.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [script.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [script.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [script.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [script.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [script.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [script.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [script.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [script.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [script.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [script.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [script.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [script.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [script.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [script.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [script.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [script.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [script.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [script.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [script.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [script.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [script.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to true]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to false]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to null]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [noscript.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [noscript.dir: IDL set to ""]
+ expected: FAIL
+
+ [noscript.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [noscript.dir: IDL set to undefined]
+ expected: FAIL
+
+ [noscript.dir: IDL set to 7]
+ expected: FAIL
+
+ [noscript.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [noscript.dir: IDL set to true]
+ expected: FAIL
+
+ [noscript.dir: IDL set to false]
+ expected: FAIL
+
+ [noscript.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [noscript.dir: IDL set to NaN]
+ expected: FAIL
+
+ [noscript.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [noscript.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [noscript.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [noscript.dir: IDL set to null]
+ expected: FAIL
+
+ [noscript.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [noscript.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [noscript.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [noscript.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [noscript.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [noscript.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [noscript.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [noscript.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [noscript.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [noscript.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [noscript.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [noscript.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [noscript.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [noscript.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [noscript.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [noscript.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [noscript.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [noscript.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [noscript.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [noscript.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [noscript.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [noscript.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [noscript.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [noscript.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [noscript.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [noscript.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [noscript.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [noscript.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [noscript.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [noscript.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [noscript.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [noscript.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [noscript.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [noscript.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [noscript.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [noscript.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [noscript.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [noscript.accessKey: IDL set to true]
+ expected: FAIL
+
+ [noscript.accessKey: IDL set to false]
+ expected: FAIL
+
+ [noscript.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [noscript.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [noscript.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [noscript.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [noscript.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [noscript.accessKey: IDL set to null]
+ expected: FAIL
+
+ [noscript.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [noscript.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [noscript.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [noscript.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [noscript.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [noscript.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [noscript.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [noscript.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [noscript.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [noscript.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [noscript.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [noscript.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [noscript.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [noscript.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [noscript.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [noscript.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [noscript.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [noscript.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [noscript.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [noscript.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [noscript.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [noscript.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [noscript.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [noscript.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [noscript.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to true]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to false]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to null]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [ins.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [ins.dir: IDL set to ""]
+ expected: FAIL
+
+ [ins.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ins.dir: IDL set to undefined]
+ expected: FAIL
+
+ [ins.dir: IDL set to 7]
+ expected: FAIL
+
+ [ins.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [ins.dir: IDL set to true]
+ expected: FAIL
+
+ [ins.dir: IDL set to false]
+ expected: FAIL
+
+ [ins.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [ins.dir: IDL set to NaN]
+ expected: FAIL
+
+ [ins.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [ins.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [ins.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [ins.dir: IDL set to null]
+ expected: FAIL
+
+ [ins.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [ins.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [ins.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [ins.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [ins.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [ins.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [ins.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [ins.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [ins.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [ins.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [ins.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [ins.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [ins.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [ins.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [ins.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [ins.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [ins.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [ins.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [ins.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ins.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [ins.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [ins.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [ins.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [ins.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [ins.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [ins.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [ins.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [ins.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [ins.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [ins.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [ins.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [ins.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [ins.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [ins.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ins.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [ins.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [ins.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [ins.accessKey: IDL set to true]
+ expected: FAIL
+
+ [ins.accessKey: IDL set to false]
+ expected: FAIL
+
+ [ins.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [ins.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [ins.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [ins.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [ins.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [ins.accessKey: IDL set to null]
+ expected: FAIL
+
+ [ins.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [ins.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [ins.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [ins.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [ins.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [ins.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [ins.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [ins.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [ins.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [ins.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [ins.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [ins.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [ins.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [ins.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [ins.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [ins.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [ins.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [ins.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [ins.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [ins.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [ins.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [ins.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [ins.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [ins.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [ins.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [ins.cite: setAttribute() to ""]
+ expected: FAIL
+
+ [ins.cite: setAttribute() to " foo "]
+ expected: FAIL
+
+ [ins.cite: setAttribute() to "http://site.example/"]
+ expected: FAIL
+
+ [ins.cite: setAttribute() to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [ins.cite: setAttribute() to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [ins.cite: setAttribute() to undefined]
+ expected: FAIL
+
+ [ins.cite: setAttribute() to 7]
+ expected: FAIL
+
+ [ins.cite: setAttribute() to 1.5]
+ expected: FAIL
+
+ [ins.cite: setAttribute() to true]
+ expected: FAIL
+
+ [ins.cite: setAttribute() to false]
+ expected: FAIL
+
+ [ins.cite: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [ins.cite: setAttribute() to NaN]
+ expected: FAIL
+
+ [ins.cite: setAttribute() to Infinity]
+ expected: FAIL
+
+ [ins.cite: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [ins.cite: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [ins.cite: setAttribute() to null]
+ expected: FAIL
+
+ [ins.cite: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [ins.cite: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [ins.cite: IDL set to ""]
+ expected: FAIL
+
+ [ins.cite: IDL set to " foo "]
+ expected: FAIL
+
+ [ins.cite: IDL set to "http://site.example/"]
+ expected: FAIL
+
+ [ins.cite: IDL set to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [ins.cite: IDL set to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [ins.cite: IDL set to undefined]
+ expected: FAIL
+
+ [ins.cite: IDL set to 7]
+ expected: FAIL
+
+ [ins.cite: IDL set to 1.5]
+ expected: FAIL
+
+ [ins.cite: IDL set to true]
+ expected: FAIL
+
+ [ins.cite: IDL set to false]
+ expected: FAIL
+
+ [ins.cite: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [ins.cite: IDL set to NaN]
+ expected: FAIL
+
+ [ins.cite: IDL set to Infinity]
+ expected: FAIL
+
+ [ins.cite: IDL set to -Infinity]
+ expected: FAIL
+
+ [ins.cite: IDL set to "\\0"]
+ expected: FAIL
+
+ [ins.cite: IDL set to null]
+ expected: FAIL
+
+ [ins.cite: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [ins.cite: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [ins.dateTime: setAttribute() to ""]
+ expected: FAIL
+
+ [ins.dateTime: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ins.dateTime: setAttribute() to undefined]
+ expected: FAIL
+
+ [ins.dateTime: setAttribute() to 7]
+ expected: FAIL
+
+ [ins.dateTime: setAttribute() to 1.5]
+ expected: FAIL
+
+ [ins.dateTime: setAttribute() to true]
+ expected: FAIL
+
+ [ins.dateTime: setAttribute() to false]
+ expected: FAIL
+
+ [ins.dateTime: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [ins.dateTime: setAttribute() to NaN]
+ expected: FAIL
+
+ [ins.dateTime: setAttribute() to Infinity]
+ expected: FAIL
+
+ [ins.dateTime: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [ins.dateTime: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [ins.dateTime: setAttribute() to null]
+ expected: FAIL
+
+ [ins.dateTime: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [ins.dateTime: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [ins.dateTime: IDL set to ""]
+ expected: FAIL
+
+ [ins.dateTime: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ins.dateTime: IDL set to undefined]
+ expected: FAIL
+
+ [ins.dateTime: IDL set to 7]
+ expected: FAIL
+
+ [ins.dateTime: IDL set to 1.5]
+ expected: FAIL
+
+ [ins.dateTime: IDL set to true]
+ expected: FAIL
+
+ [ins.dateTime: IDL set to false]
+ expected: FAIL
+
+ [ins.dateTime: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [ins.dateTime: IDL set to NaN]
+ expected: FAIL
+
+ [ins.dateTime: IDL set to Infinity]
+ expected: FAIL
+
+ [ins.dateTime: IDL set to -Infinity]
+ expected: FAIL
+
+ [ins.dateTime: IDL set to "\\0"]
+ expected: FAIL
+
+ [ins.dateTime: IDL set to null]
+ expected: FAIL
+
+ [ins.dateTime: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [ins.dateTime: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [del.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [del.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [del.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [del.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [del.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [del.dir: setAttribute() to true]
+ expected: FAIL
+
+ [del.dir: setAttribute() to false]
+ expected: FAIL
+
+ [del.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [del.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [del.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [del.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [del.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [del.dir: setAttribute() to null]
+ expected: FAIL
+
+ [del.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [del.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [del.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [del.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [del.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [del.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [del.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [del.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [del.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [del.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [del.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [del.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [del.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [del.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [del.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [del.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [del.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [del.dir: IDL set to ""]
+ expected: FAIL
+
+ [del.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [del.dir: IDL set to undefined]
+ expected: FAIL
+
+ [del.dir: IDL set to 7]
+ expected: FAIL
+
+ [del.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [del.dir: IDL set to true]
+ expected: FAIL
+
+ [del.dir: IDL set to false]
+ expected: FAIL
+
+ [del.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [del.dir: IDL set to NaN]
+ expected: FAIL
+
+ [del.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [del.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [del.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [del.dir: IDL set to null]
+ expected: FAIL
+
+ [del.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [del.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [del.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [del.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [del.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [del.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [del.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [del.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [del.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [del.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [del.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [del.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [del.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [del.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [del.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [del.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [del.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [del.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [del.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [del.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [del.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [del.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [del.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [del.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [del.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [del.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [del.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [del.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [del.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [del.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [del.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [del.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [del.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [del.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [del.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [del.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [del.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [del.accessKey: IDL set to true]
+ expected: FAIL
+
+ [del.accessKey: IDL set to false]
+ expected: FAIL
+
+ [del.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [del.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [del.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [del.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [del.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [del.accessKey: IDL set to null]
+ expected: FAIL
+
+ [del.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [del.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [del.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [del.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [del.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [del.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [del.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [del.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [del.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [del.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [del.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [del.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [del.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [del.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [del.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [del.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [del.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [del.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [del.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [del.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [del.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [del.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [del.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [del.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [del.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [del.cite: setAttribute() to ""]
+ expected: FAIL
+
+ [del.cite: setAttribute() to " foo "]
+ expected: FAIL
+
+ [del.cite: setAttribute() to "http://site.example/"]
+ expected: FAIL
+
+ [del.cite: setAttribute() to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [del.cite: setAttribute() to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [del.cite: setAttribute() to undefined]
+ expected: FAIL
+
+ [del.cite: setAttribute() to 7]
+ expected: FAIL
+
+ [del.cite: setAttribute() to 1.5]
+ expected: FAIL
+
+ [del.cite: setAttribute() to true]
+ expected: FAIL
+
+ [del.cite: setAttribute() to false]
+ expected: FAIL
+
+ [del.cite: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [del.cite: setAttribute() to NaN]
+ expected: FAIL
+
+ [del.cite: setAttribute() to Infinity]
+ expected: FAIL
+
+ [del.cite: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [del.cite: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [del.cite: setAttribute() to null]
+ expected: FAIL
+
+ [del.cite: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [del.cite: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [del.cite: IDL set to ""]
+ expected: FAIL
+
+ [del.cite: IDL set to " foo "]
+ expected: FAIL
+
+ [del.cite: IDL set to "http://site.example/"]
+ expected: FAIL
+
+ [del.cite: IDL set to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [del.cite: IDL set to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [del.cite: IDL set to undefined]
+ expected: FAIL
+
+ [del.cite: IDL set to 7]
+ expected: FAIL
+
+ [del.cite: IDL set to 1.5]
+ expected: FAIL
+
+ [del.cite: IDL set to true]
+ expected: FAIL
+
+ [del.cite: IDL set to false]
+ expected: FAIL
+
+ [del.cite: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [del.cite: IDL set to NaN]
+ expected: FAIL
+
+ [del.cite: IDL set to Infinity]
+ expected: FAIL
+
+ [del.cite: IDL set to -Infinity]
+ expected: FAIL
+
+ [del.cite: IDL set to "\\0"]
+ expected: FAIL
+
+ [del.cite: IDL set to null]
+ expected: FAIL
+
+ [del.cite: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [del.cite: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [del.dateTime: setAttribute() to ""]
+ expected: FAIL
+
+ [del.dateTime: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [del.dateTime: setAttribute() to undefined]
+ expected: FAIL
+
+ [del.dateTime: setAttribute() to 7]
+ expected: FAIL
+
+ [del.dateTime: setAttribute() to 1.5]
+ expected: FAIL
+
+ [del.dateTime: setAttribute() to true]
+ expected: FAIL
+
+ [del.dateTime: setAttribute() to false]
+ expected: FAIL
+
+ [del.dateTime: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [del.dateTime: setAttribute() to NaN]
+ expected: FAIL
+
+ [del.dateTime: setAttribute() to Infinity]
+ expected: FAIL
+
+ [del.dateTime: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [del.dateTime: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [del.dateTime: setAttribute() to null]
+ expected: FAIL
+
+ [del.dateTime: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [del.dateTime: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [del.dateTime: IDL set to ""]
+ expected: FAIL
+
+ [del.dateTime: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [del.dateTime: IDL set to undefined]
+ expected: FAIL
+
+ [del.dateTime: IDL set to 7]
+ expected: FAIL
+
+ [del.dateTime: IDL set to 1.5]
+ expected: FAIL
+
+ [del.dateTime: IDL set to true]
+ expected: FAIL
+
+ [del.dateTime: IDL set to false]
+ expected: FAIL
+
+ [del.dateTime: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [del.dateTime: IDL set to NaN]
+ expected: FAIL
+
+ [del.dateTime: IDL set to Infinity]
+ expected: FAIL
+
+ [del.dateTime: IDL set to -Infinity]
+ expected: FAIL
+
+ [del.dateTime: IDL set to "\\0"]
+ expected: FAIL
+
+ [del.dateTime: IDL set to null]
+ expected: FAIL
+
+ [del.dateTime: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [del.dateTime: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [details.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [details.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [details.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [details.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [details.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [details.dir: setAttribute() to true]
+ expected: FAIL
+
+ [details.dir: setAttribute() to false]
+ expected: FAIL
+
+ [details.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [details.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [details.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [details.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [details.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [details.dir: setAttribute() to null]
+ expected: FAIL
+
+ [details.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [details.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [details.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [details.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [details.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [details.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [details.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [details.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [details.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [details.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [details.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [details.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [details.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [details.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [details.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [details.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [details.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [details.dir: IDL set to ""]
+ expected: FAIL
+
+ [details.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [details.dir: IDL set to undefined]
+ expected: FAIL
+
+ [details.dir: IDL set to 7]
+ expected: FAIL
+
+ [details.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [details.dir: IDL set to true]
+ expected: FAIL
+
+ [details.dir: IDL set to false]
+ expected: FAIL
+
+ [details.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [details.dir: IDL set to NaN]
+ expected: FAIL
+
+ [details.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [details.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [details.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [details.dir: IDL set to null]
+ expected: FAIL
+
+ [details.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [details.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [details.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [details.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [details.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [details.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [details.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [details.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [details.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [details.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [details.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [details.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [details.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [details.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [details.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [details.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [details.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [details.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [details.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [details.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [details.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [details.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [details.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [details.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [details.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [details.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [details.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [details.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [details.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [details.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [details.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [details.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [details.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [details.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [details.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [details.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [details.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [details.accessKey: IDL set to true]
+ expected: FAIL
+
+ [details.accessKey: IDL set to false]
+ expected: FAIL
+
+ [details.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [details.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [details.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [details.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [details.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [details.accessKey: IDL set to null]
+ expected: FAIL
+
+ [details.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [details.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [details.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [details.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [details.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [details.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [details.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [details.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [details.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [details.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [details.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [details.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [details.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [details.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [details.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [details.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [details.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [details.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [details.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [details.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [details.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [details.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [details.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [details.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [details.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to true]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to false]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to null]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [summary.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [summary.dir: IDL set to ""]
+ expected: FAIL
+
+ [summary.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [summary.dir: IDL set to undefined]
+ expected: FAIL
+
+ [summary.dir: IDL set to 7]
+ expected: FAIL
+
+ [summary.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [summary.dir: IDL set to true]
+ expected: FAIL
+
+ [summary.dir: IDL set to false]
+ expected: FAIL
+
+ [summary.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [summary.dir: IDL set to NaN]
+ expected: FAIL
+
+ [summary.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [summary.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [summary.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [summary.dir: IDL set to null]
+ expected: FAIL
+
+ [summary.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [summary.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [summary.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [summary.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [summary.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [summary.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [summary.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [summary.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [summary.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [summary.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [summary.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [summary.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [summary.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [summary.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [summary.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [summary.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [summary.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [summary.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [summary.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [summary.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [summary.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [summary.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [summary.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [summary.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [summary.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [summary.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [summary.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [summary.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [summary.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [summary.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [summary.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [summary.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [summary.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [summary.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [summary.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [summary.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [summary.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [summary.accessKey: IDL set to true]
+ expected: FAIL
+
+ [summary.accessKey: IDL set to false]
+ expected: FAIL
+
+ [summary.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [summary.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [summary.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [summary.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [summary.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [summary.accessKey: IDL set to null]
+ expected: FAIL
+
+ [summary.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [summary.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [summary.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [summary.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [summary.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [summary.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [summary.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [summary.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [summary.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [summary.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [summary.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [summary.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [summary.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [summary.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [summary.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [summary.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [summary.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [summary.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [summary.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [summary.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [summary.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [summary.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [summary.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [summary.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [summary.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to true]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to false]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to null]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [menu.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [menu.dir: IDL set to ""]
+ expected: FAIL
+
+ [menu.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [menu.dir: IDL set to undefined]
+ expected: FAIL
+
+ [menu.dir: IDL set to 7]
+ expected: FAIL
+
+ [menu.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [menu.dir: IDL set to true]
+ expected: FAIL
+
+ [menu.dir: IDL set to false]
+ expected: FAIL
+
+ [menu.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [menu.dir: IDL set to NaN]
+ expected: FAIL
+
+ [menu.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [menu.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [menu.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [menu.dir: IDL set to null]
+ expected: FAIL
+
+ [menu.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [menu.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [menu.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [menu.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [menu.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [menu.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [menu.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [menu.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [menu.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [menu.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [menu.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [menu.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [menu.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [menu.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [menu.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [menu.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [menu.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [menu.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [menu.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [menu.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [menu.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [menu.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [menu.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [menu.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [menu.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [menu.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [menu.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [menu.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [menu.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [menu.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [menu.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [menu.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [menu.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [menu.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [menu.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [menu.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [menu.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [menu.accessKey: IDL set to true]
+ expected: FAIL
+
+ [menu.accessKey: IDL set to false]
+ expected: FAIL
+
+ [menu.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [menu.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [menu.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [menu.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [menu.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [menu.accessKey: IDL set to null]
+ expected: FAIL
+
+ [menu.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [menu.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [menu.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [menu.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [menu.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [menu.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [menu.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [menu.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [menu.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [menu.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [menu.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [menu.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [menu.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [menu.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [menu.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [menu.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [menu.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [menu.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [menu.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [menu.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [menu.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [menu.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [menu.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [menu.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [menu.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [menu.type: setAttribute() to ""]
+ expected: FAIL
+
+ [menu.type: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [menu.type: setAttribute() to undefined]
+ expected: FAIL
+
+ [menu.type: setAttribute() to 7]
+ expected: FAIL
+
+ [menu.type: setAttribute() to 1.5]
+ expected: FAIL
+
+ [menu.type: setAttribute() to true]
+ expected: FAIL
+
+ [menu.type: setAttribute() to false]
+ expected: FAIL
+
+ [menu.type: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [menu.type: setAttribute() to NaN]
+ expected: FAIL
+
+ [menu.type: setAttribute() to Infinity]
+ expected: FAIL
+
+ [menu.type: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [menu.type: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [menu.type: setAttribute() to null]
+ expected: FAIL
+
+ [menu.type: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [menu.type: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [menu.type: setAttribute() to "popup"]
+ expected: FAIL
+
+ [menu.type: setAttribute() to "xpopup"]
+ expected: FAIL
+
+ [menu.type: setAttribute() to "popup\\0"]
+ expected: FAIL
+
+ [menu.type: setAttribute() to "opup"]
+ expected: FAIL
+
+ [menu.type: setAttribute() to "POPUP"]
+ expected: FAIL
+
+ [menu.type: setAttribute() to "toolbar"]
+ expected: FAIL
+
+ [menu.type: setAttribute() to "xtoolbar"]
+ expected: FAIL
+
+ [menu.type: setAttribute() to "toolbar\\0"]
+ expected: FAIL
+
+ [menu.type: setAttribute() to "oolbar"]
+ expected: FAIL
+
+ [menu.type: setAttribute() to "TOOLBAR"]
+ expected: FAIL
+
+ [menu.type: IDL set to ""]
+ expected: FAIL
+
+ [menu.type: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [menu.type: IDL set to undefined]
+ expected: FAIL
+
+ [menu.type: IDL set to 7]
+ expected: FAIL
+
+ [menu.type: IDL set to 1.5]
+ expected: FAIL
+
+ [menu.type: IDL set to true]
+ expected: FAIL
+
+ [menu.type: IDL set to false]
+ expected: FAIL
+
+ [menu.type: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [menu.type: IDL set to NaN]
+ expected: FAIL
+
+ [menu.type: IDL set to Infinity]
+ expected: FAIL
+
+ [menu.type: IDL set to -Infinity]
+ expected: FAIL
+
+ [menu.type: IDL set to "\\0"]
+ expected: FAIL
+
+ [menu.type: IDL set to null]
+ expected: FAIL
+
+ [menu.type: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [menu.type: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [menu.type: IDL set to "popup"]
+ expected: FAIL
+
+ [menu.type: IDL set to "xpopup"]
+ expected: FAIL
+
+ [menu.type: IDL set to "popup\\0"]
+ expected: FAIL
+
+ [menu.type: IDL set to "opup"]
+ expected: FAIL
+
+ [menu.type: IDL set to "POPUP"]
+ expected: FAIL
+
+ [menu.type: IDL set to "toolbar"]
+ expected: FAIL
+
+ [menu.type: IDL set to "xtoolbar"]
+ expected: FAIL
+
+ [menu.type: IDL set to "toolbar\\0"]
+ expected: FAIL
+
+ [menu.type: IDL set to "oolbar"]
+ expected: FAIL
+
+ [menu.type: IDL set to "TOOLBAR"]
+ expected: FAIL
+
+ [menu.label: setAttribute() to ""]
+ expected: FAIL
+
+ [menu.label: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [menu.label: setAttribute() to undefined]
+ expected: FAIL
+
+ [menu.label: setAttribute() to 7]
+ expected: FAIL
+
+ [menu.label: setAttribute() to 1.5]
+ expected: FAIL
+
+ [menu.label: setAttribute() to true]
+ expected: FAIL
+
+ [menu.label: setAttribute() to false]
+ expected: FAIL
+
+ [menu.label: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [menu.label: setAttribute() to NaN]
+ expected: FAIL
+
+ [menu.label: setAttribute() to Infinity]
+ expected: FAIL
+
+ [menu.label: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [menu.label: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [menu.label: setAttribute() to null]
+ expected: FAIL
+
+ [menu.label: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [menu.label: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [menu.label: IDL set to ""]
+ expected: FAIL
+
+ [menu.label: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [menu.label: IDL set to undefined]
+ expected: FAIL
+
+ [menu.label: IDL set to 7]
+ expected: FAIL
+
+ [menu.label: IDL set to 1.5]
+ expected: FAIL
+
+ [menu.label: IDL set to true]
+ expected: FAIL
+
+ [menu.label: IDL set to false]
+ expected: FAIL
+
+ [menu.label: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [menu.label: IDL set to NaN]
+ expected: FAIL
+
+ [menu.label: IDL set to Infinity]
+ expected: FAIL
+
+ [menu.label: IDL set to -Infinity]
+ expected: FAIL
+
+ [menu.label: IDL set to "\\0"]
+ expected: FAIL
+
+ [menu.label: IDL set to null]
+ expected: FAIL
+
+ [menu.label: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [menu.label: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [menu.compact: setAttribute() to ""]
+ expected: FAIL
+
+ [menu.compact: setAttribute() to " foo "]
+ expected: FAIL
+
+ [menu.compact: setAttribute() to undefined]
+ expected: FAIL
+
+ [menu.compact: setAttribute() to null]
+ expected: FAIL
+
+ [menu.compact: setAttribute() to 7]
+ expected: FAIL
+
+ [menu.compact: setAttribute() to 1.5]
+ expected: FAIL
+
+ [menu.compact: setAttribute() to true]
+ expected: FAIL
+
+ [menu.compact: setAttribute() to false]
+ expected: FAIL
+
+ [menu.compact: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [menu.compact: setAttribute() to NaN]
+ expected: FAIL
+
+ [menu.compact: setAttribute() to Infinity]
+ expected: FAIL
+
+ [menu.compact: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [menu.compact: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [menu.compact: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [menu.compact: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [menu.compact: setAttribute() to "compact"]
+ expected: FAIL
+
+ [menu.compact: IDL set to ""]
+ expected: FAIL
+
+ [menu.compact: IDL set to " foo "]
+ expected: FAIL
+
+ [menu.compact: IDL set to undefined]
+ expected: FAIL
+
+ [menu.compact: IDL set to null]
+ expected: FAIL
+
+ [menu.compact: IDL set to 7]
+ expected: FAIL
+
+ [menu.compact: IDL set to 1.5]
+ expected: FAIL
+
+ [menu.compact: IDL set to false]
+ expected: FAIL
+
+ [menu.compact: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [menu.compact: IDL set to NaN]
+ expected: FAIL
+
+ [menu.compact: IDL set to Infinity]
+ expected: FAIL
+
+ [menu.compact: IDL set to -Infinity]
+ expected: FAIL
+
+ [menu.compact: IDL set to "\\0"]
+ expected: FAIL
+
+ [menu.compact: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [menu.compact: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to true]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to false]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to null]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [menuitem.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to ""]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to undefined]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to 7]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to true]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to false]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to NaN]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to null]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [menuitem.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [menuitem.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [menuitem.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [menuitem.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [menuitem.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [menuitem.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [menuitem.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [menuitem.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [menuitem.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [menuitem.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [menuitem.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [menuitem.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [menuitem.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [menuitem.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [menuitem.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [menuitem.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [menuitem.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [menuitem.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [menuitem.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [menuitem.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [menuitem.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [menuitem.accessKey: IDL set to true]
+ expected: FAIL
+
+ [menuitem.accessKey: IDL set to false]
+ expected: FAIL
+
+ [menuitem.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [menuitem.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [menuitem.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [menuitem.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [menuitem.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [menuitem.accessKey: IDL set to null]
+ expected: FAIL
+
+ [menuitem.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [menuitem.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [menuitem.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [menuitem.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [menuitem.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [menuitem.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [menuitem.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [menuitem.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [menuitem.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [menuitem.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [menuitem.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [menuitem.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [menuitem.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [menuitem.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [menuitem.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [menuitem.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [menuitem.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [menuitem.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [menuitem.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [menuitem.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [menuitem.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [menuitem.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [menuitem.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [menuitem.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [menuitem.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to ""]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to undefined]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to 7]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to 1.5]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to true]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to false]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to NaN]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to Infinity]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to null]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to "command"]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to "xcommand"]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to "command\\0"]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to "ommand"]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to "COMMAND"]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to "checkbox"]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to "xcheckbox"]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to "checkbox\\0"]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to "heckbox"]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to "CHECKBOX"]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to "radio"]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to "xradio"]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to "radio\\0"]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to "adio"]
+ expected: FAIL
+
+ [menuitem.type: setAttribute() to "RADIO"]
+ expected: FAIL
+
+ [menuitem.type: IDL set to ""]
+ expected: FAIL
+
+ [menuitem.type: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [menuitem.type: IDL set to undefined]
+ expected: FAIL
+
+ [menuitem.type: IDL set to 7]
+ expected: FAIL
+
+ [menuitem.type: IDL set to 1.5]
+ expected: FAIL
+
+ [menuitem.type: IDL set to true]
+ expected: FAIL
+
+ [menuitem.type: IDL set to false]
+ expected: FAIL
+
+ [menuitem.type: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [menuitem.type: IDL set to NaN]
+ expected: FAIL
+
+ [menuitem.type: IDL set to Infinity]
+ expected: FAIL
+
+ [menuitem.type: IDL set to -Infinity]
+ expected: FAIL
+
+ [menuitem.type: IDL set to "\\0"]
+ expected: FAIL
+
+ [menuitem.type: IDL set to null]
+ expected: FAIL
+
+ [menuitem.type: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [menuitem.type: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [menuitem.type: IDL set to "command"]
+ expected: FAIL
+
+ [menuitem.type: IDL set to "xcommand"]
+ expected: FAIL
+
+ [menuitem.type: IDL set to "command\\0"]
+ expected: FAIL
+
+ [menuitem.type: IDL set to "ommand"]
+ expected: FAIL
+
+ [menuitem.type: IDL set to "COMMAND"]
+ expected: FAIL
+
+ [menuitem.type: IDL set to "checkbox"]
+ expected: FAIL
+
+ [menuitem.type: IDL set to "xcheckbox"]
+ expected: FAIL
+
+ [menuitem.type: IDL set to "checkbox\\0"]
+ expected: FAIL
+
+ [menuitem.type: IDL set to "heckbox"]
+ expected: FAIL
+
+ [menuitem.type: IDL set to "CHECKBOX"]
+ expected: FAIL
+
+ [menuitem.type: IDL set to "radio"]
+ expected: FAIL
+
+ [menuitem.type: IDL set to "xradio"]
+ expected: FAIL
+
+ [menuitem.type: IDL set to "radio\\0"]
+ expected: FAIL
+
+ [menuitem.type: IDL set to "adio"]
+ expected: FAIL
+
+ [menuitem.type: IDL set to "RADIO"]
+ expected: FAIL
+
+ [menuitem.label: setAttribute() to ""]
+ expected: FAIL
+
+ [menuitem.label: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [menuitem.label: setAttribute() to undefined]
+ expected: FAIL
+
+ [menuitem.label: setAttribute() to 7]
+ expected: FAIL
+
+ [menuitem.label: setAttribute() to 1.5]
+ expected: FAIL
+
+ [menuitem.label: setAttribute() to true]
+ expected: FAIL
+
+ [menuitem.label: setAttribute() to false]
+ expected: FAIL
+
+ [menuitem.label: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [menuitem.label: setAttribute() to NaN]
+ expected: FAIL
+
+ [menuitem.label: setAttribute() to Infinity]
+ expected: FAIL
+
+ [menuitem.label: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [menuitem.label: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [menuitem.label: setAttribute() to null]
+ expected: FAIL
+
+ [menuitem.label: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [menuitem.label: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [menuitem.label: IDL set to ""]
+ expected: FAIL
+
+ [menuitem.label: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [menuitem.label: IDL set to undefined]
+ expected: FAIL
+
+ [menuitem.label: IDL set to 7]
+ expected: FAIL
+
+ [menuitem.label: IDL set to 1.5]
+ expected: FAIL
+
+ [menuitem.label: IDL set to true]
+ expected: FAIL
+
+ [menuitem.label: IDL set to false]
+ expected: FAIL
+
+ [menuitem.label: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [menuitem.label: IDL set to NaN]
+ expected: FAIL
+
+ [menuitem.label: IDL set to Infinity]
+ expected: FAIL
+
+ [menuitem.label: IDL set to -Infinity]
+ expected: FAIL
+
+ [menuitem.label: IDL set to "\\0"]
+ expected: FAIL
+
+ [menuitem.label: IDL set to null]
+ expected: FAIL
+
+ [menuitem.label: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [menuitem.label: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [menuitem.icon: setAttribute() to ""]
+ expected: FAIL
+
+ [menuitem.icon: setAttribute() to " foo "]
+ expected: FAIL
+
+ [menuitem.icon: setAttribute() to "http://site.example/"]
+ expected: FAIL
+
+ [menuitem.icon: setAttribute() to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [menuitem.icon: setAttribute() to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [menuitem.icon: setAttribute() to undefined]
+ expected: FAIL
+
+ [menuitem.icon: setAttribute() to 7]
+ expected: FAIL
+
+ [menuitem.icon: setAttribute() to 1.5]
+ expected: FAIL
+
+ [menuitem.icon: setAttribute() to true]
+ expected: FAIL
+
+ [menuitem.icon: setAttribute() to false]
+ expected: FAIL
+
+ [menuitem.icon: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [menuitem.icon: setAttribute() to NaN]
+ expected: FAIL
+
+ [menuitem.icon: setAttribute() to Infinity]
+ expected: FAIL
+
+ [menuitem.icon: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [menuitem.icon: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [menuitem.icon: setAttribute() to null]
+ expected: FAIL
+
+ [menuitem.icon: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [menuitem.icon: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [menuitem.icon: IDL set to ""]
+ expected: FAIL
+
+ [menuitem.icon: IDL set to " foo "]
+ expected: FAIL
+
+ [menuitem.icon: IDL set to "http://site.example/"]
+ expected: FAIL
+
+ [menuitem.icon: IDL set to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [menuitem.icon: IDL set to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [menuitem.icon: IDL set to undefined]
+ expected: FAIL
+
+ [menuitem.icon: IDL set to 7]
+ expected: FAIL
+
+ [menuitem.icon: IDL set to 1.5]
+ expected: FAIL
+
+ [menuitem.icon: IDL set to true]
+ expected: FAIL
+
+ [menuitem.icon: IDL set to false]
+ expected: FAIL
+
+ [menuitem.icon: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [menuitem.icon: IDL set to NaN]
+ expected: FAIL
+
+ [menuitem.icon: IDL set to Infinity]
+ expected: FAIL
+
+ [menuitem.icon: IDL set to -Infinity]
+ expected: FAIL
+
+ [menuitem.icon: IDL set to "\\0"]
+ expected: FAIL
+
+ [menuitem.icon: IDL set to null]
+ expected: FAIL
+
+ [menuitem.icon: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [menuitem.icon: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [menuitem.disabled: setAttribute() to ""]
+ expected: FAIL
+
+ [menuitem.disabled: setAttribute() to " foo "]
+ expected: FAIL
+
+ [menuitem.disabled: setAttribute() to undefined]
+ expected: FAIL
+
+ [menuitem.disabled: setAttribute() to null]
+ expected: FAIL
+
+ [menuitem.disabled: setAttribute() to 7]
+ expected: FAIL
+
+ [menuitem.disabled: setAttribute() to 1.5]
+ expected: FAIL
+
+ [menuitem.disabled: setAttribute() to true]
+ expected: FAIL
+
+ [menuitem.disabled: setAttribute() to false]
+ expected: FAIL
+
+ [menuitem.disabled: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [menuitem.disabled: setAttribute() to NaN]
+ expected: FAIL
+
+ [menuitem.disabled: setAttribute() to Infinity]
+ expected: FAIL
+
+ [menuitem.disabled: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [menuitem.disabled: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [menuitem.disabled: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [menuitem.disabled: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [menuitem.disabled: setAttribute() to "disabled"]
+ expected: FAIL
+
+ [menuitem.disabled: IDL set to ""]
+ expected: FAIL
+
+ [menuitem.disabled: IDL set to " foo "]
+ expected: FAIL
+
+ [menuitem.disabled: IDL set to undefined]
+ expected: FAIL
+
+ [menuitem.disabled: IDL set to null]
+ expected: FAIL
+
+ [menuitem.disabled: IDL set to 7]
+ expected: FAIL
+
+ [menuitem.disabled: IDL set to 1.5]
+ expected: FAIL
+
+ [menuitem.disabled: IDL set to false]
+ expected: FAIL
+
+ [menuitem.disabled: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [menuitem.disabled: IDL set to NaN]
+ expected: FAIL
+
+ [menuitem.disabled: IDL set to Infinity]
+ expected: FAIL
+
+ [menuitem.disabled: IDL set to -Infinity]
+ expected: FAIL
+
+ [menuitem.disabled: IDL set to "\\0"]
+ expected: FAIL
+
+ [menuitem.disabled: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [menuitem.disabled: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [menuitem.checked: setAttribute() to ""]
+ expected: FAIL
+
+ [menuitem.checked: setAttribute() to " foo "]
+ expected: FAIL
+
+ [menuitem.checked: setAttribute() to undefined]
+ expected: FAIL
+
+ [menuitem.checked: setAttribute() to null]
+ expected: FAIL
+
+ [menuitem.checked: setAttribute() to 7]
+ expected: FAIL
+
+ [menuitem.checked: setAttribute() to 1.5]
+ expected: FAIL
+
+ [menuitem.checked: setAttribute() to true]
+ expected: FAIL
+
+ [menuitem.checked: setAttribute() to false]
+ expected: FAIL
+
+ [menuitem.checked: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [menuitem.checked: setAttribute() to NaN]
+ expected: FAIL
+
+ [menuitem.checked: setAttribute() to Infinity]
+ expected: FAIL
+
+ [menuitem.checked: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [menuitem.checked: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [menuitem.checked: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [menuitem.checked: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [menuitem.checked: setAttribute() to "checked"]
+ expected: FAIL
+
+ [menuitem.checked: IDL set to ""]
+ expected: FAIL
+
+ [menuitem.checked: IDL set to " foo "]
+ expected: FAIL
+
+ [menuitem.checked: IDL set to undefined]
+ expected: FAIL
+
+ [menuitem.checked: IDL set to null]
+ expected: FAIL
+
+ [menuitem.checked: IDL set to 7]
+ expected: FAIL
+
+ [menuitem.checked: IDL set to 1.5]
+ expected: FAIL
+
+ [menuitem.checked: IDL set to false]
+ expected: FAIL
+
+ [menuitem.checked: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [menuitem.checked: IDL set to NaN]
+ expected: FAIL
+
+ [menuitem.checked: IDL set to Infinity]
+ expected: FAIL
+
+ [menuitem.checked: IDL set to -Infinity]
+ expected: FAIL
+
+ [menuitem.checked: IDL set to "\\0"]
+ expected: FAIL
+
+ [menuitem.checked: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [menuitem.checked: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [menuitem.radiogroup: setAttribute() to ""]
+ expected: FAIL
+
+ [menuitem.radiogroup: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [menuitem.radiogroup: setAttribute() to undefined]
+ expected: FAIL
+
+ [menuitem.radiogroup: setAttribute() to 7]
+ expected: FAIL
+
+ [menuitem.radiogroup: setAttribute() to 1.5]
+ expected: FAIL
+
+ [menuitem.radiogroup: setAttribute() to true]
+ expected: FAIL
+
+ [menuitem.radiogroup: setAttribute() to false]
+ expected: FAIL
+
+ [menuitem.radiogroup: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [menuitem.radiogroup: setAttribute() to NaN]
+ expected: FAIL
+
+ [menuitem.radiogroup: setAttribute() to Infinity]
+ expected: FAIL
+
+ [menuitem.radiogroup: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [menuitem.radiogroup: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [menuitem.radiogroup: setAttribute() to null]
+ expected: FAIL
+
+ [menuitem.radiogroup: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [menuitem.radiogroup: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [menuitem.radiogroup: IDL set to ""]
+ expected: FAIL
+
+ [menuitem.radiogroup: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [menuitem.radiogroup: IDL set to undefined]
+ expected: FAIL
+
+ [menuitem.radiogroup: IDL set to 7]
+ expected: FAIL
+
+ [menuitem.radiogroup: IDL set to 1.5]
+ expected: FAIL
+
+ [menuitem.radiogroup: IDL set to true]
+ expected: FAIL
+
+ [menuitem.radiogroup: IDL set to false]
+ expected: FAIL
+
+ [menuitem.radiogroup: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [menuitem.radiogroup: IDL set to NaN]
+ expected: FAIL
+
+ [menuitem.radiogroup: IDL set to Infinity]
+ expected: FAIL
+
+ [menuitem.radiogroup: IDL set to -Infinity]
+ expected: FAIL
+
+ [menuitem.radiogroup: IDL set to "\\0"]
+ expected: FAIL
+
+ [menuitem.radiogroup: IDL set to null]
+ expected: FAIL
+
+ [menuitem.radiogroup: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [menuitem.radiogroup: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [menuitem.default: setAttribute() to ""]
+ expected: FAIL
+
+ [menuitem.default: setAttribute() to " foo "]
+ expected: FAIL
+
+ [menuitem.default: setAttribute() to undefined]
+ expected: FAIL
+
+ [menuitem.default: setAttribute() to null]
+ expected: FAIL
+
+ [menuitem.default: setAttribute() to 7]
+ expected: FAIL
+
+ [menuitem.default: setAttribute() to 1.5]
+ expected: FAIL
+
+ [menuitem.default: setAttribute() to true]
+ expected: FAIL
+
+ [menuitem.default: setAttribute() to false]
+ expected: FAIL
+
+ [menuitem.default: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [menuitem.default: setAttribute() to NaN]
+ expected: FAIL
+
+ [menuitem.default: setAttribute() to Infinity]
+ expected: FAIL
+
+ [menuitem.default: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [menuitem.default: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [menuitem.default: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [menuitem.default: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [menuitem.default: setAttribute() to "default"]
+ expected: FAIL
+
+ [menuitem.default: IDL set to ""]
+ expected: FAIL
+
+ [menuitem.default: IDL set to " foo "]
+ expected: FAIL
+
+ [menuitem.default: IDL set to undefined]
+ expected: FAIL
+
+ [menuitem.default: IDL set to null]
+ expected: FAIL
+
+ [menuitem.default: IDL set to 7]
+ expected: FAIL
+
+ [menuitem.default: IDL set to 1.5]
+ expected: FAIL
+
+ [menuitem.default: IDL set to false]
+ expected: FAIL
+
+ [menuitem.default: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [menuitem.default: IDL set to NaN]
+ expected: FAIL
+
+ [menuitem.default: IDL set to Infinity]
+ expected: FAIL
+
+ [menuitem.default: IDL set to -Infinity]
+ expected: FAIL
+
+ [menuitem.default: IDL set to "\\0"]
+ expected: FAIL
+
+ [menuitem.default: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [menuitem.default: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to true]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to false]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to null]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [dialog.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [dialog.dir: IDL set to ""]
+ expected: FAIL
+
+ [dialog.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dialog.dir: IDL set to undefined]
+ expected: FAIL
+
+ [dialog.dir: IDL set to 7]
+ expected: FAIL
+
+ [dialog.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [dialog.dir: IDL set to true]
+ expected: FAIL
+
+ [dialog.dir: IDL set to false]
+ expected: FAIL
+
+ [dialog.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [dialog.dir: IDL set to NaN]
+ expected: FAIL
+
+ [dialog.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [dialog.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [dialog.dir: IDL set to null]
+ expected: FAIL
+
+ [dialog.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [dialog.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [dialog.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [dialog.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to true]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to false]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to null]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [dialog.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [dialog.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [dialog.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [dialog.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [dialog.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [dialog.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [dialog.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [dialog.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to true]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to false]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to null]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [undefinedelement.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to ""]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to undefined]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to 7]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to true]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to false]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to NaN]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to null]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [undefinedelement.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [undefinedelement.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [undefinedelement.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [undefinedelement.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [undefinedelement.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [undefinedelement.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [undefinedelement.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [undefinedelement.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [undefinedelement.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [undefinedelement.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [undefinedelement.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [undefinedelement.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [undefinedelement.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [undefinedelement.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [undefinedelement.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [undefinedelement.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [undefinedelement.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [undefinedelement.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [undefinedelement.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [undefinedelement.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [undefinedelement.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [undefinedelement.accessKey: IDL set to true]
+ expected: FAIL
+
+ [undefinedelement.accessKey: IDL set to false]
+ expected: FAIL
+
+ [undefinedelement.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [undefinedelement.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [undefinedelement.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [undefinedelement.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [undefinedelement.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [undefinedelement.accessKey: IDL set to null]
+ expected: FAIL
+
+ [undefinedelement.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [undefinedelement.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [undefinedelement.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/dom/reflection-obsolete.html.ini b/tests/wpt/metadata/html/dom/reflection-obsolete.html.ini
index 8c789a96916..af184eb4318 100644
--- a/tests/wpt/metadata/html/dom/reflection-obsolete.html.ini
+++ b/tests/wpt/metadata/html/dom/reflection-obsolete.html.ini
@@ -10878,3 +10878,5439 @@
[marquee.vspace: IDL set to 4294967295 followed by IDL get]
expected: FAIL
+ [applet.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to true]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to false]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to null]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [applet.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [applet.dir: IDL set to ""]
+ expected: FAIL
+
+ [applet.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [applet.dir: IDL set to undefined]
+ expected: FAIL
+
+ [applet.dir: IDL set to 7]
+ expected: FAIL
+
+ [applet.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [applet.dir: IDL set to true]
+ expected: FAIL
+
+ [applet.dir: IDL set to false]
+ expected: FAIL
+
+ [applet.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [applet.dir: IDL set to NaN]
+ expected: FAIL
+
+ [applet.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [applet.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [applet.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [applet.dir: IDL set to null]
+ expected: FAIL
+
+ [applet.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [applet.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [applet.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [applet.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [applet.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [applet.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [applet.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [applet.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [applet.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [applet.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [applet.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [applet.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [applet.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [applet.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [applet.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [applet.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [applet.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [applet.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [applet.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [applet.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [applet.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [applet.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [applet.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [applet.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [applet.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [applet.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [applet.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [applet.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [applet.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [applet.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [applet.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [applet.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [applet.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [applet.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [applet.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [applet.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [applet.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [applet.accessKey: IDL set to true]
+ expected: FAIL
+
+ [applet.accessKey: IDL set to false]
+ expected: FAIL
+
+ [applet.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [applet.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [applet.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [applet.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [applet.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [applet.accessKey: IDL set to null]
+ expected: FAIL
+
+ [applet.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [applet.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [applet.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [applet.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [applet.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [applet.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [applet.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [applet.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [applet.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [applet.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [applet.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [applet.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [applet.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [applet.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [applet.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [applet.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [applet.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [applet.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [applet.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [applet.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [applet.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [applet.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [applet.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [applet.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [applet.align: setAttribute() to ""]
+ expected: FAIL
+
+ [applet.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [applet.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [applet.align: setAttribute() to 7]
+ expected: FAIL
+
+ [applet.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [applet.align: setAttribute() to true]
+ expected: FAIL
+
+ [applet.align: setAttribute() to false]
+ expected: FAIL
+
+ [applet.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [applet.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [applet.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [applet.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [applet.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [applet.align: setAttribute() to null]
+ expected: FAIL
+
+ [applet.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [applet.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [applet.align: IDL set to ""]
+ expected: FAIL
+
+ [applet.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [applet.align: IDL set to undefined]
+ expected: FAIL
+
+ [applet.align: IDL set to 7]
+ expected: FAIL
+
+ [applet.align: IDL set to 1.5]
+ expected: FAIL
+
+ [applet.align: IDL set to true]
+ expected: FAIL
+
+ [applet.align: IDL set to false]
+ expected: FAIL
+
+ [applet.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [applet.align: IDL set to NaN]
+ expected: FAIL
+
+ [applet.align: IDL set to Infinity]
+ expected: FAIL
+
+ [applet.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [applet.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [applet.align: IDL set to null]
+ expected: FAIL
+
+ [applet.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [applet.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [applet.alt: setAttribute() to ""]
+ expected: FAIL
+
+ [applet.alt: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [applet.alt: setAttribute() to undefined]
+ expected: FAIL
+
+ [applet.alt: setAttribute() to 7]
+ expected: FAIL
+
+ [applet.alt: setAttribute() to 1.5]
+ expected: FAIL
+
+ [applet.alt: setAttribute() to true]
+ expected: FAIL
+
+ [applet.alt: setAttribute() to false]
+ expected: FAIL
+
+ [applet.alt: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [applet.alt: setAttribute() to NaN]
+ expected: FAIL
+
+ [applet.alt: setAttribute() to Infinity]
+ expected: FAIL
+
+ [applet.alt: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [applet.alt: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [applet.alt: setAttribute() to null]
+ expected: FAIL
+
+ [applet.alt: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [applet.alt: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [applet.alt: IDL set to ""]
+ expected: FAIL
+
+ [applet.alt: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [applet.alt: IDL set to undefined]
+ expected: FAIL
+
+ [applet.alt: IDL set to 7]
+ expected: FAIL
+
+ [applet.alt: IDL set to 1.5]
+ expected: FAIL
+
+ [applet.alt: IDL set to true]
+ expected: FAIL
+
+ [applet.alt: IDL set to false]
+ expected: FAIL
+
+ [applet.alt: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [applet.alt: IDL set to NaN]
+ expected: FAIL
+
+ [applet.alt: IDL set to Infinity]
+ expected: FAIL
+
+ [applet.alt: IDL set to -Infinity]
+ expected: FAIL
+
+ [applet.alt: IDL set to "\\0"]
+ expected: FAIL
+
+ [applet.alt: IDL set to null]
+ expected: FAIL
+
+ [applet.alt: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [applet.alt: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [applet.archive: setAttribute() to ""]
+ expected: FAIL
+
+ [applet.archive: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [applet.archive: setAttribute() to undefined]
+ expected: FAIL
+
+ [applet.archive: setAttribute() to 7]
+ expected: FAIL
+
+ [applet.archive: setAttribute() to 1.5]
+ expected: FAIL
+
+ [applet.archive: setAttribute() to true]
+ expected: FAIL
+
+ [applet.archive: setAttribute() to false]
+ expected: FAIL
+
+ [applet.archive: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [applet.archive: setAttribute() to NaN]
+ expected: FAIL
+
+ [applet.archive: setAttribute() to Infinity]
+ expected: FAIL
+
+ [applet.archive: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [applet.archive: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [applet.archive: setAttribute() to null]
+ expected: FAIL
+
+ [applet.archive: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [applet.archive: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [applet.archive: IDL set to ""]
+ expected: FAIL
+
+ [applet.archive: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [applet.archive: IDL set to undefined]
+ expected: FAIL
+
+ [applet.archive: IDL set to 7]
+ expected: FAIL
+
+ [applet.archive: IDL set to 1.5]
+ expected: FAIL
+
+ [applet.archive: IDL set to true]
+ expected: FAIL
+
+ [applet.archive: IDL set to false]
+ expected: FAIL
+
+ [applet.archive: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [applet.archive: IDL set to NaN]
+ expected: FAIL
+
+ [applet.archive: IDL set to Infinity]
+ expected: FAIL
+
+ [applet.archive: IDL set to -Infinity]
+ expected: FAIL
+
+ [applet.archive: IDL set to "\\0"]
+ expected: FAIL
+
+ [applet.archive: IDL set to null]
+ expected: FAIL
+
+ [applet.archive: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [applet.archive: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [applet.code: setAttribute() to ""]
+ expected: FAIL
+
+ [applet.code: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [applet.code: setAttribute() to undefined]
+ expected: FAIL
+
+ [applet.code: setAttribute() to 7]
+ expected: FAIL
+
+ [applet.code: setAttribute() to 1.5]
+ expected: FAIL
+
+ [applet.code: setAttribute() to true]
+ expected: FAIL
+
+ [applet.code: setAttribute() to false]
+ expected: FAIL
+
+ [applet.code: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [applet.code: setAttribute() to NaN]
+ expected: FAIL
+
+ [applet.code: setAttribute() to Infinity]
+ expected: FAIL
+
+ [applet.code: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [applet.code: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [applet.code: setAttribute() to null]
+ expected: FAIL
+
+ [applet.code: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [applet.code: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [applet.code: IDL set to ""]
+ expected: FAIL
+
+ [applet.code: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [applet.code: IDL set to undefined]
+ expected: FAIL
+
+ [applet.code: IDL set to 7]
+ expected: FAIL
+
+ [applet.code: IDL set to 1.5]
+ expected: FAIL
+
+ [applet.code: IDL set to true]
+ expected: FAIL
+
+ [applet.code: IDL set to false]
+ expected: FAIL
+
+ [applet.code: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [applet.code: IDL set to NaN]
+ expected: FAIL
+
+ [applet.code: IDL set to Infinity]
+ expected: FAIL
+
+ [applet.code: IDL set to -Infinity]
+ expected: FAIL
+
+ [applet.code: IDL set to "\\0"]
+ expected: FAIL
+
+ [applet.code: IDL set to null]
+ expected: FAIL
+
+ [applet.code: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [applet.code: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [applet.codeBase: setAttribute() to ""]
+ expected: FAIL
+
+ [applet.codeBase: setAttribute() to " foo "]
+ expected: FAIL
+
+ [applet.codeBase: setAttribute() to "http://site.example/"]
+ expected: FAIL
+
+ [applet.codeBase: setAttribute() to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [applet.codeBase: setAttribute() to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [applet.codeBase: setAttribute() to undefined]
+ expected: FAIL
+
+ [applet.codeBase: setAttribute() to 7]
+ expected: FAIL
+
+ [applet.codeBase: setAttribute() to 1.5]
+ expected: FAIL
+
+ [applet.codeBase: setAttribute() to true]
+ expected: FAIL
+
+ [applet.codeBase: setAttribute() to false]
+ expected: FAIL
+
+ [applet.codeBase: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [applet.codeBase: setAttribute() to NaN]
+ expected: FAIL
+
+ [applet.codeBase: setAttribute() to Infinity]
+ expected: FAIL
+
+ [applet.codeBase: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [applet.codeBase: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [applet.codeBase: setAttribute() to null]
+ expected: FAIL
+
+ [applet.codeBase: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [applet.codeBase: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [applet.codeBase: IDL set to ""]
+ expected: FAIL
+
+ [applet.codeBase: IDL set to " foo "]
+ expected: FAIL
+
+ [applet.codeBase: IDL set to "http://site.example/"]
+ expected: FAIL
+
+ [applet.codeBase: IDL set to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [applet.codeBase: IDL set to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [applet.codeBase: IDL set to undefined]
+ expected: FAIL
+
+ [applet.codeBase: IDL set to 7]
+ expected: FAIL
+
+ [applet.codeBase: IDL set to 1.5]
+ expected: FAIL
+
+ [applet.codeBase: IDL set to true]
+ expected: FAIL
+
+ [applet.codeBase: IDL set to false]
+ expected: FAIL
+
+ [applet.codeBase: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [applet.codeBase: IDL set to NaN]
+ expected: FAIL
+
+ [applet.codeBase: IDL set to Infinity]
+ expected: FAIL
+
+ [applet.codeBase: IDL set to -Infinity]
+ expected: FAIL
+
+ [applet.codeBase: IDL set to "\\0"]
+ expected: FAIL
+
+ [applet.codeBase: IDL set to null]
+ expected: FAIL
+
+ [applet.codeBase: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [applet.codeBase: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [applet.height: setAttribute() to ""]
+ expected: FAIL
+
+ [applet.height: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [applet.height: setAttribute() to undefined]
+ expected: FAIL
+
+ [applet.height: setAttribute() to 7]
+ expected: FAIL
+
+ [applet.height: setAttribute() to 1.5]
+ expected: FAIL
+
+ [applet.height: setAttribute() to true]
+ expected: FAIL
+
+ [applet.height: setAttribute() to false]
+ expected: FAIL
+
+ [applet.height: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [applet.height: setAttribute() to NaN]
+ expected: FAIL
+
+ [applet.height: setAttribute() to Infinity]
+ expected: FAIL
+
+ [applet.height: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [applet.height: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [applet.height: setAttribute() to null]
+ expected: FAIL
+
+ [applet.height: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [applet.height: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [applet.height: IDL set to ""]
+ expected: FAIL
+
+ [applet.height: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [applet.height: IDL set to undefined]
+ expected: FAIL
+
+ [applet.height: IDL set to 7]
+ expected: FAIL
+
+ [applet.height: IDL set to 1.5]
+ expected: FAIL
+
+ [applet.height: IDL set to true]
+ expected: FAIL
+
+ [applet.height: IDL set to false]
+ expected: FAIL
+
+ [applet.height: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [applet.height: IDL set to NaN]
+ expected: FAIL
+
+ [applet.height: IDL set to Infinity]
+ expected: FAIL
+
+ [applet.height: IDL set to -Infinity]
+ expected: FAIL
+
+ [applet.height: IDL set to "\\0"]
+ expected: FAIL
+
+ [applet.height: IDL set to null]
+ expected: FAIL
+
+ [applet.height: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [applet.height: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to -2147483649]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to -36]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to -1]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to 0]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to 1]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to 257]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to 2147483648]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to 4294967295]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to 4294967296]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to ""]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to "-1"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to "-0"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to "0"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to "1"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to "\\v7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to "7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to "
7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to "
7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to "᠎7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to undefined]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to 1.5]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to true]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to false]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to NaN]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to Infinity]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to object "2"]
+ expected: FAIL
+
+ [applet.hspace: setAttribute() to object "3"]
+ expected: FAIL
+
+ [applet.hspace: IDL set to 0]
+ expected: FAIL
+
+ [applet.hspace: IDL set to 1]
+ expected: FAIL
+
+ [applet.hspace: IDL set to 257]
+ expected: FAIL
+
+ [applet.hspace: IDL set to 2147483647]
+ expected: FAIL
+
+ [applet.hspace: IDL set to "-0"]
+ expected: FAIL
+
+ [applet.hspace: IDL set to 2147483648]
+ expected: FAIL
+
+ [applet.hspace: IDL set to 4294967295]
+ expected: FAIL
+
+ [applet.object: setAttribute() to ""]
+ expected: FAIL
+
+ [applet.object: setAttribute() to " foo "]
+ expected: FAIL
+
+ [applet.object: setAttribute() to "http://site.example/"]
+ expected: FAIL
+
+ [applet.object: setAttribute() to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [applet.object: setAttribute() to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [applet.object: setAttribute() to undefined]
+ expected: FAIL
+
+ [applet.object: setAttribute() to 7]
+ expected: FAIL
+
+ [applet.object: setAttribute() to 1.5]
+ expected: FAIL
+
+ [applet.object: setAttribute() to true]
+ expected: FAIL
+
+ [applet.object: setAttribute() to false]
+ expected: FAIL
+
+ [applet.object: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [applet.object: setAttribute() to NaN]
+ expected: FAIL
+
+ [applet.object: setAttribute() to Infinity]
+ expected: FAIL
+
+ [applet.object: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [applet.object: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [applet.object: setAttribute() to null]
+ expected: FAIL
+
+ [applet.object: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [applet.object: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [applet.object: IDL set to ""]
+ expected: FAIL
+
+ [applet.object: IDL set to " foo "]
+ expected: FAIL
+
+ [applet.object: IDL set to "http://site.example/"]
+ expected: FAIL
+
+ [applet.object: IDL set to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [applet.object: IDL set to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [applet.object: IDL set to undefined]
+ expected: FAIL
+
+ [applet.object: IDL set to 7]
+ expected: FAIL
+
+ [applet.object: IDL set to 1.5]
+ expected: FAIL
+
+ [applet.object: IDL set to true]
+ expected: FAIL
+
+ [applet.object: IDL set to false]
+ expected: FAIL
+
+ [applet.object: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [applet.object: IDL set to NaN]
+ expected: FAIL
+
+ [applet.object: IDL set to Infinity]
+ expected: FAIL
+
+ [applet.object: IDL set to -Infinity]
+ expected: FAIL
+
+ [applet.object: IDL set to "\\0"]
+ expected: FAIL
+
+ [applet.object: IDL set to null]
+ expected: FAIL
+
+ [applet.object: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [applet.object: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to -2147483649]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to -36]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to -1]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to 0]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to 1]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to 257]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to 2147483648]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to 4294967295]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to 4294967296]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to ""]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to "-1"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to "-0"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to "0"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to "1"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to "\\v7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to "7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to "
7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to "
7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to "᠎7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to undefined]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to 1.5]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to true]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to false]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to NaN]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to Infinity]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to object "2"]
+ expected: FAIL
+
+ [applet.vspace: setAttribute() to object "3"]
+ expected: FAIL
+
+ [applet.vspace: IDL set to 0]
+ expected: FAIL
+
+ [applet.vspace: IDL set to 1]
+ expected: FAIL
+
+ [applet.vspace: IDL set to 257]
+ expected: FAIL
+
+ [applet.vspace: IDL set to 2147483647]
+ expected: FAIL
+
+ [applet.vspace: IDL set to "-0"]
+ expected: FAIL
+
+ [applet.vspace: IDL set to 2147483648]
+ expected: FAIL
+
+ [applet.vspace: IDL set to 4294967295]
+ expected: FAIL
+
+ [applet.width: setAttribute() to ""]
+ expected: FAIL
+
+ [applet.width: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [applet.width: setAttribute() to undefined]
+ expected: FAIL
+
+ [applet.width: setAttribute() to 7]
+ expected: FAIL
+
+ [applet.width: setAttribute() to 1.5]
+ expected: FAIL
+
+ [applet.width: setAttribute() to true]
+ expected: FAIL
+
+ [applet.width: setAttribute() to false]
+ expected: FAIL
+
+ [applet.width: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [applet.width: setAttribute() to NaN]
+ expected: FAIL
+
+ [applet.width: setAttribute() to Infinity]
+ expected: FAIL
+
+ [applet.width: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [applet.width: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [applet.width: setAttribute() to null]
+ expected: FAIL
+
+ [applet.width: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [applet.width: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [applet.width: IDL set to ""]
+ expected: FAIL
+
+ [applet.width: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [applet.width: IDL set to undefined]
+ expected: FAIL
+
+ [applet.width: IDL set to 7]
+ expected: FAIL
+
+ [applet.width: IDL set to 1.5]
+ expected: FAIL
+
+ [applet.width: IDL set to true]
+ expected: FAIL
+
+ [applet.width: IDL set to false]
+ expected: FAIL
+
+ [applet.width: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [applet.width: IDL set to NaN]
+ expected: FAIL
+
+ [applet.width: IDL set to Infinity]
+ expected: FAIL
+
+ [applet.width: IDL set to -Infinity]
+ expected: FAIL
+
+ [applet.width: IDL set to "\\0"]
+ expected: FAIL
+
+ [applet.width: IDL set to null]
+ expected: FAIL
+
+ [applet.width: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [applet.width: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to true]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to false]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to null]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [marquee.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [marquee.dir: IDL set to ""]
+ expected: FAIL
+
+ [marquee.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [marquee.dir: IDL set to undefined]
+ expected: FAIL
+
+ [marquee.dir: IDL set to 7]
+ expected: FAIL
+
+ [marquee.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [marquee.dir: IDL set to true]
+ expected: FAIL
+
+ [marquee.dir: IDL set to false]
+ expected: FAIL
+
+ [marquee.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [marquee.dir: IDL set to NaN]
+ expected: FAIL
+
+ [marquee.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [marquee.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [marquee.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [marquee.dir: IDL set to null]
+ expected: FAIL
+
+ [marquee.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [marquee.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [marquee.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [marquee.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [marquee.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [marquee.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [marquee.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [marquee.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [marquee.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [marquee.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [marquee.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [marquee.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [marquee.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [marquee.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [marquee.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [marquee.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [marquee.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [marquee.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [marquee.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [marquee.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [marquee.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [marquee.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [marquee.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [marquee.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [marquee.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [marquee.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [marquee.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [marquee.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [marquee.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [marquee.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [marquee.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [marquee.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [marquee.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [marquee.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [marquee.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [marquee.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [marquee.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [marquee.accessKey: IDL set to true]
+ expected: FAIL
+
+ [marquee.accessKey: IDL set to false]
+ expected: FAIL
+
+ [marquee.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [marquee.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [marquee.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [marquee.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [marquee.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [marquee.accessKey: IDL set to null]
+ expected: FAIL
+
+ [marquee.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [marquee.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [marquee.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [marquee.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [marquee.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [marquee.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [marquee.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [marquee.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [marquee.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [marquee.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [marquee.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [marquee.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [marquee.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [marquee.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [marquee.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [marquee.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [marquee.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [marquee.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [marquee.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [marquee.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [marquee.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [marquee.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [marquee.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [marquee.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [marquee.behavior: setAttribute() to ""]
+ expected: FAIL
+
+ [marquee.behavior: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [marquee.behavior: setAttribute() to undefined]
+ expected: FAIL
+
+ [marquee.behavior: setAttribute() to 7]
+ expected: FAIL
+
+ [marquee.behavior: setAttribute() to 1.5]
+ expected: FAIL
+
+ [marquee.behavior: setAttribute() to true]
+ expected: FAIL
+
+ [marquee.behavior: setAttribute() to false]
+ expected: FAIL
+
+ [marquee.behavior: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [marquee.behavior: setAttribute() to NaN]
+ expected: FAIL
+
+ [marquee.behavior: setAttribute() to Infinity]
+ expected: FAIL
+
+ [marquee.behavior: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [marquee.behavior: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [marquee.behavior: setAttribute() to null]
+ expected: FAIL
+
+ [marquee.behavior: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [marquee.behavior: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [marquee.behavior: IDL set to ""]
+ expected: FAIL
+
+ [marquee.behavior: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [marquee.behavior: IDL set to undefined]
+ expected: FAIL
+
+ [marquee.behavior: IDL set to 7]
+ expected: FAIL
+
+ [marquee.behavior: IDL set to 1.5]
+ expected: FAIL
+
+ [marquee.behavior: IDL set to true]
+ expected: FAIL
+
+ [marquee.behavior: IDL set to false]
+ expected: FAIL
+
+ [marquee.behavior: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [marquee.behavior: IDL set to NaN]
+ expected: FAIL
+
+ [marquee.behavior: IDL set to Infinity]
+ expected: FAIL
+
+ [marquee.behavior: IDL set to -Infinity]
+ expected: FAIL
+
+ [marquee.behavior: IDL set to "\\0"]
+ expected: FAIL
+
+ [marquee.behavior: IDL set to null]
+ expected: FAIL
+
+ [marquee.behavior: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [marquee.behavior: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [marquee.bgColor: setAttribute() to ""]
+ expected: FAIL
+
+ [marquee.bgColor: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [marquee.bgColor: setAttribute() to undefined]
+ expected: FAIL
+
+ [marquee.bgColor: setAttribute() to 7]
+ expected: FAIL
+
+ [marquee.bgColor: setAttribute() to 1.5]
+ expected: FAIL
+
+ [marquee.bgColor: setAttribute() to true]
+ expected: FAIL
+
+ [marquee.bgColor: setAttribute() to false]
+ expected: FAIL
+
+ [marquee.bgColor: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [marquee.bgColor: setAttribute() to NaN]
+ expected: FAIL
+
+ [marquee.bgColor: setAttribute() to Infinity]
+ expected: FAIL
+
+ [marquee.bgColor: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [marquee.bgColor: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [marquee.bgColor: setAttribute() to null]
+ expected: FAIL
+
+ [marquee.bgColor: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [marquee.bgColor: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [marquee.bgColor: IDL set to ""]
+ expected: FAIL
+
+ [marquee.bgColor: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [marquee.bgColor: IDL set to undefined]
+ expected: FAIL
+
+ [marquee.bgColor: IDL set to 7]
+ expected: FAIL
+
+ [marquee.bgColor: IDL set to 1.5]
+ expected: FAIL
+
+ [marquee.bgColor: IDL set to true]
+ expected: FAIL
+
+ [marquee.bgColor: IDL set to false]
+ expected: FAIL
+
+ [marquee.bgColor: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [marquee.bgColor: IDL set to NaN]
+ expected: FAIL
+
+ [marquee.bgColor: IDL set to Infinity]
+ expected: FAIL
+
+ [marquee.bgColor: IDL set to -Infinity]
+ expected: FAIL
+
+ [marquee.bgColor: IDL set to "\\0"]
+ expected: FAIL
+
+ [marquee.bgColor: IDL set to null]
+ expected: FAIL
+
+ [marquee.bgColor: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [marquee.bgColor: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [marquee.direction: setAttribute() to ""]
+ expected: FAIL
+
+ [marquee.direction: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [marquee.direction: setAttribute() to undefined]
+ expected: FAIL
+
+ [marquee.direction: setAttribute() to 7]
+ expected: FAIL
+
+ [marquee.direction: setAttribute() to 1.5]
+ expected: FAIL
+
+ [marquee.direction: setAttribute() to true]
+ expected: FAIL
+
+ [marquee.direction: setAttribute() to false]
+ expected: FAIL
+
+ [marquee.direction: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [marquee.direction: setAttribute() to NaN]
+ expected: FAIL
+
+ [marquee.direction: setAttribute() to Infinity]
+ expected: FAIL
+
+ [marquee.direction: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [marquee.direction: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [marquee.direction: setAttribute() to null]
+ expected: FAIL
+
+ [marquee.direction: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [marquee.direction: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [marquee.direction: IDL set to ""]
+ expected: FAIL
+
+ [marquee.direction: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [marquee.direction: IDL set to undefined]
+ expected: FAIL
+
+ [marquee.direction: IDL set to 7]
+ expected: FAIL
+
+ [marquee.direction: IDL set to 1.5]
+ expected: FAIL
+
+ [marquee.direction: IDL set to true]
+ expected: FAIL
+
+ [marquee.direction: IDL set to false]
+ expected: FAIL
+
+ [marquee.direction: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [marquee.direction: IDL set to NaN]
+ expected: FAIL
+
+ [marquee.direction: IDL set to Infinity]
+ expected: FAIL
+
+ [marquee.direction: IDL set to -Infinity]
+ expected: FAIL
+
+ [marquee.direction: IDL set to "\\0"]
+ expected: FAIL
+
+ [marquee.direction: IDL set to null]
+ expected: FAIL
+
+ [marquee.direction: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [marquee.direction: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [marquee.height: setAttribute() to ""]
+ expected: FAIL
+
+ [marquee.height: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [marquee.height: setAttribute() to undefined]
+ expected: FAIL
+
+ [marquee.height: setAttribute() to 7]
+ expected: FAIL
+
+ [marquee.height: setAttribute() to 1.5]
+ expected: FAIL
+
+ [marquee.height: setAttribute() to true]
+ expected: FAIL
+
+ [marquee.height: setAttribute() to false]
+ expected: FAIL
+
+ [marquee.height: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [marquee.height: setAttribute() to NaN]
+ expected: FAIL
+
+ [marquee.height: setAttribute() to Infinity]
+ expected: FAIL
+
+ [marquee.height: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [marquee.height: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [marquee.height: setAttribute() to null]
+ expected: FAIL
+
+ [marquee.height: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [marquee.height: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [marquee.height: IDL set to ""]
+ expected: FAIL
+
+ [marquee.height: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [marquee.height: IDL set to undefined]
+ expected: FAIL
+
+ [marquee.height: IDL set to 7]
+ expected: FAIL
+
+ [marquee.height: IDL set to 1.5]
+ expected: FAIL
+
+ [marquee.height: IDL set to true]
+ expected: FAIL
+
+ [marquee.height: IDL set to false]
+ expected: FAIL
+
+ [marquee.height: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [marquee.height: IDL set to NaN]
+ expected: FAIL
+
+ [marquee.height: IDL set to Infinity]
+ expected: FAIL
+
+ [marquee.height: IDL set to -Infinity]
+ expected: FAIL
+
+ [marquee.height: IDL set to "\\0"]
+ expected: FAIL
+
+ [marquee.height: IDL set to null]
+ expected: FAIL
+
+ [marquee.height: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [marquee.height: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to -2147483649]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to -36]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to -1]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to 0]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to 1]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to 257]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to 2147483648]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to 4294967295]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to 4294967296]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to ""]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to "-1"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to "-0"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to "0"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to "1"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to "\\v7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to "7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to "
7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to "
7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to "᠎7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to undefined]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to 1.5]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to true]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to false]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to NaN]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to Infinity]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to object "2"]
+ expected: FAIL
+
+ [marquee.hspace: setAttribute() to object "3"]
+ expected: FAIL
+
+ [marquee.hspace: IDL set to 0]
+ expected: FAIL
+
+ [marquee.hspace: IDL set to 1]
+ expected: FAIL
+
+ [marquee.hspace: IDL set to 257]
+ expected: FAIL
+
+ [marquee.hspace: IDL set to 2147483647]
+ expected: FAIL
+
+ [marquee.hspace: IDL set to "-0"]
+ expected: FAIL
+
+ [marquee.hspace: IDL set to 2147483648]
+ expected: FAIL
+
+ [marquee.hspace: IDL set to 4294967295]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to -2147483649]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to -36]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to -1]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to 0]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to 1]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to 257]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to 2147483648]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to 4294967295]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to 4294967296]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to ""]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to "-1"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to "-0"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to "0"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to "1"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to "\\v7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to "7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to "
7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to "
7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to "᠎7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to undefined]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to 1.5]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to true]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to false]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to NaN]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to Infinity]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to object "2"]
+ expected: FAIL
+
+ [marquee.scrollAmount: setAttribute() to object "3"]
+ expected: FAIL
+
+ [marquee.scrollAmount: IDL set to 0]
+ expected: FAIL
+
+ [marquee.scrollAmount: IDL set to 1]
+ expected: FAIL
+
+ [marquee.scrollAmount: IDL set to 257]
+ expected: FAIL
+
+ [marquee.scrollAmount: IDL set to 2147483647]
+ expected: FAIL
+
+ [marquee.scrollAmount: IDL set to "-0"]
+ expected: FAIL
+
+ [marquee.scrollAmount: IDL set to 2147483648]
+ expected: FAIL
+
+ [marquee.scrollAmount: IDL set to 4294967295]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to -2147483649]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to -36]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to -1]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to 0]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to 1]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to 257]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to 2147483648]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to 4294967295]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to 4294967296]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to ""]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to "-1"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to "-0"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to "0"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to "1"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to "\\v7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to "7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to "
7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to "
7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to "᠎7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to undefined]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to 1.5]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to true]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to false]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to NaN]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to Infinity]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to object "2"]
+ expected: FAIL
+
+ [marquee.scrollDelay: setAttribute() to object "3"]
+ expected: FAIL
+
+ [marquee.scrollDelay: IDL set to 0]
+ expected: FAIL
+
+ [marquee.scrollDelay: IDL set to 1]
+ expected: FAIL
+
+ [marquee.scrollDelay: IDL set to 257]
+ expected: FAIL
+
+ [marquee.scrollDelay: IDL set to 2147483647]
+ expected: FAIL
+
+ [marquee.scrollDelay: IDL set to "-0"]
+ expected: FAIL
+
+ [marquee.scrollDelay: IDL set to 2147483648]
+ expected: FAIL
+
+ [marquee.scrollDelay: IDL set to 4294967295]
+ expected: FAIL
+
+ [marquee.trueSpeed: setAttribute() to ""]
+ expected: FAIL
+
+ [marquee.trueSpeed: setAttribute() to " foo "]
+ expected: FAIL
+
+ [marquee.trueSpeed: setAttribute() to undefined]
+ expected: FAIL
+
+ [marquee.trueSpeed: setAttribute() to null]
+ expected: FAIL
+
+ [marquee.trueSpeed: setAttribute() to 7]
+ expected: FAIL
+
+ [marquee.trueSpeed: setAttribute() to 1.5]
+ expected: FAIL
+
+ [marquee.trueSpeed: setAttribute() to true]
+ expected: FAIL
+
+ [marquee.trueSpeed: setAttribute() to false]
+ expected: FAIL
+
+ [marquee.trueSpeed: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [marquee.trueSpeed: setAttribute() to NaN]
+ expected: FAIL
+
+ [marquee.trueSpeed: setAttribute() to Infinity]
+ expected: FAIL
+
+ [marquee.trueSpeed: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [marquee.trueSpeed: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [marquee.trueSpeed: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [marquee.trueSpeed: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [marquee.trueSpeed: setAttribute() to "trueSpeed"]
+ expected: FAIL
+
+ [marquee.trueSpeed: IDL set to ""]
+ expected: FAIL
+
+ [marquee.trueSpeed: IDL set to " foo "]
+ expected: FAIL
+
+ [marquee.trueSpeed: IDL set to undefined]
+ expected: FAIL
+
+ [marquee.trueSpeed: IDL set to null]
+ expected: FAIL
+
+ [marquee.trueSpeed: IDL set to 7]
+ expected: FAIL
+
+ [marquee.trueSpeed: IDL set to 1.5]
+ expected: FAIL
+
+ [marquee.trueSpeed: IDL set to false]
+ expected: FAIL
+
+ [marquee.trueSpeed: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [marquee.trueSpeed: IDL set to NaN]
+ expected: FAIL
+
+ [marquee.trueSpeed: IDL set to Infinity]
+ expected: FAIL
+
+ [marquee.trueSpeed: IDL set to -Infinity]
+ expected: FAIL
+
+ [marquee.trueSpeed: IDL set to "\\0"]
+ expected: FAIL
+
+ [marquee.trueSpeed: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [marquee.trueSpeed: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to -2147483649]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to -36]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to -1]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to 0]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to 1]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to 257]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to 2147483648]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to 4294967295]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to 4294967296]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to ""]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to "-1"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to "-0"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to "0"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to "1"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to "\\v7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to "7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to "
7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to "
7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to "᠎7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to " 7"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to undefined]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to 1.5]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to true]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to false]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to NaN]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to Infinity]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to object "2"]
+ expected: FAIL
+
+ [marquee.vspace: setAttribute() to object "3"]
+ expected: FAIL
+
+ [marquee.vspace: IDL set to 0]
+ expected: FAIL
+
+ [marquee.vspace: IDL set to 1]
+ expected: FAIL
+
+ [marquee.vspace: IDL set to 257]
+ expected: FAIL
+
+ [marquee.vspace: IDL set to 2147483647]
+ expected: FAIL
+
+ [marquee.vspace: IDL set to "-0"]
+ expected: FAIL
+
+ [marquee.vspace: IDL set to 2147483648]
+ expected: FAIL
+
+ [marquee.vspace: IDL set to 4294967295]
+ expected: FAIL
+
+ [marquee.width: setAttribute() to ""]
+ expected: FAIL
+
+ [marquee.width: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [marquee.width: setAttribute() to undefined]
+ expected: FAIL
+
+ [marquee.width: setAttribute() to 7]
+ expected: FAIL
+
+ [marquee.width: setAttribute() to 1.5]
+ expected: FAIL
+
+ [marquee.width: setAttribute() to true]
+ expected: FAIL
+
+ [marquee.width: setAttribute() to false]
+ expected: FAIL
+
+ [marquee.width: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [marquee.width: setAttribute() to NaN]
+ expected: FAIL
+
+ [marquee.width: setAttribute() to Infinity]
+ expected: FAIL
+
+ [marquee.width: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [marquee.width: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [marquee.width: setAttribute() to null]
+ expected: FAIL
+
+ [marquee.width: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [marquee.width: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [marquee.width: IDL set to ""]
+ expected: FAIL
+
+ [marquee.width: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [marquee.width: IDL set to undefined]
+ expected: FAIL
+
+ [marquee.width: IDL set to 7]
+ expected: FAIL
+
+ [marquee.width: IDL set to 1.5]
+ expected: FAIL
+
+ [marquee.width: IDL set to true]
+ expected: FAIL
+
+ [marquee.width: IDL set to false]
+ expected: FAIL
+
+ [marquee.width: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [marquee.width: IDL set to NaN]
+ expected: FAIL
+
+ [marquee.width: IDL set to Infinity]
+ expected: FAIL
+
+ [marquee.width: IDL set to -Infinity]
+ expected: FAIL
+
+ [marquee.width: IDL set to "\\0"]
+ expected: FAIL
+
+ [marquee.width: IDL set to null]
+ expected: FAIL
+
+ [marquee.width: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [marquee.width: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to true]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to false]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to null]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [frameset.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [frameset.dir: IDL set to ""]
+ expected: FAIL
+
+ [frameset.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [frameset.dir: IDL set to undefined]
+ expected: FAIL
+
+ [frameset.dir: IDL set to 7]
+ expected: FAIL
+
+ [frameset.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [frameset.dir: IDL set to true]
+ expected: FAIL
+
+ [frameset.dir: IDL set to false]
+ expected: FAIL
+
+ [frameset.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [frameset.dir: IDL set to NaN]
+ expected: FAIL
+
+ [frameset.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [frameset.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [frameset.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [frameset.dir: IDL set to null]
+ expected: FAIL
+
+ [frameset.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [frameset.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [frameset.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [frameset.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [frameset.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [frameset.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [frameset.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [frameset.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [frameset.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [frameset.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [frameset.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [frameset.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [frameset.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [frameset.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [frameset.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [frameset.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [frameset.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [frameset.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [frameset.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [frameset.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [frameset.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [frameset.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [frameset.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [frameset.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [frameset.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [frameset.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [frameset.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [frameset.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [frameset.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [frameset.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [frameset.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [frameset.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [frameset.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [frameset.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [frameset.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [frameset.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [frameset.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [frameset.accessKey: IDL set to true]
+ expected: FAIL
+
+ [frameset.accessKey: IDL set to false]
+ expected: FAIL
+
+ [frameset.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [frameset.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [frameset.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [frameset.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [frameset.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [frameset.accessKey: IDL set to null]
+ expected: FAIL
+
+ [frameset.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [frameset.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [frameset.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [frameset.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [frameset.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [frameset.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [frameset.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [frameset.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [frameset.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [frameset.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [frameset.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [frameset.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [frameset.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [frameset.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [frameset.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [frameset.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [frameset.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [frameset.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [frameset.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [frameset.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [frameset.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [frameset.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [frameset.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [frameset.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [frameset.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [frameset.cols: setAttribute() to ""]
+ expected: FAIL
+
+ [frameset.cols: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [frameset.cols: setAttribute() to undefined]
+ expected: FAIL
+
+ [frameset.cols: setAttribute() to 7]
+ expected: FAIL
+
+ [frameset.cols: setAttribute() to 1.5]
+ expected: FAIL
+
+ [frameset.cols: setAttribute() to true]
+ expected: FAIL
+
+ [frameset.cols: setAttribute() to false]
+ expected: FAIL
+
+ [frameset.cols: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [frameset.cols: setAttribute() to NaN]
+ expected: FAIL
+
+ [frameset.cols: setAttribute() to Infinity]
+ expected: FAIL
+
+ [frameset.cols: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [frameset.cols: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [frameset.cols: setAttribute() to null]
+ expected: FAIL
+
+ [frameset.cols: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [frameset.cols: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [frameset.cols: IDL set to ""]
+ expected: FAIL
+
+ [frameset.cols: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [frameset.cols: IDL set to undefined]
+ expected: FAIL
+
+ [frameset.cols: IDL set to 7]
+ expected: FAIL
+
+ [frameset.cols: IDL set to 1.5]
+ expected: FAIL
+
+ [frameset.cols: IDL set to true]
+ expected: FAIL
+
+ [frameset.cols: IDL set to false]
+ expected: FAIL
+
+ [frameset.cols: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [frameset.cols: IDL set to NaN]
+ expected: FAIL
+
+ [frameset.cols: IDL set to Infinity]
+ expected: FAIL
+
+ [frameset.cols: IDL set to -Infinity]
+ expected: FAIL
+
+ [frameset.cols: IDL set to "\\0"]
+ expected: FAIL
+
+ [frameset.cols: IDL set to null]
+ expected: FAIL
+
+ [frameset.cols: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [frameset.cols: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [frameset.rows: setAttribute() to ""]
+ expected: FAIL
+
+ [frameset.rows: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [frameset.rows: setAttribute() to undefined]
+ expected: FAIL
+
+ [frameset.rows: setAttribute() to 7]
+ expected: FAIL
+
+ [frameset.rows: setAttribute() to 1.5]
+ expected: FAIL
+
+ [frameset.rows: setAttribute() to true]
+ expected: FAIL
+
+ [frameset.rows: setAttribute() to false]
+ expected: FAIL
+
+ [frameset.rows: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [frameset.rows: setAttribute() to NaN]
+ expected: FAIL
+
+ [frameset.rows: setAttribute() to Infinity]
+ expected: FAIL
+
+ [frameset.rows: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [frameset.rows: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [frameset.rows: setAttribute() to null]
+ expected: FAIL
+
+ [frameset.rows: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [frameset.rows: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [frameset.rows: IDL set to ""]
+ expected: FAIL
+
+ [frameset.rows: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [frameset.rows: IDL set to undefined]
+ expected: FAIL
+
+ [frameset.rows: IDL set to 7]
+ expected: FAIL
+
+ [frameset.rows: IDL set to 1.5]
+ expected: FAIL
+
+ [frameset.rows: IDL set to true]
+ expected: FAIL
+
+ [frameset.rows: IDL set to false]
+ expected: FAIL
+
+ [frameset.rows: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [frameset.rows: IDL set to NaN]
+ expected: FAIL
+
+ [frameset.rows: IDL set to Infinity]
+ expected: FAIL
+
+ [frameset.rows: IDL set to -Infinity]
+ expected: FAIL
+
+ [frameset.rows: IDL set to "\\0"]
+ expected: FAIL
+
+ [frameset.rows: IDL set to null]
+ expected: FAIL
+
+ [frameset.rows: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [frameset.rows: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to true]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to false]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to null]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [frame.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [frame.dir: IDL set to ""]
+ expected: FAIL
+
+ [frame.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [frame.dir: IDL set to undefined]
+ expected: FAIL
+
+ [frame.dir: IDL set to 7]
+ expected: FAIL
+
+ [frame.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [frame.dir: IDL set to true]
+ expected: FAIL
+
+ [frame.dir: IDL set to false]
+ expected: FAIL
+
+ [frame.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [frame.dir: IDL set to NaN]
+ expected: FAIL
+
+ [frame.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [frame.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [frame.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [frame.dir: IDL set to null]
+ expected: FAIL
+
+ [frame.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [frame.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [frame.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [frame.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [frame.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [frame.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [frame.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [frame.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [frame.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [frame.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [frame.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [frame.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [frame.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [frame.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [frame.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [frame.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [frame.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [frame.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [frame.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [frame.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [frame.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [frame.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [frame.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [frame.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [frame.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [frame.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [frame.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [frame.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [frame.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [frame.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [frame.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [frame.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [frame.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [frame.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [frame.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [frame.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [frame.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [frame.accessKey: IDL set to true]
+ expected: FAIL
+
+ [frame.accessKey: IDL set to false]
+ expected: FAIL
+
+ [frame.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [frame.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [frame.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [frame.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [frame.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [frame.accessKey: IDL set to null]
+ expected: FAIL
+
+ [frame.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [frame.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [frame.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [frame.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [frame.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [frame.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [frame.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [frame.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [frame.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [frame.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [frame.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [frame.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [frame.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [frame.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [frame.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [frame.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [frame.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [frame.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [frame.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [frame.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [frame.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [frame.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [frame.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [frame.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [frame.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [frame.name: setAttribute() to ""]
+ expected: FAIL
+
+ [frame.name: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [frame.name: setAttribute() to undefined]
+ expected: FAIL
+
+ [frame.name: setAttribute() to 7]
+ expected: FAIL
+
+ [frame.name: setAttribute() to 1.5]
+ expected: FAIL
+
+ [frame.name: setAttribute() to true]
+ expected: FAIL
+
+ [frame.name: setAttribute() to false]
+ expected: FAIL
+
+ [frame.name: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [frame.name: setAttribute() to NaN]
+ expected: FAIL
+
+ [frame.name: setAttribute() to Infinity]
+ expected: FAIL
+
+ [frame.name: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [frame.name: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [frame.name: setAttribute() to null]
+ expected: FAIL
+
+ [frame.name: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [frame.name: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [frame.name: IDL set to ""]
+ expected: FAIL
+
+ [frame.name: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [frame.name: IDL set to undefined]
+ expected: FAIL
+
+ [frame.name: IDL set to 7]
+ expected: FAIL
+
+ [frame.name: IDL set to 1.5]
+ expected: FAIL
+
+ [frame.name: IDL set to true]
+ expected: FAIL
+
+ [frame.name: IDL set to false]
+ expected: FAIL
+
+ [frame.name: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [frame.name: IDL set to NaN]
+ expected: FAIL
+
+ [frame.name: IDL set to Infinity]
+ expected: FAIL
+
+ [frame.name: IDL set to -Infinity]
+ expected: FAIL
+
+ [frame.name: IDL set to "\\0"]
+ expected: FAIL
+
+ [frame.name: IDL set to null]
+ expected: FAIL
+
+ [frame.name: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [frame.name: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [frame.scrolling: setAttribute() to ""]
+ expected: FAIL
+
+ [frame.scrolling: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [frame.scrolling: setAttribute() to undefined]
+ expected: FAIL
+
+ [frame.scrolling: setAttribute() to 7]
+ expected: FAIL
+
+ [frame.scrolling: setAttribute() to 1.5]
+ expected: FAIL
+
+ [frame.scrolling: setAttribute() to true]
+ expected: FAIL
+
+ [frame.scrolling: setAttribute() to false]
+ expected: FAIL
+
+ [frame.scrolling: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [frame.scrolling: setAttribute() to NaN]
+ expected: FAIL
+
+ [frame.scrolling: setAttribute() to Infinity]
+ expected: FAIL
+
+ [frame.scrolling: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [frame.scrolling: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [frame.scrolling: setAttribute() to null]
+ expected: FAIL
+
+ [frame.scrolling: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [frame.scrolling: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [frame.scrolling: IDL set to ""]
+ expected: FAIL
+
+ [frame.scrolling: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [frame.scrolling: IDL set to undefined]
+ expected: FAIL
+
+ [frame.scrolling: IDL set to 7]
+ expected: FAIL
+
+ [frame.scrolling: IDL set to 1.5]
+ expected: FAIL
+
+ [frame.scrolling: IDL set to true]
+ expected: FAIL
+
+ [frame.scrolling: IDL set to false]
+ expected: FAIL
+
+ [frame.scrolling: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [frame.scrolling: IDL set to NaN]
+ expected: FAIL
+
+ [frame.scrolling: IDL set to Infinity]
+ expected: FAIL
+
+ [frame.scrolling: IDL set to -Infinity]
+ expected: FAIL
+
+ [frame.scrolling: IDL set to "\\0"]
+ expected: FAIL
+
+ [frame.scrolling: IDL set to null]
+ expected: FAIL
+
+ [frame.scrolling: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [frame.scrolling: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [frame.src: setAttribute() to ""]
+ expected: FAIL
+
+ [frame.src: setAttribute() to " foo "]
+ expected: FAIL
+
+ [frame.src: setAttribute() to "http://site.example/"]
+ expected: FAIL
+
+ [frame.src: setAttribute() to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [frame.src: setAttribute() to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [frame.src: setAttribute() to undefined]
+ expected: FAIL
+
+ [frame.src: setAttribute() to 7]
+ expected: FAIL
+
+ [frame.src: setAttribute() to 1.5]
+ expected: FAIL
+
+ [frame.src: setAttribute() to true]
+ expected: FAIL
+
+ [frame.src: setAttribute() to false]
+ expected: FAIL
+
+ [frame.src: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [frame.src: setAttribute() to NaN]
+ expected: FAIL
+
+ [frame.src: setAttribute() to Infinity]
+ expected: FAIL
+
+ [frame.src: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [frame.src: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [frame.src: setAttribute() to null]
+ expected: FAIL
+
+ [frame.src: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [frame.src: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [frame.src: IDL set to ""]
+ expected: FAIL
+
+ [frame.src: IDL set to " foo "]
+ expected: FAIL
+
+ [frame.src: IDL set to "http://site.example/"]
+ expected: FAIL
+
+ [frame.src: IDL set to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [frame.src: IDL set to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [frame.src: IDL set to undefined]
+ expected: FAIL
+
+ [frame.src: IDL set to 7]
+ expected: FAIL
+
+ [frame.src: IDL set to 1.5]
+ expected: FAIL
+
+ [frame.src: IDL set to true]
+ expected: FAIL
+
+ [frame.src: IDL set to false]
+ expected: FAIL
+
+ [frame.src: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [frame.src: IDL set to NaN]
+ expected: FAIL
+
+ [frame.src: IDL set to Infinity]
+ expected: FAIL
+
+ [frame.src: IDL set to -Infinity]
+ expected: FAIL
+
+ [frame.src: IDL set to "\\0"]
+ expected: FAIL
+
+ [frame.src: IDL set to null]
+ expected: FAIL
+
+ [frame.src: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [frame.src: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [frame.frameBorder: setAttribute() to ""]
+ expected: FAIL
+
+ [frame.frameBorder: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [frame.frameBorder: setAttribute() to undefined]
+ expected: FAIL
+
+ [frame.frameBorder: setAttribute() to 7]
+ expected: FAIL
+
+ [frame.frameBorder: setAttribute() to 1.5]
+ expected: FAIL
+
+ [frame.frameBorder: setAttribute() to true]
+ expected: FAIL
+
+ [frame.frameBorder: setAttribute() to false]
+ expected: FAIL
+
+ [frame.frameBorder: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [frame.frameBorder: setAttribute() to NaN]
+ expected: FAIL
+
+ [frame.frameBorder: setAttribute() to Infinity]
+ expected: FAIL
+
+ [frame.frameBorder: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [frame.frameBorder: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [frame.frameBorder: setAttribute() to null]
+ expected: FAIL
+
+ [frame.frameBorder: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [frame.frameBorder: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [frame.frameBorder: IDL set to ""]
+ expected: FAIL
+
+ [frame.frameBorder: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [frame.frameBorder: IDL set to undefined]
+ expected: FAIL
+
+ [frame.frameBorder: IDL set to 7]
+ expected: FAIL
+
+ [frame.frameBorder: IDL set to 1.5]
+ expected: FAIL
+
+ [frame.frameBorder: IDL set to true]
+ expected: FAIL
+
+ [frame.frameBorder: IDL set to false]
+ expected: FAIL
+
+ [frame.frameBorder: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [frame.frameBorder: IDL set to NaN]
+ expected: FAIL
+
+ [frame.frameBorder: IDL set to Infinity]
+ expected: FAIL
+
+ [frame.frameBorder: IDL set to -Infinity]
+ expected: FAIL
+
+ [frame.frameBorder: IDL set to "\\0"]
+ expected: FAIL
+
+ [frame.frameBorder: IDL set to null]
+ expected: FAIL
+
+ [frame.frameBorder: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [frame.frameBorder: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [frame.longDesc: setAttribute() to ""]
+ expected: FAIL
+
+ [frame.longDesc: setAttribute() to " foo "]
+ expected: FAIL
+
+ [frame.longDesc: setAttribute() to "http://site.example/"]
+ expected: FAIL
+
+ [frame.longDesc: setAttribute() to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [frame.longDesc: setAttribute() to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [frame.longDesc: setAttribute() to undefined]
+ expected: FAIL
+
+ [frame.longDesc: setAttribute() to 7]
+ expected: FAIL
+
+ [frame.longDesc: setAttribute() to 1.5]
+ expected: FAIL
+
+ [frame.longDesc: setAttribute() to true]
+ expected: FAIL
+
+ [frame.longDesc: setAttribute() to false]
+ expected: FAIL
+
+ [frame.longDesc: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [frame.longDesc: setAttribute() to NaN]
+ expected: FAIL
+
+ [frame.longDesc: setAttribute() to Infinity]
+ expected: FAIL
+
+ [frame.longDesc: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [frame.longDesc: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [frame.longDesc: setAttribute() to null]
+ expected: FAIL
+
+ [frame.longDesc: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [frame.longDesc: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [frame.longDesc: IDL set to ""]
+ expected: FAIL
+
+ [frame.longDesc: IDL set to " foo "]
+ expected: FAIL
+
+ [frame.longDesc: IDL set to "http://site.example/"]
+ expected: FAIL
+
+ [frame.longDesc: IDL set to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [frame.longDesc: IDL set to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [frame.longDesc: IDL set to undefined]
+ expected: FAIL
+
+ [frame.longDesc: IDL set to 7]
+ expected: FAIL
+
+ [frame.longDesc: IDL set to 1.5]
+ expected: FAIL
+
+ [frame.longDesc: IDL set to true]
+ expected: FAIL
+
+ [frame.longDesc: IDL set to false]
+ expected: FAIL
+
+ [frame.longDesc: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [frame.longDesc: IDL set to NaN]
+ expected: FAIL
+
+ [frame.longDesc: IDL set to Infinity]
+ expected: FAIL
+
+ [frame.longDesc: IDL set to -Infinity]
+ expected: FAIL
+
+ [frame.longDesc: IDL set to "\\0"]
+ expected: FAIL
+
+ [frame.longDesc: IDL set to null]
+ expected: FAIL
+
+ [frame.longDesc: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [frame.longDesc: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [frame.noResize: setAttribute() to ""]
+ expected: FAIL
+
+ [frame.noResize: setAttribute() to " foo "]
+ expected: FAIL
+
+ [frame.noResize: setAttribute() to undefined]
+ expected: FAIL
+
+ [frame.noResize: setAttribute() to null]
+ expected: FAIL
+
+ [frame.noResize: setAttribute() to 7]
+ expected: FAIL
+
+ [frame.noResize: setAttribute() to 1.5]
+ expected: FAIL
+
+ [frame.noResize: setAttribute() to true]
+ expected: FAIL
+
+ [frame.noResize: setAttribute() to false]
+ expected: FAIL
+
+ [frame.noResize: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [frame.noResize: setAttribute() to NaN]
+ expected: FAIL
+
+ [frame.noResize: setAttribute() to Infinity]
+ expected: FAIL
+
+ [frame.noResize: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [frame.noResize: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [frame.noResize: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [frame.noResize: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [frame.noResize: setAttribute() to "noResize"]
+ expected: FAIL
+
+ [frame.noResize: IDL set to ""]
+ expected: FAIL
+
+ [frame.noResize: IDL set to " foo "]
+ expected: FAIL
+
+ [frame.noResize: IDL set to undefined]
+ expected: FAIL
+
+ [frame.noResize: IDL set to null]
+ expected: FAIL
+
+ [frame.noResize: IDL set to 7]
+ expected: FAIL
+
+ [frame.noResize: IDL set to 1.5]
+ expected: FAIL
+
+ [frame.noResize: IDL set to false]
+ expected: FAIL
+
+ [frame.noResize: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [frame.noResize: IDL set to NaN]
+ expected: FAIL
+
+ [frame.noResize: IDL set to Infinity]
+ expected: FAIL
+
+ [frame.noResize: IDL set to -Infinity]
+ expected: FAIL
+
+ [frame.noResize: IDL set to "\\0"]
+ expected: FAIL
+
+ [frame.noResize: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [frame.noResize: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [frame.marginHeight: setAttribute() to ""]
+ expected: FAIL
+
+ [frame.marginHeight: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [frame.marginHeight: setAttribute() to undefined]
+ expected: FAIL
+
+ [frame.marginHeight: setAttribute() to 7]
+ expected: FAIL
+
+ [frame.marginHeight: setAttribute() to 1.5]
+ expected: FAIL
+
+ [frame.marginHeight: setAttribute() to true]
+ expected: FAIL
+
+ [frame.marginHeight: setAttribute() to false]
+ expected: FAIL
+
+ [frame.marginHeight: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [frame.marginHeight: setAttribute() to NaN]
+ expected: FAIL
+
+ [frame.marginHeight: setAttribute() to Infinity]
+ expected: FAIL
+
+ [frame.marginHeight: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [frame.marginHeight: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [frame.marginHeight: setAttribute() to null]
+ expected: FAIL
+
+ [frame.marginHeight: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [frame.marginHeight: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [frame.marginHeight: IDL set to ""]
+ expected: FAIL
+
+ [frame.marginHeight: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [frame.marginHeight: IDL set to undefined]
+ expected: FAIL
+
+ [frame.marginHeight: IDL set to 7]
+ expected: FAIL
+
+ [frame.marginHeight: IDL set to 1.5]
+ expected: FAIL
+
+ [frame.marginHeight: IDL set to true]
+ expected: FAIL
+
+ [frame.marginHeight: IDL set to false]
+ expected: FAIL
+
+ [frame.marginHeight: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [frame.marginHeight: IDL set to NaN]
+ expected: FAIL
+
+ [frame.marginHeight: IDL set to Infinity]
+ expected: FAIL
+
+ [frame.marginHeight: IDL set to -Infinity]
+ expected: FAIL
+
+ [frame.marginHeight: IDL set to "\\0"]
+ expected: FAIL
+
+ [frame.marginHeight: IDL set to null]
+ expected: FAIL
+
+ [frame.marginHeight: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [frame.marginHeight: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [frame.marginWidth: setAttribute() to ""]
+ expected: FAIL
+
+ [frame.marginWidth: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [frame.marginWidth: setAttribute() to undefined]
+ expected: FAIL
+
+ [frame.marginWidth: setAttribute() to 7]
+ expected: FAIL
+
+ [frame.marginWidth: setAttribute() to 1.5]
+ expected: FAIL
+
+ [frame.marginWidth: setAttribute() to true]
+ expected: FAIL
+
+ [frame.marginWidth: setAttribute() to false]
+ expected: FAIL
+
+ [frame.marginWidth: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [frame.marginWidth: setAttribute() to NaN]
+ expected: FAIL
+
+ [frame.marginWidth: setAttribute() to Infinity]
+ expected: FAIL
+
+ [frame.marginWidth: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [frame.marginWidth: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [frame.marginWidth: setAttribute() to null]
+ expected: FAIL
+
+ [frame.marginWidth: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [frame.marginWidth: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [frame.marginWidth: IDL set to ""]
+ expected: FAIL
+
+ [frame.marginWidth: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [frame.marginWidth: IDL set to undefined]
+ expected: FAIL
+
+ [frame.marginWidth: IDL set to 7]
+ expected: FAIL
+
+ [frame.marginWidth: IDL set to 1.5]
+ expected: FAIL
+
+ [frame.marginWidth: IDL set to true]
+ expected: FAIL
+
+ [frame.marginWidth: IDL set to false]
+ expected: FAIL
+
+ [frame.marginWidth: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [frame.marginWidth: IDL set to NaN]
+ expected: FAIL
+
+ [frame.marginWidth: IDL set to Infinity]
+ expected: FAIL
+
+ [frame.marginWidth: IDL set to -Infinity]
+ expected: FAIL
+
+ [frame.marginWidth: IDL set to "\\0"]
+ expected: FAIL
+
+ [frame.marginWidth: IDL set to null]
+ expected: FAIL
+
+ [frame.marginWidth: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [frame.marginWidth: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to true]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to false]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to null]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [dir.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [dir.dir: IDL set to ""]
+ expected: FAIL
+
+ [dir.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dir.dir: IDL set to undefined]
+ expected: FAIL
+
+ [dir.dir: IDL set to 7]
+ expected: FAIL
+
+ [dir.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [dir.dir: IDL set to true]
+ expected: FAIL
+
+ [dir.dir: IDL set to false]
+ expected: FAIL
+
+ [dir.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [dir.dir: IDL set to NaN]
+ expected: FAIL
+
+ [dir.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [dir.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [dir.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [dir.dir: IDL set to null]
+ expected: FAIL
+
+ [dir.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [dir.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [dir.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [dir.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [dir.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [dir.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [dir.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [dir.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [dir.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [dir.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [dir.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [dir.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [dir.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [dir.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [dir.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [dir.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [dir.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [dir.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [dir.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dir.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [dir.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [dir.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [dir.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [dir.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [dir.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [dir.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [dir.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [dir.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [dir.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [dir.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [dir.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [dir.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [dir.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [dir.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dir.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [dir.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [dir.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [dir.accessKey: IDL set to true]
+ expected: FAIL
+
+ [dir.accessKey: IDL set to false]
+ expected: FAIL
+
+ [dir.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [dir.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [dir.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [dir.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [dir.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [dir.accessKey: IDL set to null]
+ expected: FAIL
+
+ [dir.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [dir.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [dir.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [dir.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [dir.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [dir.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [dir.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [dir.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [dir.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [dir.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [dir.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [dir.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [dir.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [dir.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [dir.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [dir.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [dir.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [dir.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [dir.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [dir.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [dir.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [dir.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [dir.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [dir.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [dir.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [dir.compact: setAttribute() to ""]
+ expected: FAIL
+
+ [dir.compact: setAttribute() to " foo "]
+ expected: FAIL
+
+ [dir.compact: setAttribute() to undefined]
+ expected: FAIL
+
+ [dir.compact: setAttribute() to null]
+ expected: FAIL
+
+ [dir.compact: setAttribute() to 7]
+ expected: FAIL
+
+ [dir.compact: setAttribute() to 1.5]
+ expected: FAIL
+
+ [dir.compact: setAttribute() to true]
+ expected: FAIL
+
+ [dir.compact: setAttribute() to false]
+ expected: FAIL
+
+ [dir.compact: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [dir.compact: setAttribute() to NaN]
+ expected: FAIL
+
+ [dir.compact: setAttribute() to Infinity]
+ expected: FAIL
+
+ [dir.compact: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [dir.compact: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [dir.compact: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [dir.compact: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [dir.compact: setAttribute() to "compact"]
+ expected: FAIL
+
+ [dir.compact: IDL set to ""]
+ expected: FAIL
+
+ [dir.compact: IDL set to " foo "]
+ expected: FAIL
+
+ [dir.compact: IDL set to undefined]
+ expected: FAIL
+
+ [dir.compact: IDL set to null]
+ expected: FAIL
+
+ [dir.compact: IDL set to 7]
+ expected: FAIL
+
+ [dir.compact: IDL set to 1.5]
+ expected: FAIL
+
+ [dir.compact: IDL set to false]
+ expected: FAIL
+
+ [dir.compact: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [dir.compact: IDL set to NaN]
+ expected: FAIL
+
+ [dir.compact: IDL set to Infinity]
+ expected: FAIL
+
+ [dir.compact: IDL set to -Infinity]
+ expected: FAIL
+
+ [dir.compact: IDL set to "\\0"]
+ expected: FAIL
+
+ [dir.compact: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [dir.compact: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [font.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [font.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [font.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [font.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [font.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [font.dir: setAttribute() to true]
+ expected: FAIL
+
+ [font.dir: setAttribute() to false]
+ expected: FAIL
+
+ [font.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [font.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [font.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [font.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [font.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [font.dir: setAttribute() to null]
+ expected: FAIL
+
+ [font.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [font.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [font.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [font.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [font.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [font.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [font.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [font.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [font.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [font.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [font.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [font.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [font.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [font.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [font.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [font.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [font.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [font.dir: IDL set to ""]
+ expected: FAIL
+
+ [font.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [font.dir: IDL set to undefined]
+ expected: FAIL
+
+ [font.dir: IDL set to 7]
+ expected: FAIL
+
+ [font.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [font.dir: IDL set to true]
+ expected: FAIL
+
+ [font.dir: IDL set to false]
+ expected: FAIL
+
+ [font.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [font.dir: IDL set to NaN]
+ expected: FAIL
+
+ [font.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [font.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [font.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [font.dir: IDL set to null]
+ expected: FAIL
+
+ [font.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [font.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [font.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [font.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [font.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [font.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [font.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [font.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [font.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [font.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [font.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [font.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [font.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [font.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [font.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [font.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [font.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [font.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [font.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [font.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [font.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [font.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [font.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [font.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [font.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [font.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [font.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [font.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [font.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [font.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [font.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [font.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [font.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [font.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [font.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [font.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [font.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [font.accessKey: IDL set to true]
+ expected: FAIL
+
+ [font.accessKey: IDL set to false]
+ expected: FAIL
+
+ [font.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [font.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [font.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [font.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [font.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [font.accessKey: IDL set to null]
+ expected: FAIL
+
+ [font.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [font.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [font.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [font.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [font.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [font.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [font.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [font.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [font.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [font.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [font.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [font.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [font.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [font.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [font.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [font.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [font.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [font.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [font.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [font.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [font.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [font.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [font.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [font.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [font.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/dom/reflection-sections.html.ini b/tests/wpt/metadata/html/dom/reflection-sections.html.ini
index d6c53b0bf06..a0b3bb3f3f1 100644
--- a/tests/wpt/metadata/html/dom/reflection-sections.html.ini
+++ b/tests/wpt/metadata/html/dom/reflection-sections.html.ini
@@ -14781,3 +14781,6348 @@
[data.itemValue (<data value>): IDL set to object "test-valueOf" followed by IDL get]
expected: FAIL
+ [body.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [body.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [body.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [body.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [body.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [body.dir: setAttribute() to true]
+ expected: FAIL
+
+ [body.dir: setAttribute() to false]
+ expected: FAIL
+
+ [body.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [body.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [body.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [body.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [body.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [body.dir: setAttribute() to null]
+ expected: FAIL
+
+ [body.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [body.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [body.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [body.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [body.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [body.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [body.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [body.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [body.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [body.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [body.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [body.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [body.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [body.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [body.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [body.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [body.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [body.dir: IDL set to ""]
+ expected: FAIL
+
+ [body.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [body.dir: IDL set to undefined]
+ expected: FAIL
+
+ [body.dir: IDL set to 7]
+ expected: FAIL
+
+ [body.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [body.dir: IDL set to true]
+ expected: FAIL
+
+ [body.dir: IDL set to false]
+ expected: FAIL
+
+ [body.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [body.dir: IDL set to NaN]
+ expected: FAIL
+
+ [body.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [body.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [body.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [body.dir: IDL set to null]
+ expected: FAIL
+
+ [body.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [body.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [body.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [body.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [body.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [body.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [body.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [body.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [body.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [body.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [body.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [body.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [body.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [body.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [body.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [body.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [body.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [body.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [body.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [body.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [body.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [body.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [body.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [body.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [body.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [body.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [body.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [body.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [body.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [body.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [body.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [body.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [body.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [body.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [body.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [body.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [body.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [body.accessKey: IDL set to true]
+ expected: FAIL
+
+ [body.accessKey: IDL set to false]
+ expected: FAIL
+
+ [body.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [body.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [body.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [body.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [body.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [body.accessKey: IDL set to null]
+ expected: FAIL
+
+ [body.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [body.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [body.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [body.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [body.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [body.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [body.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [body.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [body.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [body.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [body.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [body.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [body.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [body.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [body.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [body.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [body.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [body.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [body.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [body.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [body.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [body.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [body.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [body.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [body.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [body.link: setAttribute() to ""]
+ expected: FAIL
+
+ [body.link: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [body.link: setAttribute() to undefined]
+ expected: FAIL
+
+ [body.link: setAttribute() to 7]
+ expected: FAIL
+
+ [body.link: setAttribute() to 1.5]
+ expected: FAIL
+
+ [body.link: setAttribute() to true]
+ expected: FAIL
+
+ [body.link: setAttribute() to false]
+ expected: FAIL
+
+ [body.link: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [body.link: setAttribute() to NaN]
+ expected: FAIL
+
+ [body.link: setAttribute() to Infinity]
+ expected: FAIL
+
+ [body.link: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [body.link: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [body.link: setAttribute() to null]
+ expected: FAIL
+
+ [body.link: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [body.link: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [body.link: IDL set to ""]
+ expected: FAIL
+
+ [body.link: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [body.link: IDL set to undefined]
+ expected: FAIL
+
+ [body.link: IDL set to 7]
+ expected: FAIL
+
+ [body.link: IDL set to 1.5]
+ expected: FAIL
+
+ [body.link: IDL set to true]
+ expected: FAIL
+
+ [body.link: IDL set to false]
+ expected: FAIL
+
+ [body.link: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [body.link: IDL set to NaN]
+ expected: FAIL
+
+ [body.link: IDL set to Infinity]
+ expected: FAIL
+
+ [body.link: IDL set to -Infinity]
+ expected: FAIL
+
+ [body.link: IDL set to "\\0"]
+ expected: FAIL
+
+ [body.link: IDL set to null]
+ expected: FAIL
+
+ [body.link: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [body.link: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [body.vLink: setAttribute() to ""]
+ expected: FAIL
+
+ [body.vLink: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [body.vLink: setAttribute() to undefined]
+ expected: FAIL
+
+ [body.vLink: setAttribute() to 7]
+ expected: FAIL
+
+ [body.vLink: setAttribute() to 1.5]
+ expected: FAIL
+
+ [body.vLink: setAttribute() to true]
+ expected: FAIL
+
+ [body.vLink: setAttribute() to false]
+ expected: FAIL
+
+ [body.vLink: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [body.vLink: setAttribute() to NaN]
+ expected: FAIL
+
+ [body.vLink: setAttribute() to Infinity]
+ expected: FAIL
+
+ [body.vLink: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [body.vLink: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [body.vLink: setAttribute() to null]
+ expected: FAIL
+
+ [body.vLink: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [body.vLink: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [body.vLink: IDL set to ""]
+ expected: FAIL
+
+ [body.vLink: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [body.vLink: IDL set to undefined]
+ expected: FAIL
+
+ [body.vLink: IDL set to 7]
+ expected: FAIL
+
+ [body.vLink: IDL set to 1.5]
+ expected: FAIL
+
+ [body.vLink: IDL set to true]
+ expected: FAIL
+
+ [body.vLink: IDL set to false]
+ expected: FAIL
+
+ [body.vLink: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [body.vLink: IDL set to NaN]
+ expected: FAIL
+
+ [body.vLink: IDL set to Infinity]
+ expected: FAIL
+
+ [body.vLink: IDL set to -Infinity]
+ expected: FAIL
+
+ [body.vLink: IDL set to "\\0"]
+ expected: FAIL
+
+ [body.vLink: IDL set to null]
+ expected: FAIL
+
+ [body.vLink: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [body.vLink: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [body.aLink: setAttribute() to ""]
+ expected: FAIL
+
+ [body.aLink: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [body.aLink: setAttribute() to undefined]
+ expected: FAIL
+
+ [body.aLink: setAttribute() to 7]
+ expected: FAIL
+
+ [body.aLink: setAttribute() to 1.5]
+ expected: FAIL
+
+ [body.aLink: setAttribute() to true]
+ expected: FAIL
+
+ [body.aLink: setAttribute() to false]
+ expected: FAIL
+
+ [body.aLink: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [body.aLink: setAttribute() to NaN]
+ expected: FAIL
+
+ [body.aLink: setAttribute() to Infinity]
+ expected: FAIL
+
+ [body.aLink: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [body.aLink: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [body.aLink: setAttribute() to null]
+ expected: FAIL
+
+ [body.aLink: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [body.aLink: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [body.aLink: IDL set to ""]
+ expected: FAIL
+
+ [body.aLink: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [body.aLink: IDL set to undefined]
+ expected: FAIL
+
+ [body.aLink: IDL set to 7]
+ expected: FAIL
+
+ [body.aLink: IDL set to 1.5]
+ expected: FAIL
+
+ [body.aLink: IDL set to true]
+ expected: FAIL
+
+ [body.aLink: IDL set to false]
+ expected: FAIL
+
+ [body.aLink: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [body.aLink: IDL set to NaN]
+ expected: FAIL
+
+ [body.aLink: IDL set to Infinity]
+ expected: FAIL
+
+ [body.aLink: IDL set to -Infinity]
+ expected: FAIL
+
+ [body.aLink: IDL set to "\\0"]
+ expected: FAIL
+
+ [body.aLink: IDL set to null]
+ expected: FAIL
+
+ [body.aLink: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [body.aLink: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [article.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [article.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [article.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [article.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [article.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [article.dir: setAttribute() to true]
+ expected: FAIL
+
+ [article.dir: setAttribute() to false]
+ expected: FAIL
+
+ [article.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [article.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [article.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [article.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [article.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [article.dir: setAttribute() to null]
+ expected: FAIL
+
+ [article.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [article.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [article.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [article.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [article.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [article.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [article.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [article.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [article.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [article.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [article.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [article.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [article.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [article.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [article.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [article.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [article.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [article.dir: IDL set to ""]
+ expected: FAIL
+
+ [article.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [article.dir: IDL set to undefined]
+ expected: FAIL
+
+ [article.dir: IDL set to 7]
+ expected: FAIL
+
+ [article.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [article.dir: IDL set to true]
+ expected: FAIL
+
+ [article.dir: IDL set to false]
+ expected: FAIL
+
+ [article.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [article.dir: IDL set to NaN]
+ expected: FAIL
+
+ [article.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [article.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [article.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [article.dir: IDL set to null]
+ expected: FAIL
+
+ [article.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [article.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [article.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [article.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [article.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [article.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [article.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [article.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [article.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [article.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [article.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [article.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [article.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [article.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [article.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [article.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [article.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [article.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [article.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [article.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [article.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [article.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [article.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [article.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [article.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [article.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [article.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [article.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [article.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [article.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [article.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [article.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [article.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [article.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [article.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [article.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [article.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [article.accessKey: IDL set to true]
+ expected: FAIL
+
+ [article.accessKey: IDL set to false]
+ expected: FAIL
+
+ [article.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [article.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [article.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [article.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [article.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [article.accessKey: IDL set to null]
+ expected: FAIL
+
+ [article.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [article.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [article.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [article.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [article.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [article.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [article.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [article.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [article.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [article.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [article.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [article.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [article.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [article.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [article.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [article.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [article.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [article.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [article.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [article.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [article.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [article.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [article.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [article.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [article.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [section.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [section.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [section.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [section.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [section.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [section.dir: setAttribute() to true]
+ expected: FAIL
+
+ [section.dir: setAttribute() to false]
+ expected: FAIL
+
+ [section.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [section.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [section.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [section.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [section.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [section.dir: setAttribute() to null]
+ expected: FAIL
+
+ [section.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [section.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [section.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [section.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [section.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [section.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [section.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [section.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [section.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [section.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [section.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [section.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [section.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [section.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [section.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [section.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [section.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [section.dir: IDL set to ""]
+ expected: FAIL
+
+ [section.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [section.dir: IDL set to undefined]
+ expected: FAIL
+
+ [section.dir: IDL set to 7]
+ expected: FAIL
+
+ [section.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [section.dir: IDL set to true]
+ expected: FAIL
+
+ [section.dir: IDL set to false]
+ expected: FAIL
+
+ [section.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [section.dir: IDL set to NaN]
+ expected: FAIL
+
+ [section.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [section.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [section.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [section.dir: IDL set to null]
+ expected: FAIL
+
+ [section.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [section.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [section.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [section.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [section.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [section.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [section.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [section.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [section.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [section.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [section.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [section.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [section.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [section.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [section.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [section.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [section.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [section.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [section.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [section.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [section.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [section.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [section.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [section.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [section.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [section.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [section.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [section.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [section.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [section.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [section.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [section.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [section.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [section.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [section.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [section.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [section.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [section.accessKey: IDL set to true]
+ expected: FAIL
+
+ [section.accessKey: IDL set to false]
+ expected: FAIL
+
+ [section.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [section.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [section.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [section.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [section.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [section.accessKey: IDL set to null]
+ expected: FAIL
+
+ [section.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [section.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [section.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [section.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [section.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [section.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [section.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [section.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [section.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [section.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [section.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [section.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [section.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [section.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [section.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [section.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [section.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [section.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [section.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [section.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [section.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [section.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [section.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [section.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [section.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to true]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to false]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to null]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [nav.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [nav.dir: IDL set to ""]
+ expected: FAIL
+
+ [nav.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [nav.dir: IDL set to undefined]
+ expected: FAIL
+
+ [nav.dir: IDL set to 7]
+ expected: FAIL
+
+ [nav.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [nav.dir: IDL set to true]
+ expected: FAIL
+
+ [nav.dir: IDL set to false]
+ expected: FAIL
+
+ [nav.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [nav.dir: IDL set to NaN]
+ expected: FAIL
+
+ [nav.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [nav.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [nav.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [nav.dir: IDL set to null]
+ expected: FAIL
+
+ [nav.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [nav.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [nav.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [nav.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [nav.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [nav.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [nav.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [nav.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [nav.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [nav.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [nav.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [nav.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [nav.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [nav.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [nav.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [nav.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [nav.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [nav.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [nav.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [nav.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [nav.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [nav.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [nav.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [nav.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [nav.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [nav.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [nav.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [nav.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [nav.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [nav.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [nav.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [nav.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [nav.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [nav.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [nav.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [nav.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [nav.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [nav.accessKey: IDL set to true]
+ expected: FAIL
+
+ [nav.accessKey: IDL set to false]
+ expected: FAIL
+
+ [nav.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [nav.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [nav.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [nav.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [nav.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [nav.accessKey: IDL set to null]
+ expected: FAIL
+
+ [nav.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [nav.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [nav.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [nav.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [nav.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [nav.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [nav.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [nav.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [nav.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [nav.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [nav.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [nav.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [nav.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [nav.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [nav.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [nav.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [nav.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [nav.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [nav.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [nav.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [nav.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [nav.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [nav.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [nav.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [nav.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to true]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to false]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to null]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [aside.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [aside.dir: IDL set to ""]
+ expected: FAIL
+
+ [aside.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [aside.dir: IDL set to undefined]
+ expected: FAIL
+
+ [aside.dir: IDL set to 7]
+ expected: FAIL
+
+ [aside.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [aside.dir: IDL set to true]
+ expected: FAIL
+
+ [aside.dir: IDL set to false]
+ expected: FAIL
+
+ [aside.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [aside.dir: IDL set to NaN]
+ expected: FAIL
+
+ [aside.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [aside.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [aside.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [aside.dir: IDL set to null]
+ expected: FAIL
+
+ [aside.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [aside.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [aside.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [aside.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [aside.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [aside.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [aside.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [aside.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [aside.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [aside.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [aside.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [aside.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [aside.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [aside.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [aside.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [aside.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [aside.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [aside.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [aside.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [aside.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [aside.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [aside.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [aside.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [aside.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [aside.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [aside.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [aside.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [aside.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [aside.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [aside.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [aside.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [aside.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [aside.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [aside.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [aside.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [aside.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [aside.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [aside.accessKey: IDL set to true]
+ expected: FAIL
+
+ [aside.accessKey: IDL set to false]
+ expected: FAIL
+
+ [aside.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [aside.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [aside.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [aside.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [aside.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [aside.accessKey: IDL set to null]
+ expected: FAIL
+
+ [aside.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [aside.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [aside.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [aside.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [aside.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [aside.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [aside.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [aside.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [aside.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [aside.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [aside.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [aside.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [aside.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [aside.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [aside.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [aside.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [aside.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [aside.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [aside.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [aside.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [aside.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [aside.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [aside.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [aside.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [aside.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to true]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to false]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to null]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [h1.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [h1.dir: IDL set to ""]
+ expected: FAIL
+
+ [h1.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h1.dir: IDL set to undefined]
+ expected: FAIL
+
+ [h1.dir: IDL set to 7]
+ expected: FAIL
+
+ [h1.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [h1.dir: IDL set to true]
+ expected: FAIL
+
+ [h1.dir: IDL set to false]
+ expected: FAIL
+
+ [h1.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [h1.dir: IDL set to NaN]
+ expected: FAIL
+
+ [h1.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [h1.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [h1.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [h1.dir: IDL set to null]
+ expected: FAIL
+
+ [h1.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [h1.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [h1.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [h1.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [h1.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [h1.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [h1.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [h1.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [h1.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [h1.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [h1.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [h1.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [h1.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [h1.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [h1.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [h1.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [h1.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [h1.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [h1.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h1.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [h1.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [h1.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h1.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [h1.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [h1.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [h1.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [h1.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [h1.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [h1.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [h1.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [h1.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [h1.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [h1.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [h1.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h1.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [h1.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [h1.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [h1.accessKey: IDL set to true]
+ expected: FAIL
+
+ [h1.accessKey: IDL set to false]
+ expected: FAIL
+
+ [h1.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [h1.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [h1.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [h1.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [h1.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [h1.accessKey: IDL set to null]
+ expected: FAIL
+
+ [h1.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [h1.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [h1.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [h1.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [h1.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [h1.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [h1.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [h1.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [h1.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [h1.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [h1.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [h1.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [h1.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [h1.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [h1.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [h1.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [h1.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [h1.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h1.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [h1.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [h1.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [h1.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [h1.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [h1.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [h1.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [h1.align: setAttribute() to ""]
+ expected: FAIL
+
+ [h1.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h1.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [h1.align: setAttribute() to 7]
+ expected: FAIL
+
+ [h1.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h1.align: setAttribute() to true]
+ expected: FAIL
+
+ [h1.align: setAttribute() to false]
+ expected: FAIL
+
+ [h1.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [h1.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [h1.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [h1.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [h1.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [h1.align: setAttribute() to null]
+ expected: FAIL
+
+ [h1.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [h1.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [h1.align: IDL set to ""]
+ expected: FAIL
+
+ [h1.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h1.align: IDL set to undefined]
+ expected: FAIL
+
+ [h1.align: IDL set to 7]
+ expected: FAIL
+
+ [h1.align: IDL set to 1.5]
+ expected: FAIL
+
+ [h1.align: IDL set to true]
+ expected: FAIL
+
+ [h1.align: IDL set to false]
+ expected: FAIL
+
+ [h1.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [h1.align: IDL set to NaN]
+ expected: FAIL
+
+ [h1.align: IDL set to Infinity]
+ expected: FAIL
+
+ [h1.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [h1.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [h1.align: IDL set to null]
+ expected: FAIL
+
+ [h1.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [h1.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to true]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to false]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to null]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [h2.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [h2.dir: IDL set to ""]
+ expected: FAIL
+
+ [h2.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h2.dir: IDL set to undefined]
+ expected: FAIL
+
+ [h2.dir: IDL set to 7]
+ expected: FAIL
+
+ [h2.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [h2.dir: IDL set to true]
+ expected: FAIL
+
+ [h2.dir: IDL set to false]
+ expected: FAIL
+
+ [h2.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [h2.dir: IDL set to NaN]
+ expected: FAIL
+
+ [h2.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [h2.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [h2.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [h2.dir: IDL set to null]
+ expected: FAIL
+
+ [h2.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [h2.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [h2.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [h2.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [h2.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [h2.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [h2.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [h2.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [h2.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [h2.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [h2.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [h2.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [h2.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [h2.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [h2.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [h2.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [h2.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [h2.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [h2.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h2.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [h2.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [h2.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h2.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [h2.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [h2.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [h2.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [h2.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [h2.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [h2.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [h2.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [h2.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [h2.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [h2.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [h2.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h2.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [h2.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [h2.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [h2.accessKey: IDL set to true]
+ expected: FAIL
+
+ [h2.accessKey: IDL set to false]
+ expected: FAIL
+
+ [h2.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [h2.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [h2.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [h2.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [h2.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [h2.accessKey: IDL set to null]
+ expected: FAIL
+
+ [h2.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [h2.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [h2.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [h2.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [h2.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [h2.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [h2.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [h2.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [h2.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [h2.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [h2.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [h2.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [h2.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [h2.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [h2.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [h2.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [h2.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [h2.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h2.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [h2.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [h2.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [h2.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [h2.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [h2.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [h2.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [h2.align: setAttribute() to ""]
+ expected: FAIL
+
+ [h2.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h2.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [h2.align: setAttribute() to 7]
+ expected: FAIL
+
+ [h2.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h2.align: setAttribute() to true]
+ expected: FAIL
+
+ [h2.align: setAttribute() to false]
+ expected: FAIL
+
+ [h2.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [h2.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [h2.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [h2.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [h2.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [h2.align: setAttribute() to null]
+ expected: FAIL
+
+ [h2.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [h2.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [h2.align: IDL set to ""]
+ expected: FAIL
+
+ [h2.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h2.align: IDL set to undefined]
+ expected: FAIL
+
+ [h2.align: IDL set to 7]
+ expected: FAIL
+
+ [h2.align: IDL set to 1.5]
+ expected: FAIL
+
+ [h2.align: IDL set to true]
+ expected: FAIL
+
+ [h2.align: IDL set to false]
+ expected: FAIL
+
+ [h2.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [h2.align: IDL set to NaN]
+ expected: FAIL
+
+ [h2.align: IDL set to Infinity]
+ expected: FAIL
+
+ [h2.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [h2.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [h2.align: IDL set to null]
+ expected: FAIL
+
+ [h2.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [h2.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to true]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to false]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to null]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [h3.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [h3.dir: IDL set to ""]
+ expected: FAIL
+
+ [h3.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h3.dir: IDL set to undefined]
+ expected: FAIL
+
+ [h3.dir: IDL set to 7]
+ expected: FAIL
+
+ [h3.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [h3.dir: IDL set to true]
+ expected: FAIL
+
+ [h3.dir: IDL set to false]
+ expected: FAIL
+
+ [h3.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [h3.dir: IDL set to NaN]
+ expected: FAIL
+
+ [h3.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [h3.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [h3.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [h3.dir: IDL set to null]
+ expected: FAIL
+
+ [h3.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [h3.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [h3.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [h3.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [h3.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [h3.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [h3.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [h3.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [h3.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [h3.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [h3.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [h3.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [h3.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [h3.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [h3.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [h3.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [h3.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [h3.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [h3.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h3.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [h3.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [h3.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h3.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [h3.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [h3.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [h3.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [h3.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [h3.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [h3.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [h3.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [h3.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [h3.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [h3.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [h3.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h3.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [h3.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [h3.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [h3.accessKey: IDL set to true]
+ expected: FAIL
+
+ [h3.accessKey: IDL set to false]
+ expected: FAIL
+
+ [h3.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [h3.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [h3.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [h3.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [h3.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [h3.accessKey: IDL set to null]
+ expected: FAIL
+
+ [h3.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [h3.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [h3.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [h3.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [h3.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [h3.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [h3.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [h3.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [h3.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [h3.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [h3.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [h3.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [h3.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [h3.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [h3.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [h3.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [h3.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [h3.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h3.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [h3.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [h3.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [h3.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [h3.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [h3.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [h3.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [h3.align: setAttribute() to ""]
+ expected: FAIL
+
+ [h3.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h3.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [h3.align: setAttribute() to 7]
+ expected: FAIL
+
+ [h3.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h3.align: setAttribute() to true]
+ expected: FAIL
+
+ [h3.align: setAttribute() to false]
+ expected: FAIL
+
+ [h3.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [h3.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [h3.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [h3.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [h3.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [h3.align: setAttribute() to null]
+ expected: FAIL
+
+ [h3.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [h3.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [h3.align: IDL set to ""]
+ expected: FAIL
+
+ [h3.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h3.align: IDL set to undefined]
+ expected: FAIL
+
+ [h3.align: IDL set to 7]
+ expected: FAIL
+
+ [h3.align: IDL set to 1.5]
+ expected: FAIL
+
+ [h3.align: IDL set to true]
+ expected: FAIL
+
+ [h3.align: IDL set to false]
+ expected: FAIL
+
+ [h3.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [h3.align: IDL set to NaN]
+ expected: FAIL
+
+ [h3.align: IDL set to Infinity]
+ expected: FAIL
+
+ [h3.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [h3.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [h3.align: IDL set to null]
+ expected: FAIL
+
+ [h3.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [h3.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to true]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to false]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to null]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [h4.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [h4.dir: IDL set to ""]
+ expected: FAIL
+
+ [h4.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h4.dir: IDL set to undefined]
+ expected: FAIL
+
+ [h4.dir: IDL set to 7]
+ expected: FAIL
+
+ [h4.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [h4.dir: IDL set to true]
+ expected: FAIL
+
+ [h4.dir: IDL set to false]
+ expected: FAIL
+
+ [h4.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [h4.dir: IDL set to NaN]
+ expected: FAIL
+
+ [h4.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [h4.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [h4.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [h4.dir: IDL set to null]
+ expected: FAIL
+
+ [h4.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [h4.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [h4.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [h4.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [h4.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [h4.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [h4.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [h4.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [h4.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [h4.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [h4.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [h4.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [h4.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [h4.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [h4.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [h4.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [h4.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [h4.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [h4.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h4.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [h4.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [h4.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h4.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [h4.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [h4.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [h4.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [h4.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [h4.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [h4.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [h4.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [h4.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [h4.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [h4.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [h4.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h4.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [h4.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [h4.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [h4.accessKey: IDL set to true]
+ expected: FAIL
+
+ [h4.accessKey: IDL set to false]
+ expected: FAIL
+
+ [h4.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [h4.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [h4.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [h4.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [h4.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [h4.accessKey: IDL set to null]
+ expected: FAIL
+
+ [h4.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [h4.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [h4.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [h4.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [h4.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [h4.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [h4.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [h4.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [h4.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [h4.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [h4.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [h4.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [h4.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [h4.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [h4.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [h4.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [h4.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [h4.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h4.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [h4.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [h4.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [h4.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [h4.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [h4.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [h4.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [h4.align: setAttribute() to ""]
+ expected: FAIL
+
+ [h4.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h4.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [h4.align: setAttribute() to 7]
+ expected: FAIL
+
+ [h4.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h4.align: setAttribute() to true]
+ expected: FAIL
+
+ [h4.align: setAttribute() to false]
+ expected: FAIL
+
+ [h4.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [h4.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [h4.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [h4.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [h4.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [h4.align: setAttribute() to null]
+ expected: FAIL
+
+ [h4.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [h4.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [h4.align: IDL set to ""]
+ expected: FAIL
+
+ [h4.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h4.align: IDL set to undefined]
+ expected: FAIL
+
+ [h4.align: IDL set to 7]
+ expected: FAIL
+
+ [h4.align: IDL set to 1.5]
+ expected: FAIL
+
+ [h4.align: IDL set to true]
+ expected: FAIL
+
+ [h4.align: IDL set to false]
+ expected: FAIL
+
+ [h4.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [h4.align: IDL set to NaN]
+ expected: FAIL
+
+ [h4.align: IDL set to Infinity]
+ expected: FAIL
+
+ [h4.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [h4.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [h4.align: IDL set to null]
+ expected: FAIL
+
+ [h4.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [h4.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to true]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to false]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to null]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [h5.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [h5.dir: IDL set to ""]
+ expected: FAIL
+
+ [h5.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h5.dir: IDL set to undefined]
+ expected: FAIL
+
+ [h5.dir: IDL set to 7]
+ expected: FAIL
+
+ [h5.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [h5.dir: IDL set to true]
+ expected: FAIL
+
+ [h5.dir: IDL set to false]
+ expected: FAIL
+
+ [h5.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [h5.dir: IDL set to NaN]
+ expected: FAIL
+
+ [h5.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [h5.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [h5.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [h5.dir: IDL set to null]
+ expected: FAIL
+
+ [h5.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [h5.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [h5.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [h5.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [h5.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [h5.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [h5.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [h5.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [h5.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [h5.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [h5.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [h5.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [h5.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [h5.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [h5.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [h5.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [h5.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [h5.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [h5.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h5.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [h5.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [h5.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h5.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [h5.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [h5.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [h5.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [h5.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [h5.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [h5.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [h5.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [h5.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [h5.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [h5.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [h5.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h5.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [h5.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [h5.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [h5.accessKey: IDL set to true]
+ expected: FAIL
+
+ [h5.accessKey: IDL set to false]
+ expected: FAIL
+
+ [h5.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [h5.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [h5.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [h5.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [h5.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [h5.accessKey: IDL set to null]
+ expected: FAIL
+
+ [h5.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [h5.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [h5.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [h5.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [h5.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [h5.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [h5.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [h5.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [h5.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [h5.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [h5.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [h5.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [h5.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [h5.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [h5.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [h5.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [h5.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [h5.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h5.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [h5.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [h5.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [h5.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [h5.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [h5.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [h5.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [h5.align: setAttribute() to ""]
+ expected: FAIL
+
+ [h5.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h5.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [h5.align: setAttribute() to 7]
+ expected: FAIL
+
+ [h5.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h5.align: setAttribute() to true]
+ expected: FAIL
+
+ [h5.align: setAttribute() to false]
+ expected: FAIL
+
+ [h5.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [h5.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [h5.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [h5.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [h5.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [h5.align: setAttribute() to null]
+ expected: FAIL
+
+ [h5.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [h5.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [h5.align: IDL set to ""]
+ expected: FAIL
+
+ [h5.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h5.align: IDL set to undefined]
+ expected: FAIL
+
+ [h5.align: IDL set to 7]
+ expected: FAIL
+
+ [h5.align: IDL set to 1.5]
+ expected: FAIL
+
+ [h5.align: IDL set to true]
+ expected: FAIL
+
+ [h5.align: IDL set to false]
+ expected: FAIL
+
+ [h5.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [h5.align: IDL set to NaN]
+ expected: FAIL
+
+ [h5.align: IDL set to Infinity]
+ expected: FAIL
+
+ [h5.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [h5.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [h5.align: IDL set to null]
+ expected: FAIL
+
+ [h5.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [h5.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to true]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to false]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to null]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [h6.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [h6.dir: IDL set to ""]
+ expected: FAIL
+
+ [h6.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h6.dir: IDL set to undefined]
+ expected: FAIL
+
+ [h6.dir: IDL set to 7]
+ expected: FAIL
+
+ [h6.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [h6.dir: IDL set to true]
+ expected: FAIL
+
+ [h6.dir: IDL set to false]
+ expected: FAIL
+
+ [h6.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [h6.dir: IDL set to NaN]
+ expected: FAIL
+
+ [h6.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [h6.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [h6.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [h6.dir: IDL set to null]
+ expected: FAIL
+
+ [h6.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [h6.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [h6.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [h6.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [h6.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [h6.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [h6.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [h6.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [h6.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [h6.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [h6.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [h6.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [h6.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [h6.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [h6.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [h6.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [h6.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [h6.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [h6.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h6.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [h6.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [h6.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h6.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [h6.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [h6.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [h6.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [h6.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [h6.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [h6.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [h6.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [h6.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [h6.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [h6.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [h6.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h6.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [h6.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [h6.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [h6.accessKey: IDL set to true]
+ expected: FAIL
+
+ [h6.accessKey: IDL set to false]
+ expected: FAIL
+
+ [h6.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [h6.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [h6.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [h6.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [h6.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [h6.accessKey: IDL set to null]
+ expected: FAIL
+
+ [h6.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [h6.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [h6.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [h6.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [h6.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [h6.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [h6.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [h6.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [h6.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [h6.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [h6.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [h6.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [h6.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [h6.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [h6.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [h6.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [h6.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [h6.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h6.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [h6.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [h6.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [h6.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [h6.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [h6.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [h6.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [h6.align: setAttribute() to ""]
+ expected: FAIL
+
+ [h6.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h6.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [h6.align: setAttribute() to 7]
+ expected: FAIL
+
+ [h6.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [h6.align: setAttribute() to true]
+ expected: FAIL
+
+ [h6.align: setAttribute() to false]
+ expected: FAIL
+
+ [h6.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [h6.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [h6.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [h6.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [h6.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [h6.align: setAttribute() to null]
+ expected: FAIL
+
+ [h6.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [h6.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [h6.align: IDL set to ""]
+ expected: FAIL
+
+ [h6.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [h6.align: IDL set to undefined]
+ expected: FAIL
+
+ [h6.align: IDL set to 7]
+ expected: FAIL
+
+ [h6.align: IDL set to 1.5]
+ expected: FAIL
+
+ [h6.align: IDL set to true]
+ expected: FAIL
+
+ [h6.align: IDL set to false]
+ expected: FAIL
+
+ [h6.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [h6.align: IDL set to NaN]
+ expected: FAIL
+
+ [h6.align: IDL set to Infinity]
+ expected: FAIL
+
+ [h6.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [h6.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [h6.align: IDL set to null]
+ expected: FAIL
+
+ [h6.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [h6.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to true]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to false]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to null]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [hgroup.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to ""]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to undefined]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to 7]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to true]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to false]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to NaN]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to null]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [hgroup.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [hgroup.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [hgroup.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [hgroup.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [hgroup.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [hgroup.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [hgroup.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [hgroup.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [hgroup.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [hgroup.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [hgroup.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [hgroup.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [hgroup.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [hgroup.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [hgroup.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [hgroup.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [hgroup.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [hgroup.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [hgroup.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [hgroup.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [hgroup.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [hgroup.accessKey: IDL set to true]
+ expected: FAIL
+
+ [hgroup.accessKey: IDL set to false]
+ expected: FAIL
+
+ [hgroup.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [hgroup.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [hgroup.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [hgroup.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [hgroup.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [hgroup.accessKey: IDL set to null]
+ expected: FAIL
+
+ [hgroup.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [hgroup.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [hgroup.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [hgroup.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [hgroup.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [hgroup.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [hgroup.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [hgroup.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [hgroup.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [hgroup.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [hgroup.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [hgroup.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [hgroup.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [hgroup.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [hgroup.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [hgroup.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [hgroup.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [hgroup.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [hgroup.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [hgroup.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [hgroup.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [hgroup.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [hgroup.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [hgroup.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [hgroup.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [header.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [header.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [header.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [header.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [header.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [header.dir: setAttribute() to true]
+ expected: FAIL
+
+ [header.dir: setAttribute() to false]
+ expected: FAIL
+
+ [header.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [header.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [header.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [header.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [header.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [header.dir: setAttribute() to null]
+ expected: FAIL
+
+ [header.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [header.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [header.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [header.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [header.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [header.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [header.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [header.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [header.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [header.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [header.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [header.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [header.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [header.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [header.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [header.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [header.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [header.dir: IDL set to ""]
+ expected: FAIL
+
+ [header.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [header.dir: IDL set to undefined]
+ expected: FAIL
+
+ [header.dir: IDL set to 7]
+ expected: FAIL
+
+ [header.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [header.dir: IDL set to true]
+ expected: FAIL
+
+ [header.dir: IDL set to false]
+ expected: FAIL
+
+ [header.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [header.dir: IDL set to NaN]
+ expected: FAIL
+
+ [header.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [header.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [header.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [header.dir: IDL set to null]
+ expected: FAIL
+
+ [header.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [header.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [header.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [header.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [header.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [header.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [header.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [header.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [header.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [header.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [header.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [header.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [header.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [header.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [header.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [header.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [header.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [header.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [header.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [header.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [header.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [header.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [header.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [header.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [header.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [header.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [header.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [header.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [header.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [header.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [header.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [header.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [header.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [header.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [header.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [header.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [header.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [header.accessKey: IDL set to true]
+ expected: FAIL
+
+ [header.accessKey: IDL set to false]
+ expected: FAIL
+
+ [header.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [header.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [header.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [header.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [header.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [header.accessKey: IDL set to null]
+ expected: FAIL
+
+ [header.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [header.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [header.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [header.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [header.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [header.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [header.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [header.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [header.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [header.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [header.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [header.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [header.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [header.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [header.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [header.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [header.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [header.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [header.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [header.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [header.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [header.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [header.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [header.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [header.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to true]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to false]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to null]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [footer.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [footer.dir: IDL set to ""]
+ expected: FAIL
+
+ [footer.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [footer.dir: IDL set to undefined]
+ expected: FAIL
+
+ [footer.dir: IDL set to 7]
+ expected: FAIL
+
+ [footer.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [footer.dir: IDL set to true]
+ expected: FAIL
+
+ [footer.dir: IDL set to false]
+ expected: FAIL
+
+ [footer.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [footer.dir: IDL set to NaN]
+ expected: FAIL
+
+ [footer.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [footer.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [footer.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [footer.dir: IDL set to null]
+ expected: FAIL
+
+ [footer.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [footer.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [footer.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [footer.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [footer.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [footer.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [footer.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [footer.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [footer.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [footer.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [footer.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [footer.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [footer.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [footer.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [footer.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [footer.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [footer.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [footer.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [footer.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [footer.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [footer.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [footer.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [footer.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [footer.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [footer.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [footer.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [footer.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [footer.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [footer.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [footer.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [footer.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [footer.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [footer.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [footer.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [footer.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [footer.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [footer.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [footer.accessKey: IDL set to true]
+ expected: FAIL
+
+ [footer.accessKey: IDL set to false]
+ expected: FAIL
+
+ [footer.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [footer.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [footer.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [footer.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [footer.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [footer.accessKey: IDL set to null]
+ expected: FAIL
+
+ [footer.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [footer.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [footer.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [footer.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [footer.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [footer.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [footer.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [footer.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [footer.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [footer.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [footer.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [footer.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [footer.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [footer.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [footer.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [footer.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [footer.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [footer.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [footer.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [footer.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [footer.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [footer.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [footer.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [footer.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [footer.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [address.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [address.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [address.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [address.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [address.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [address.dir: setAttribute() to true]
+ expected: FAIL
+
+ [address.dir: setAttribute() to false]
+ expected: FAIL
+
+ [address.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [address.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [address.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [address.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [address.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [address.dir: setAttribute() to null]
+ expected: FAIL
+
+ [address.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [address.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [address.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [address.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [address.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [address.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [address.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [address.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [address.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [address.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [address.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [address.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [address.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [address.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [address.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [address.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [address.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [address.dir: IDL set to ""]
+ expected: FAIL
+
+ [address.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [address.dir: IDL set to undefined]
+ expected: FAIL
+
+ [address.dir: IDL set to 7]
+ expected: FAIL
+
+ [address.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [address.dir: IDL set to true]
+ expected: FAIL
+
+ [address.dir: IDL set to false]
+ expected: FAIL
+
+ [address.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [address.dir: IDL set to NaN]
+ expected: FAIL
+
+ [address.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [address.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [address.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [address.dir: IDL set to null]
+ expected: FAIL
+
+ [address.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [address.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [address.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [address.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [address.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [address.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [address.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [address.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [address.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [address.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [address.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [address.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [address.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [address.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [address.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [address.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [address.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [address.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [address.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [address.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [address.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [address.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [address.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [address.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [address.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [address.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [address.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [address.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [address.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [address.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [address.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [address.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [address.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [address.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [address.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [address.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [address.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [address.accessKey: IDL set to true]
+ expected: FAIL
+
+ [address.accessKey: IDL set to false]
+ expected: FAIL
+
+ [address.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [address.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [address.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [address.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [address.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [address.accessKey: IDL set to null]
+ expected: FAIL
+
+ [address.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [address.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [address.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [address.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [address.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [address.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [address.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [address.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [address.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [address.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [address.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [address.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [address.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [address.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [address.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [address.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [address.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [address.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [address.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [address.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [address.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [address.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [address.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [address.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [address.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to ""]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to undefined]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to 7]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to true]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to false]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to NaN]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to null]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to "ltr"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to "xltr"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to "tr"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to "LTR"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to "rtl"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to "tl"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to "RTL"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to "auto"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to "xauto"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to "uto"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to ""]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to undefined]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to 7]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to 1.5]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to true]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to false]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to NaN]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to Infinity]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to -Infinity]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to "\\0"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to null]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to "ltr"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to "xltr"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to "tr"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to "LTR"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to "rtl"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to "xrtl"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to "tl"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to "RTL"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to "auto"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to "xauto"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to "auto\\0"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to "uto"]
+ expected: FAIL
+
+ [#document.dir (<html dir>): IDL set to "AUTO"]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): setAttribute() to ""]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): setAttribute() to undefined]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): setAttribute() to 7]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): setAttribute() to true]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): setAttribute() to false]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): setAttribute() to NaN]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): setAttribute() to null]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): IDL set to ""]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): IDL set to undefined]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): IDL set to 7]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): IDL set to 1.5]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): IDL set to true]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): IDL set to false]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): IDL set to NaN]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): IDL set to Infinity]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): IDL set to -Infinity]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): IDL set to "\\0"]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): IDL set to null]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [#document.linkColor (<body link>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): setAttribute() to ""]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): setAttribute() to undefined]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): setAttribute() to 7]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): setAttribute() to true]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): setAttribute() to false]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): setAttribute() to NaN]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): setAttribute() to null]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): IDL set to ""]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): IDL set to undefined]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): IDL set to 7]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): IDL set to 1.5]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): IDL set to true]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): IDL set to false]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): IDL set to NaN]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): IDL set to Infinity]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): IDL set to -Infinity]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): IDL set to "\\0"]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): IDL set to null]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [#document.vlinkColor (<body vlink>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): setAttribute() to ""]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): setAttribute() to undefined]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): setAttribute() to 7]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): setAttribute() to true]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): setAttribute() to false]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): setAttribute() to NaN]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): setAttribute() to null]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): IDL set to ""]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): IDL set to undefined]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): IDL set to 7]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): IDL set to 1.5]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): IDL set to true]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): IDL set to false]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): IDL set to NaN]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): IDL set to Infinity]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): IDL set to -Infinity]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): IDL set to "\\0"]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): IDL set to null]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [#document.alinkColor (<body alink>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/dom/reflection-tabular.html.ini b/tests/wpt/metadata/html/dom/reflection-tabular.html.ini
index c7066086538..abb903f2da3 100644
--- a/tests/wpt/metadata/html/dom/reflection-tabular.html.ini
+++ b/tests/wpt/metadata/html/dom/reflection-tabular.html.ini
@@ -17343,3 +17343,9015 @@
[col.span: IDL set to 0 followed by IDL get]
expected: FAIL
+ [table.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [table.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [table.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [table.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [table.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [table.dir: setAttribute() to true]
+ expected: FAIL
+
+ [table.dir: setAttribute() to false]
+ expected: FAIL
+
+ [table.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [table.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [table.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [table.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [table.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [table.dir: setAttribute() to null]
+ expected: FAIL
+
+ [table.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [table.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [table.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [table.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [table.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [table.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [table.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [table.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [table.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [table.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [table.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [table.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [table.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [table.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [table.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [table.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [table.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [table.dir: IDL set to ""]
+ expected: FAIL
+
+ [table.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [table.dir: IDL set to undefined]
+ expected: FAIL
+
+ [table.dir: IDL set to 7]
+ expected: FAIL
+
+ [table.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [table.dir: IDL set to true]
+ expected: FAIL
+
+ [table.dir: IDL set to false]
+ expected: FAIL
+
+ [table.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [table.dir: IDL set to NaN]
+ expected: FAIL
+
+ [table.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [table.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [table.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [table.dir: IDL set to null]
+ expected: FAIL
+
+ [table.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [table.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [table.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [table.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [table.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [table.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [table.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [table.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [table.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [table.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [table.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [table.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [table.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [table.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [table.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [table.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [table.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [table.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [table.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [table.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [table.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [table.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [table.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [table.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [table.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [table.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [table.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [table.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [table.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [table.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [table.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [table.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [table.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [table.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [table.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [table.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [table.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [table.accessKey: IDL set to true]
+ expected: FAIL
+
+ [table.accessKey: IDL set to false]
+ expected: FAIL
+
+ [table.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [table.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [table.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [table.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [table.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [table.accessKey: IDL set to null]
+ expected: FAIL
+
+ [table.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [table.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [table.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [table.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [table.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [table.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [table.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [table.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [table.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [table.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [table.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [table.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [table.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [table.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [table.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [table.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [table.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [table.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [table.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [table.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [table.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [table.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [table.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [table.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [table.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [table.align: setAttribute() to ""]
+ expected: FAIL
+
+ [table.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [table.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [table.align: setAttribute() to 7]
+ expected: FAIL
+
+ [table.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [table.align: setAttribute() to true]
+ expected: FAIL
+
+ [table.align: setAttribute() to false]
+ expected: FAIL
+
+ [table.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [table.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [table.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [table.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [table.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [table.align: setAttribute() to null]
+ expected: FAIL
+
+ [table.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [table.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [table.align: IDL set to ""]
+ expected: FAIL
+
+ [table.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [table.align: IDL set to undefined]
+ expected: FAIL
+
+ [table.align: IDL set to 7]
+ expected: FAIL
+
+ [table.align: IDL set to 1.5]
+ expected: FAIL
+
+ [table.align: IDL set to true]
+ expected: FAIL
+
+ [table.align: IDL set to false]
+ expected: FAIL
+
+ [table.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [table.align: IDL set to NaN]
+ expected: FAIL
+
+ [table.align: IDL set to Infinity]
+ expected: FAIL
+
+ [table.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [table.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [table.align: IDL set to null]
+ expected: FAIL
+
+ [table.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [table.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [table.border: setAttribute() to ""]
+ expected: FAIL
+
+ [table.border: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [table.border: setAttribute() to undefined]
+ expected: FAIL
+
+ [table.border: setAttribute() to 7]
+ expected: FAIL
+
+ [table.border: setAttribute() to 1.5]
+ expected: FAIL
+
+ [table.border: setAttribute() to true]
+ expected: FAIL
+
+ [table.border: setAttribute() to false]
+ expected: FAIL
+
+ [table.border: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [table.border: setAttribute() to NaN]
+ expected: FAIL
+
+ [table.border: setAttribute() to Infinity]
+ expected: FAIL
+
+ [table.border: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [table.border: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [table.border: setAttribute() to null]
+ expected: FAIL
+
+ [table.border: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [table.border: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [table.border: IDL set to ""]
+ expected: FAIL
+
+ [table.border: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [table.border: IDL set to undefined]
+ expected: FAIL
+
+ [table.border: IDL set to 7]
+ expected: FAIL
+
+ [table.border: IDL set to 1.5]
+ expected: FAIL
+
+ [table.border: IDL set to true]
+ expected: FAIL
+
+ [table.border: IDL set to false]
+ expected: FAIL
+
+ [table.border: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [table.border: IDL set to NaN]
+ expected: FAIL
+
+ [table.border: IDL set to Infinity]
+ expected: FAIL
+
+ [table.border: IDL set to -Infinity]
+ expected: FAIL
+
+ [table.border: IDL set to "\\0"]
+ expected: FAIL
+
+ [table.border: IDL set to null]
+ expected: FAIL
+
+ [table.border: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [table.border: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [table.frame: setAttribute() to ""]
+ expected: FAIL
+
+ [table.frame: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [table.frame: setAttribute() to undefined]
+ expected: FAIL
+
+ [table.frame: setAttribute() to 7]
+ expected: FAIL
+
+ [table.frame: setAttribute() to 1.5]
+ expected: FAIL
+
+ [table.frame: setAttribute() to true]
+ expected: FAIL
+
+ [table.frame: setAttribute() to false]
+ expected: FAIL
+
+ [table.frame: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [table.frame: setAttribute() to NaN]
+ expected: FAIL
+
+ [table.frame: setAttribute() to Infinity]
+ expected: FAIL
+
+ [table.frame: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [table.frame: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [table.frame: setAttribute() to null]
+ expected: FAIL
+
+ [table.frame: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [table.frame: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [table.frame: IDL set to ""]
+ expected: FAIL
+
+ [table.frame: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [table.frame: IDL set to undefined]
+ expected: FAIL
+
+ [table.frame: IDL set to 7]
+ expected: FAIL
+
+ [table.frame: IDL set to 1.5]
+ expected: FAIL
+
+ [table.frame: IDL set to true]
+ expected: FAIL
+
+ [table.frame: IDL set to false]
+ expected: FAIL
+
+ [table.frame: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [table.frame: IDL set to NaN]
+ expected: FAIL
+
+ [table.frame: IDL set to Infinity]
+ expected: FAIL
+
+ [table.frame: IDL set to -Infinity]
+ expected: FAIL
+
+ [table.frame: IDL set to "\\0"]
+ expected: FAIL
+
+ [table.frame: IDL set to null]
+ expected: FAIL
+
+ [table.frame: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [table.frame: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [table.rules: setAttribute() to ""]
+ expected: FAIL
+
+ [table.rules: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [table.rules: setAttribute() to undefined]
+ expected: FAIL
+
+ [table.rules: setAttribute() to 7]
+ expected: FAIL
+
+ [table.rules: setAttribute() to 1.5]
+ expected: FAIL
+
+ [table.rules: setAttribute() to true]
+ expected: FAIL
+
+ [table.rules: setAttribute() to false]
+ expected: FAIL
+
+ [table.rules: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [table.rules: setAttribute() to NaN]
+ expected: FAIL
+
+ [table.rules: setAttribute() to Infinity]
+ expected: FAIL
+
+ [table.rules: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [table.rules: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [table.rules: setAttribute() to null]
+ expected: FAIL
+
+ [table.rules: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [table.rules: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [table.rules: IDL set to ""]
+ expected: FAIL
+
+ [table.rules: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [table.rules: IDL set to undefined]
+ expected: FAIL
+
+ [table.rules: IDL set to 7]
+ expected: FAIL
+
+ [table.rules: IDL set to 1.5]
+ expected: FAIL
+
+ [table.rules: IDL set to true]
+ expected: FAIL
+
+ [table.rules: IDL set to false]
+ expected: FAIL
+
+ [table.rules: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [table.rules: IDL set to NaN]
+ expected: FAIL
+
+ [table.rules: IDL set to Infinity]
+ expected: FAIL
+
+ [table.rules: IDL set to -Infinity]
+ expected: FAIL
+
+ [table.rules: IDL set to "\\0"]
+ expected: FAIL
+
+ [table.rules: IDL set to null]
+ expected: FAIL
+
+ [table.rules: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [table.rules: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [table.summary: setAttribute() to ""]
+ expected: FAIL
+
+ [table.summary: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [table.summary: setAttribute() to undefined]
+ expected: FAIL
+
+ [table.summary: setAttribute() to 7]
+ expected: FAIL
+
+ [table.summary: setAttribute() to 1.5]
+ expected: FAIL
+
+ [table.summary: setAttribute() to true]
+ expected: FAIL
+
+ [table.summary: setAttribute() to false]
+ expected: FAIL
+
+ [table.summary: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [table.summary: setAttribute() to NaN]
+ expected: FAIL
+
+ [table.summary: setAttribute() to Infinity]
+ expected: FAIL
+
+ [table.summary: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [table.summary: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [table.summary: setAttribute() to null]
+ expected: FAIL
+
+ [table.summary: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [table.summary: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [table.summary: IDL set to ""]
+ expected: FAIL
+
+ [table.summary: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [table.summary: IDL set to undefined]
+ expected: FAIL
+
+ [table.summary: IDL set to 7]
+ expected: FAIL
+
+ [table.summary: IDL set to 1.5]
+ expected: FAIL
+
+ [table.summary: IDL set to true]
+ expected: FAIL
+
+ [table.summary: IDL set to false]
+ expected: FAIL
+
+ [table.summary: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [table.summary: IDL set to NaN]
+ expected: FAIL
+
+ [table.summary: IDL set to Infinity]
+ expected: FAIL
+
+ [table.summary: IDL set to -Infinity]
+ expected: FAIL
+
+ [table.summary: IDL set to "\\0"]
+ expected: FAIL
+
+ [table.summary: IDL set to null]
+ expected: FAIL
+
+ [table.summary: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [table.summary: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [table.cellPadding: setAttribute() to ""]
+ expected: FAIL
+
+ [table.cellPadding: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [table.cellPadding: setAttribute() to undefined]
+ expected: FAIL
+
+ [table.cellPadding: setAttribute() to 7]
+ expected: FAIL
+
+ [table.cellPadding: setAttribute() to 1.5]
+ expected: FAIL
+
+ [table.cellPadding: setAttribute() to true]
+ expected: FAIL
+
+ [table.cellPadding: setAttribute() to false]
+ expected: FAIL
+
+ [table.cellPadding: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [table.cellPadding: setAttribute() to NaN]
+ expected: FAIL
+
+ [table.cellPadding: setAttribute() to Infinity]
+ expected: FAIL
+
+ [table.cellPadding: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [table.cellPadding: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [table.cellPadding: setAttribute() to null]
+ expected: FAIL
+
+ [table.cellPadding: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [table.cellPadding: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [table.cellPadding: IDL set to ""]
+ expected: FAIL
+
+ [table.cellPadding: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [table.cellPadding: IDL set to undefined]
+ expected: FAIL
+
+ [table.cellPadding: IDL set to 7]
+ expected: FAIL
+
+ [table.cellPadding: IDL set to 1.5]
+ expected: FAIL
+
+ [table.cellPadding: IDL set to true]
+ expected: FAIL
+
+ [table.cellPadding: IDL set to false]
+ expected: FAIL
+
+ [table.cellPadding: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [table.cellPadding: IDL set to NaN]
+ expected: FAIL
+
+ [table.cellPadding: IDL set to Infinity]
+ expected: FAIL
+
+ [table.cellPadding: IDL set to -Infinity]
+ expected: FAIL
+
+ [table.cellPadding: IDL set to "\\0"]
+ expected: FAIL
+
+ [table.cellPadding: IDL set to null]
+ expected: FAIL
+
+ [table.cellPadding: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [table.cellPadding: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [table.cellSpacing: setAttribute() to ""]
+ expected: FAIL
+
+ [table.cellSpacing: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [table.cellSpacing: setAttribute() to undefined]
+ expected: FAIL
+
+ [table.cellSpacing: setAttribute() to 7]
+ expected: FAIL
+
+ [table.cellSpacing: setAttribute() to 1.5]
+ expected: FAIL
+
+ [table.cellSpacing: setAttribute() to true]
+ expected: FAIL
+
+ [table.cellSpacing: setAttribute() to false]
+ expected: FAIL
+
+ [table.cellSpacing: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [table.cellSpacing: setAttribute() to NaN]
+ expected: FAIL
+
+ [table.cellSpacing: setAttribute() to Infinity]
+ expected: FAIL
+
+ [table.cellSpacing: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [table.cellSpacing: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [table.cellSpacing: setAttribute() to null]
+ expected: FAIL
+
+ [table.cellSpacing: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [table.cellSpacing: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [table.cellSpacing: IDL set to ""]
+ expected: FAIL
+
+ [table.cellSpacing: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [table.cellSpacing: IDL set to undefined]
+ expected: FAIL
+
+ [table.cellSpacing: IDL set to 7]
+ expected: FAIL
+
+ [table.cellSpacing: IDL set to 1.5]
+ expected: FAIL
+
+ [table.cellSpacing: IDL set to true]
+ expected: FAIL
+
+ [table.cellSpacing: IDL set to false]
+ expected: FAIL
+
+ [table.cellSpacing: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [table.cellSpacing: IDL set to NaN]
+ expected: FAIL
+
+ [table.cellSpacing: IDL set to Infinity]
+ expected: FAIL
+
+ [table.cellSpacing: IDL set to -Infinity]
+ expected: FAIL
+
+ [table.cellSpacing: IDL set to "\\0"]
+ expected: FAIL
+
+ [table.cellSpacing: IDL set to null]
+ expected: FAIL
+
+ [table.cellSpacing: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [table.cellSpacing: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to true]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to false]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to null]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [caption.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [caption.dir: IDL set to ""]
+ expected: FAIL
+
+ [caption.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [caption.dir: IDL set to undefined]
+ expected: FAIL
+
+ [caption.dir: IDL set to 7]
+ expected: FAIL
+
+ [caption.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [caption.dir: IDL set to true]
+ expected: FAIL
+
+ [caption.dir: IDL set to false]
+ expected: FAIL
+
+ [caption.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [caption.dir: IDL set to NaN]
+ expected: FAIL
+
+ [caption.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [caption.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [caption.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [caption.dir: IDL set to null]
+ expected: FAIL
+
+ [caption.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [caption.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [caption.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [caption.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [caption.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [caption.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [caption.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [caption.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [caption.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [caption.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [caption.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [caption.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [caption.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [caption.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [caption.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [caption.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [caption.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [caption.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [caption.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [caption.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [caption.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [caption.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [caption.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [caption.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [caption.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [caption.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [caption.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [caption.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [caption.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [caption.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [caption.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [caption.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [caption.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [caption.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [caption.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [caption.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [caption.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [caption.accessKey: IDL set to true]
+ expected: FAIL
+
+ [caption.accessKey: IDL set to false]
+ expected: FAIL
+
+ [caption.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [caption.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [caption.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [caption.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [caption.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [caption.accessKey: IDL set to null]
+ expected: FAIL
+
+ [caption.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [caption.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [caption.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [caption.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [caption.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [caption.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [caption.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [caption.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [caption.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [caption.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [caption.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [caption.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [caption.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [caption.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [caption.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [caption.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [caption.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [caption.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [caption.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [caption.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [caption.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [caption.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [caption.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [caption.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [caption.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [caption.align: setAttribute() to ""]
+ expected: FAIL
+
+ [caption.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [caption.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [caption.align: setAttribute() to 7]
+ expected: FAIL
+
+ [caption.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [caption.align: setAttribute() to true]
+ expected: FAIL
+
+ [caption.align: setAttribute() to false]
+ expected: FAIL
+
+ [caption.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [caption.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [caption.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [caption.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [caption.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [caption.align: setAttribute() to null]
+ expected: FAIL
+
+ [caption.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [caption.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [caption.align: IDL set to ""]
+ expected: FAIL
+
+ [caption.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [caption.align: IDL set to undefined]
+ expected: FAIL
+
+ [caption.align: IDL set to 7]
+ expected: FAIL
+
+ [caption.align: IDL set to 1.5]
+ expected: FAIL
+
+ [caption.align: IDL set to true]
+ expected: FAIL
+
+ [caption.align: IDL set to false]
+ expected: FAIL
+
+ [caption.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [caption.align: IDL set to NaN]
+ expected: FAIL
+
+ [caption.align: IDL set to Infinity]
+ expected: FAIL
+
+ [caption.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [caption.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [caption.align: IDL set to null]
+ expected: FAIL
+
+ [caption.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [caption.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to true]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to false]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to null]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [colgroup.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to ""]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to undefined]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to 7]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to true]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to false]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to NaN]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to null]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [colgroup.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [colgroup.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [colgroup.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [colgroup.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [colgroup.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [colgroup.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [colgroup.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [colgroup.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [colgroup.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [colgroup.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [colgroup.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [colgroup.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [colgroup.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [colgroup.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [colgroup.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [colgroup.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [colgroup.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [colgroup.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [colgroup.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [colgroup.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [colgroup.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [colgroup.accessKey: IDL set to true]
+ expected: FAIL
+
+ [colgroup.accessKey: IDL set to false]
+ expected: FAIL
+
+ [colgroup.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [colgroup.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [colgroup.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [colgroup.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [colgroup.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [colgroup.accessKey: IDL set to null]
+ expected: FAIL
+
+ [colgroup.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [colgroup.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [colgroup.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [colgroup.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [colgroup.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [colgroup.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [colgroup.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [colgroup.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [colgroup.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [colgroup.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [colgroup.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [colgroup.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [colgroup.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [colgroup.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [colgroup.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [colgroup.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [colgroup.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [colgroup.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [colgroup.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [colgroup.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [colgroup.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [colgroup.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [colgroup.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [colgroup.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [colgroup.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to -2147483649]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to -36]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to -1]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to 0]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to 1]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to 2147483648]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to 4294967295]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to 4294967296]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to ""]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to "-1"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to "-0"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to "0"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to "1"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to "\\v7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to "7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to "
7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to "
7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to "᠎7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to undefined]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to 1.5]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to true]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to false]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to NaN]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to Infinity]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to object "2"]
+ expected: FAIL
+
+ [colgroup.span: setAttribute() to object "3"]
+ expected: FAIL
+
+ [colgroup.span: IDL set to 0]
+ expected: FAIL
+
+ [colgroup.span: IDL set to 1]
+ expected: FAIL
+
+ [colgroup.span: IDL set to 2147483647]
+ expected: FAIL
+
+ [colgroup.span: IDL set to 2147483648]
+ expected: FAIL
+
+ [colgroup.span: IDL set to 4294967295]
+ expected: FAIL
+
+ [colgroup.align: setAttribute() to ""]
+ expected: FAIL
+
+ [colgroup.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [colgroup.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [colgroup.align: setAttribute() to 7]
+ expected: FAIL
+
+ [colgroup.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [colgroup.align: setAttribute() to true]
+ expected: FAIL
+
+ [colgroup.align: setAttribute() to false]
+ expected: FAIL
+
+ [colgroup.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [colgroup.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [colgroup.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [colgroup.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [colgroup.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [colgroup.align: setAttribute() to null]
+ expected: FAIL
+
+ [colgroup.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [colgroup.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [colgroup.align: IDL set to ""]
+ expected: FAIL
+
+ [colgroup.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [colgroup.align: IDL set to undefined]
+ expected: FAIL
+
+ [colgroup.align: IDL set to 7]
+ expected: FAIL
+
+ [colgroup.align: IDL set to 1.5]
+ expected: FAIL
+
+ [colgroup.align: IDL set to true]
+ expected: FAIL
+
+ [colgroup.align: IDL set to false]
+ expected: FAIL
+
+ [colgroup.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [colgroup.align: IDL set to NaN]
+ expected: FAIL
+
+ [colgroup.align: IDL set to Infinity]
+ expected: FAIL
+
+ [colgroup.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [colgroup.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [colgroup.align: IDL set to null]
+ expected: FAIL
+
+ [colgroup.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [colgroup.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): setAttribute() to ""]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): setAttribute() to undefined]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): setAttribute() to 7]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): setAttribute() to true]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): setAttribute() to false]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): setAttribute() to NaN]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): setAttribute() to null]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): IDL set to ""]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): IDL set to undefined]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): IDL set to 7]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): IDL set to 1.5]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): IDL set to true]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): IDL set to false]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): IDL set to NaN]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): IDL set to Infinity]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): IDL set to -Infinity]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): IDL set to "\\0"]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): IDL set to null]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [colgroup.ch (<colgroup char>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): setAttribute() to ""]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): setAttribute() to undefined]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): setAttribute() to 7]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): setAttribute() to true]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): setAttribute() to false]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): setAttribute() to NaN]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): setAttribute() to null]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): IDL set to ""]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): IDL set to undefined]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): IDL set to 7]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): IDL set to 1.5]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): IDL set to true]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): IDL set to false]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): IDL set to NaN]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): IDL set to Infinity]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): IDL set to -Infinity]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): IDL set to "\\0"]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): IDL set to null]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [colgroup.chOff (<colgroup charoff>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [colgroup.vAlign: setAttribute() to ""]
+ expected: FAIL
+
+ [colgroup.vAlign: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [colgroup.vAlign: setAttribute() to undefined]
+ expected: FAIL
+
+ [colgroup.vAlign: setAttribute() to 7]
+ expected: FAIL
+
+ [colgroup.vAlign: setAttribute() to 1.5]
+ expected: FAIL
+
+ [colgroup.vAlign: setAttribute() to true]
+ expected: FAIL
+
+ [colgroup.vAlign: setAttribute() to false]
+ expected: FAIL
+
+ [colgroup.vAlign: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [colgroup.vAlign: setAttribute() to NaN]
+ expected: FAIL
+
+ [colgroup.vAlign: setAttribute() to Infinity]
+ expected: FAIL
+
+ [colgroup.vAlign: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [colgroup.vAlign: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [colgroup.vAlign: setAttribute() to null]
+ expected: FAIL
+
+ [colgroup.vAlign: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [colgroup.vAlign: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [colgroup.vAlign: IDL set to ""]
+ expected: FAIL
+
+ [colgroup.vAlign: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [colgroup.vAlign: IDL set to undefined]
+ expected: FAIL
+
+ [colgroup.vAlign: IDL set to 7]
+ expected: FAIL
+
+ [colgroup.vAlign: IDL set to 1.5]
+ expected: FAIL
+
+ [colgroup.vAlign: IDL set to true]
+ expected: FAIL
+
+ [colgroup.vAlign: IDL set to false]
+ expected: FAIL
+
+ [colgroup.vAlign: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [colgroup.vAlign: IDL set to NaN]
+ expected: FAIL
+
+ [colgroup.vAlign: IDL set to Infinity]
+ expected: FAIL
+
+ [colgroup.vAlign: IDL set to -Infinity]
+ expected: FAIL
+
+ [colgroup.vAlign: IDL set to "\\0"]
+ expected: FAIL
+
+ [colgroup.vAlign: IDL set to null]
+ expected: FAIL
+
+ [colgroup.vAlign: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [colgroup.vAlign: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [colgroup.width: setAttribute() to ""]
+ expected: FAIL
+
+ [colgroup.width: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [colgroup.width: setAttribute() to undefined]
+ expected: FAIL
+
+ [colgroup.width: setAttribute() to 7]
+ expected: FAIL
+
+ [colgroup.width: setAttribute() to 1.5]
+ expected: FAIL
+
+ [colgroup.width: setAttribute() to true]
+ expected: FAIL
+
+ [colgroup.width: setAttribute() to false]
+ expected: FAIL
+
+ [colgroup.width: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [colgroup.width: setAttribute() to NaN]
+ expected: FAIL
+
+ [colgroup.width: setAttribute() to Infinity]
+ expected: FAIL
+
+ [colgroup.width: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [colgroup.width: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [colgroup.width: setAttribute() to null]
+ expected: FAIL
+
+ [colgroup.width: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [colgroup.width: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [colgroup.width: IDL set to ""]
+ expected: FAIL
+
+ [colgroup.width: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [colgroup.width: IDL set to undefined]
+ expected: FAIL
+
+ [colgroup.width: IDL set to 7]
+ expected: FAIL
+
+ [colgroup.width: IDL set to 1.5]
+ expected: FAIL
+
+ [colgroup.width: IDL set to true]
+ expected: FAIL
+
+ [colgroup.width: IDL set to false]
+ expected: FAIL
+
+ [colgroup.width: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [colgroup.width: IDL set to NaN]
+ expected: FAIL
+
+ [colgroup.width: IDL set to Infinity]
+ expected: FAIL
+
+ [colgroup.width: IDL set to -Infinity]
+ expected: FAIL
+
+ [colgroup.width: IDL set to "\\0"]
+ expected: FAIL
+
+ [colgroup.width: IDL set to null]
+ expected: FAIL
+
+ [colgroup.width: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [colgroup.width: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [col.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [col.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [col.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [col.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [col.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [col.dir: setAttribute() to true]
+ expected: FAIL
+
+ [col.dir: setAttribute() to false]
+ expected: FAIL
+
+ [col.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [col.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [col.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [col.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [col.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [col.dir: setAttribute() to null]
+ expected: FAIL
+
+ [col.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [col.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [col.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [col.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [col.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [col.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [col.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [col.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [col.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [col.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [col.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [col.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [col.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [col.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [col.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [col.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [col.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [col.dir: IDL set to ""]
+ expected: FAIL
+
+ [col.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [col.dir: IDL set to undefined]
+ expected: FAIL
+
+ [col.dir: IDL set to 7]
+ expected: FAIL
+
+ [col.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [col.dir: IDL set to true]
+ expected: FAIL
+
+ [col.dir: IDL set to false]
+ expected: FAIL
+
+ [col.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [col.dir: IDL set to NaN]
+ expected: FAIL
+
+ [col.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [col.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [col.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [col.dir: IDL set to null]
+ expected: FAIL
+
+ [col.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [col.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [col.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [col.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [col.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [col.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [col.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [col.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [col.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [col.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [col.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [col.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [col.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [col.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [col.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [col.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [col.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [col.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [col.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [col.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [col.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [col.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [col.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [col.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [col.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [col.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [col.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [col.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [col.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [col.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [col.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [col.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [col.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [col.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [col.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [col.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [col.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [col.accessKey: IDL set to true]
+ expected: FAIL
+
+ [col.accessKey: IDL set to false]
+ expected: FAIL
+
+ [col.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [col.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [col.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [col.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [col.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [col.accessKey: IDL set to null]
+ expected: FAIL
+
+ [col.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [col.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [col.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [col.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [col.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [col.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [col.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [col.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [col.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [col.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [col.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [col.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [col.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [col.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [col.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [col.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [col.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [col.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [col.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [col.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [col.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [col.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [col.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [col.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [col.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [col.span: setAttribute() to -2147483649]
+ expected: FAIL
+
+ [col.span: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [col.span: setAttribute() to -36]
+ expected: FAIL
+
+ [col.span: setAttribute() to -1]
+ expected: FAIL
+
+ [col.span: setAttribute() to 0]
+ expected: FAIL
+
+ [col.span: setAttribute() to 1]
+ expected: FAIL
+
+ [col.span: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [col.span: setAttribute() to 2147483648]
+ expected: FAIL
+
+ [col.span: setAttribute() to 4294967295]
+ expected: FAIL
+
+ [col.span: setAttribute() to 4294967296]
+ expected: FAIL
+
+ [col.span: setAttribute() to ""]
+ expected: FAIL
+
+ [col.span: setAttribute() to "-1"]
+ expected: FAIL
+
+ [col.span: setAttribute() to "-0"]
+ expected: FAIL
+
+ [col.span: setAttribute() to "0"]
+ expected: FAIL
+
+ [col.span: setAttribute() to "1"]
+ expected: FAIL
+
+ [col.span: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to "\\v7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to "7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to "
7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to "
7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to "᠎7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to " 7"]
+ expected: FAIL
+
+ [col.span: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [col.span: setAttribute() to undefined]
+ expected: FAIL
+
+ [col.span: setAttribute() to 1.5]
+ expected: FAIL
+
+ [col.span: setAttribute() to true]
+ expected: FAIL
+
+ [col.span: setAttribute() to false]
+ expected: FAIL
+
+ [col.span: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [col.span: setAttribute() to NaN]
+ expected: FAIL
+
+ [col.span: setAttribute() to Infinity]
+ expected: FAIL
+
+ [col.span: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [col.span: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [col.span: setAttribute() to object "2"]
+ expected: FAIL
+
+ [col.span: setAttribute() to object "3"]
+ expected: FAIL
+
+ [col.span: IDL set to 0]
+ expected: FAIL
+
+ [col.span: IDL set to 1]
+ expected: FAIL
+
+ [col.span: IDL set to 2147483647]
+ expected: FAIL
+
+ [col.span: IDL set to 2147483648]
+ expected: FAIL
+
+ [col.span: IDL set to 4294967295]
+ expected: FAIL
+
+ [col.align: setAttribute() to ""]
+ expected: FAIL
+
+ [col.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [col.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [col.align: setAttribute() to 7]
+ expected: FAIL
+
+ [col.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [col.align: setAttribute() to true]
+ expected: FAIL
+
+ [col.align: setAttribute() to false]
+ expected: FAIL
+
+ [col.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [col.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [col.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [col.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [col.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [col.align: setAttribute() to null]
+ expected: FAIL
+
+ [col.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [col.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [col.align: IDL set to ""]
+ expected: FAIL
+
+ [col.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [col.align: IDL set to undefined]
+ expected: FAIL
+
+ [col.align: IDL set to 7]
+ expected: FAIL
+
+ [col.align: IDL set to 1.5]
+ expected: FAIL
+
+ [col.align: IDL set to true]
+ expected: FAIL
+
+ [col.align: IDL set to false]
+ expected: FAIL
+
+ [col.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [col.align: IDL set to NaN]
+ expected: FAIL
+
+ [col.align: IDL set to Infinity]
+ expected: FAIL
+
+ [col.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [col.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [col.align: IDL set to null]
+ expected: FAIL
+
+ [col.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [col.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [col.ch (<col char>): setAttribute() to ""]
+ expected: FAIL
+
+ [col.ch (<col char>): setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [col.ch (<col char>): setAttribute() to undefined]
+ expected: FAIL
+
+ [col.ch (<col char>): setAttribute() to 7]
+ expected: FAIL
+
+ [col.ch (<col char>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [col.ch (<col char>): setAttribute() to true]
+ expected: FAIL
+
+ [col.ch (<col char>): setAttribute() to false]
+ expected: FAIL
+
+ [col.ch (<col char>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [col.ch (<col char>): setAttribute() to NaN]
+ expected: FAIL
+
+ [col.ch (<col char>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [col.ch (<col char>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [col.ch (<col char>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [col.ch (<col char>): setAttribute() to null]
+ expected: FAIL
+
+ [col.ch (<col char>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [col.ch (<col char>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [col.ch (<col char>): IDL set to ""]
+ expected: FAIL
+
+ [col.ch (<col char>): IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [col.ch (<col char>): IDL set to undefined]
+ expected: FAIL
+
+ [col.ch (<col char>): IDL set to 7]
+ expected: FAIL
+
+ [col.ch (<col char>): IDL set to 1.5]
+ expected: FAIL
+
+ [col.ch (<col char>): IDL set to true]
+ expected: FAIL
+
+ [col.ch (<col char>): IDL set to false]
+ expected: FAIL
+
+ [col.ch (<col char>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [col.ch (<col char>): IDL set to NaN]
+ expected: FAIL
+
+ [col.ch (<col char>): IDL set to Infinity]
+ expected: FAIL
+
+ [col.ch (<col char>): IDL set to -Infinity]
+ expected: FAIL
+
+ [col.ch (<col char>): IDL set to "\\0"]
+ expected: FAIL
+
+ [col.ch (<col char>): IDL set to null]
+ expected: FAIL
+
+ [col.ch (<col char>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [col.ch (<col char>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): setAttribute() to ""]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): setAttribute() to undefined]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): setAttribute() to 7]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): setAttribute() to true]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): setAttribute() to false]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): setAttribute() to NaN]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): setAttribute() to null]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): IDL set to ""]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): IDL set to undefined]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): IDL set to 7]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): IDL set to 1.5]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): IDL set to true]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): IDL set to false]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): IDL set to NaN]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): IDL set to Infinity]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): IDL set to -Infinity]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): IDL set to "\\0"]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): IDL set to null]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [col.chOff (<col charoff>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [col.vAlign: setAttribute() to ""]
+ expected: FAIL
+
+ [col.vAlign: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [col.vAlign: setAttribute() to undefined]
+ expected: FAIL
+
+ [col.vAlign: setAttribute() to 7]
+ expected: FAIL
+
+ [col.vAlign: setAttribute() to 1.5]
+ expected: FAIL
+
+ [col.vAlign: setAttribute() to true]
+ expected: FAIL
+
+ [col.vAlign: setAttribute() to false]
+ expected: FAIL
+
+ [col.vAlign: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [col.vAlign: setAttribute() to NaN]
+ expected: FAIL
+
+ [col.vAlign: setAttribute() to Infinity]
+ expected: FAIL
+
+ [col.vAlign: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [col.vAlign: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [col.vAlign: setAttribute() to null]
+ expected: FAIL
+
+ [col.vAlign: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [col.vAlign: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [col.vAlign: IDL set to ""]
+ expected: FAIL
+
+ [col.vAlign: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [col.vAlign: IDL set to undefined]
+ expected: FAIL
+
+ [col.vAlign: IDL set to 7]
+ expected: FAIL
+
+ [col.vAlign: IDL set to 1.5]
+ expected: FAIL
+
+ [col.vAlign: IDL set to true]
+ expected: FAIL
+
+ [col.vAlign: IDL set to false]
+ expected: FAIL
+
+ [col.vAlign: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [col.vAlign: IDL set to NaN]
+ expected: FAIL
+
+ [col.vAlign: IDL set to Infinity]
+ expected: FAIL
+
+ [col.vAlign: IDL set to -Infinity]
+ expected: FAIL
+
+ [col.vAlign: IDL set to "\\0"]
+ expected: FAIL
+
+ [col.vAlign: IDL set to null]
+ expected: FAIL
+
+ [col.vAlign: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [col.vAlign: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [col.width: setAttribute() to ""]
+ expected: FAIL
+
+ [col.width: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [col.width: setAttribute() to undefined]
+ expected: FAIL
+
+ [col.width: setAttribute() to 7]
+ expected: FAIL
+
+ [col.width: setAttribute() to 1.5]
+ expected: FAIL
+
+ [col.width: setAttribute() to true]
+ expected: FAIL
+
+ [col.width: setAttribute() to false]
+ expected: FAIL
+
+ [col.width: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [col.width: setAttribute() to NaN]
+ expected: FAIL
+
+ [col.width: setAttribute() to Infinity]
+ expected: FAIL
+
+ [col.width: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [col.width: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [col.width: setAttribute() to null]
+ expected: FAIL
+
+ [col.width: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [col.width: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [col.width: IDL set to ""]
+ expected: FAIL
+
+ [col.width: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [col.width: IDL set to undefined]
+ expected: FAIL
+
+ [col.width: IDL set to 7]
+ expected: FAIL
+
+ [col.width: IDL set to 1.5]
+ expected: FAIL
+
+ [col.width: IDL set to true]
+ expected: FAIL
+
+ [col.width: IDL set to false]
+ expected: FAIL
+
+ [col.width: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [col.width: IDL set to NaN]
+ expected: FAIL
+
+ [col.width: IDL set to Infinity]
+ expected: FAIL
+
+ [col.width: IDL set to -Infinity]
+ expected: FAIL
+
+ [col.width: IDL set to "\\0"]
+ expected: FAIL
+
+ [col.width: IDL set to null]
+ expected: FAIL
+
+ [col.width: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [col.width: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to true]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to false]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to null]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [tbody.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [tbody.dir: IDL set to ""]
+ expected: FAIL
+
+ [tbody.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tbody.dir: IDL set to undefined]
+ expected: FAIL
+
+ [tbody.dir: IDL set to 7]
+ expected: FAIL
+
+ [tbody.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [tbody.dir: IDL set to true]
+ expected: FAIL
+
+ [tbody.dir: IDL set to false]
+ expected: FAIL
+
+ [tbody.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [tbody.dir: IDL set to NaN]
+ expected: FAIL
+
+ [tbody.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [tbody.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [tbody.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [tbody.dir: IDL set to null]
+ expected: FAIL
+
+ [tbody.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [tbody.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [tbody.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [tbody.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [tbody.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [tbody.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [tbody.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [tbody.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [tbody.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [tbody.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [tbody.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [tbody.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [tbody.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [tbody.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [tbody.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [tbody.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [tbody.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [tbody.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [tbody.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tbody.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [tbody.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [tbody.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [tbody.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [tbody.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [tbody.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [tbody.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [tbody.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [tbody.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [tbody.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [tbody.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [tbody.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [tbody.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [tbody.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [tbody.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tbody.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [tbody.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [tbody.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [tbody.accessKey: IDL set to true]
+ expected: FAIL
+
+ [tbody.accessKey: IDL set to false]
+ expected: FAIL
+
+ [tbody.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [tbody.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [tbody.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [tbody.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [tbody.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [tbody.accessKey: IDL set to null]
+ expected: FAIL
+
+ [tbody.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [tbody.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [tbody.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [tbody.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [tbody.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [tbody.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [tbody.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [tbody.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [tbody.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [tbody.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [tbody.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [tbody.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [tbody.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [tbody.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [tbody.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [tbody.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [tbody.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [tbody.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [tbody.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [tbody.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [tbody.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [tbody.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [tbody.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [tbody.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [tbody.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [tbody.align: setAttribute() to ""]
+ expected: FAIL
+
+ [tbody.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tbody.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [tbody.align: setAttribute() to 7]
+ expected: FAIL
+
+ [tbody.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [tbody.align: setAttribute() to true]
+ expected: FAIL
+
+ [tbody.align: setAttribute() to false]
+ expected: FAIL
+
+ [tbody.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [tbody.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [tbody.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [tbody.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [tbody.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [tbody.align: setAttribute() to null]
+ expected: FAIL
+
+ [tbody.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [tbody.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [tbody.align: IDL set to ""]
+ expected: FAIL
+
+ [tbody.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tbody.align: IDL set to undefined]
+ expected: FAIL
+
+ [tbody.align: IDL set to 7]
+ expected: FAIL
+
+ [tbody.align: IDL set to 1.5]
+ expected: FAIL
+
+ [tbody.align: IDL set to true]
+ expected: FAIL
+
+ [tbody.align: IDL set to false]
+ expected: FAIL
+
+ [tbody.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [tbody.align: IDL set to NaN]
+ expected: FAIL
+
+ [tbody.align: IDL set to Infinity]
+ expected: FAIL
+
+ [tbody.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [tbody.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [tbody.align: IDL set to null]
+ expected: FAIL
+
+ [tbody.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [tbody.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): setAttribute() to ""]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): setAttribute() to undefined]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): setAttribute() to 7]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): setAttribute() to true]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): setAttribute() to false]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): setAttribute() to NaN]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): setAttribute() to null]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): IDL set to ""]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): IDL set to undefined]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): IDL set to 7]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): IDL set to 1.5]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): IDL set to true]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): IDL set to false]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): IDL set to NaN]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): IDL set to Infinity]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): IDL set to -Infinity]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): IDL set to "\\0"]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): IDL set to null]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [tbody.ch (<tbody char>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): setAttribute() to ""]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): setAttribute() to undefined]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): setAttribute() to 7]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): setAttribute() to true]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): setAttribute() to false]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): setAttribute() to NaN]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): setAttribute() to null]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): IDL set to ""]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): IDL set to undefined]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): IDL set to 7]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): IDL set to 1.5]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): IDL set to true]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): IDL set to false]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): IDL set to NaN]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): IDL set to Infinity]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): IDL set to -Infinity]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): IDL set to "\\0"]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): IDL set to null]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [tbody.chOff (<tbody charoff>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [tbody.vAlign: setAttribute() to ""]
+ expected: FAIL
+
+ [tbody.vAlign: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tbody.vAlign: setAttribute() to undefined]
+ expected: FAIL
+
+ [tbody.vAlign: setAttribute() to 7]
+ expected: FAIL
+
+ [tbody.vAlign: setAttribute() to 1.5]
+ expected: FAIL
+
+ [tbody.vAlign: setAttribute() to true]
+ expected: FAIL
+
+ [tbody.vAlign: setAttribute() to false]
+ expected: FAIL
+
+ [tbody.vAlign: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [tbody.vAlign: setAttribute() to NaN]
+ expected: FAIL
+
+ [tbody.vAlign: setAttribute() to Infinity]
+ expected: FAIL
+
+ [tbody.vAlign: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [tbody.vAlign: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [tbody.vAlign: setAttribute() to null]
+ expected: FAIL
+
+ [tbody.vAlign: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [tbody.vAlign: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [tbody.vAlign: IDL set to ""]
+ expected: FAIL
+
+ [tbody.vAlign: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tbody.vAlign: IDL set to undefined]
+ expected: FAIL
+
+ [tbody.vAlign: IDL set to 7]
+ expected: FAIL
+
+ [tbody.vAlign: IDL set to 1.5]
+ expected: FAIL
+
+ [tbody.vAlign: IDL set to true]
+ expected: FAIL
+
+ [tbody.vAlign: IDL set to false]
+ expected: FAIL
+
+ [tbody.vAlign: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [tbody.vAlign: IDL set to NaN]
+ expected: FAIL
+
+ [tbody.vAlign: IDL set to Infinity]
+ expected: FAIL
+
+ [tbody.vAlign: IDL set to -Infinity]
+ expected: FAIL
+
+ [tbody.vAlign: IDL set to "\\0"]
+ expected: FAIL
+
+ [tbody.vAlign: IDL set to null]
+ expected: FAIL
+
+ [tbody.vAlign: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [tbody.vAlign: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to true]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to false]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to null]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [thead.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [thead.dir: IDL set to ""]
+ expected: FAIL
+
+ [thead.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [thead.dir: IDL set to undefined]
+ expected: FAIL
+
+ [thead.dir: IDL set to 7]
+ expected: FAIL
+
+ [thead.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [thead.dir: IDL set to true]
+ expected: FAIL
+
+ [thead.dir: IDL set to false]
+ expected: FAIL
+
+ [thead.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [thead.dir: IDL set to NaN]
+ expected: FAIL
+
+ [thead.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [thead.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [thead.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [thead.dir: IDL set to null]
+ expected: FAIL
+
+ [thead.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [thead.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [thead.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [thead.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [thead.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [thead.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [thead.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [thead.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [thead.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [thead.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [thead.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [thead.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [thead.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [thead.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [thead.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [thead.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [thead.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [thead.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [thead.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [thead.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [thead.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [thead.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [thead.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [thead.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [thead.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [thead.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [thead.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [thead.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [thead.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [thead.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [thead.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [thead.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [thead.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [thead.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [thead.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [thead.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [thead.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [thead.accessKey: IDL set to true]
+ expected: FAIL
+
+ [thead.accessKey: IDL set to false]
+ expected: FAIL
+
+ [thead.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [thead.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [thead.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [thead.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [thead.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [thead.accessKey: IDL set to null]
+ expected: FAIL
+
+ [thead.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [thead.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [thead.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [thead.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [thead.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [thead.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [thead.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [thead.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [thead.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [thead.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [thead.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [thead.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [thead.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [thead.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [thead.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [thead.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [thead.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [thead.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [thead.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [thead.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [thead.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [thead.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [thead.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [thead.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [thead.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [thead.align: setAttribute() to ""]
+ expected: FAIL
+
+ [thead.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [thead.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [thead.align: setAttribute() to 7]
+ expected: FAIL
+
+ [thead.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [thead.align: setAttribute() to true]
+ expected: FAIL
+
+ [thead.align: setAttribute() to false]
+ expected: FAIL
+
+ [thead.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [thead.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [thead.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [thead.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [thead.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [thead.align: setAttribute() to null]
+ expected: FAIL
+
+ [thead.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [thead.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [thead.align: IDL set to ""]
+ expected: FAIL
+
+ [thead.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [thead.align: IDL set to undefined]
+ expected: FAIL
+
+ [thead.align: IDL set to 7]
+ expected: FAIL
+
+ [thead.align: IDL set to 1.5]
+ expected: FAIL
+
+ [thead.align: IDL set to true]
+ expected: FAIL
+
+ [thead.align: IDL set to false]
+ expected: FAIL
+
+ [thead.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [thead.align: IDL set to NaN]
+ expected: FAIL
+
+ [thead.align: IDL set to Infinity]
+ expected: FAIL
+
+ [thead.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [thead.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [thead.align: IDL set to null]
+ expected: FAIL
+
+ [thead.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [thead.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [thead.ch (<thead char>): setAttribute() to ""]
+ expected: FAIL
+
+ [thead.ch (<thead char>): setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [thead.ch (<thead char>): setAttribute() to undefined]
+ expected: FAIL
+
+ [thead.ch (<thead char>): setAttribute() to 7]
+ expected: FAIL
+
+ [thead.ch (<thead char>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [thead.ch (<thead char>): setAttribute() to true]
+ expected: FAIL
+
+ [thead.ch (<thead char>): setAttribute() to false]
+ expected: FAIL
+
+ [thead.ch (<thead char>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [thead.ch (<thead char>): setAttribute() to NaN]
+ expected: FAIL
+
+ [thead.ch (<thead char>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [thead.ch (<thead char>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [thead.ch (<thead char>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [thead.ch (<thead char>): setAttribute() to null]
+ expected: FAIL
+
+ [thead.ch (<thead char>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [thead.ch (<thead char>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [thead.ch (<thead char>): IDL set to ""]
+ expected: FAIL
+
+ [thead.ch (<thead char>): IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [thead.ch (<thead char>): IDL set to undefined]
+ expected: FAIL
+
+ [thead.ch (<thead char>): IDL set to 7]
+ expected: FAIL
+
+ [thead.ch (<thead char>): IDL set to 1.5]
+ expected: FAIL
+
+ [thead.ch (<thead char>): IDL set to true]
+ expected: FAIL
+
+ [thead.ch (<thead char>): IDL set to false]
+ expected: FAIL
+
+ [thead.ch (<thead char>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [thead.ch (<thead char>): IDL set to NaN]
+ expected: FAIL
+
+ [thead.ch (<thead char>): IDL set to Infinity]
+ expected: FAIL
+
+ [thead.ch (<thead char>): IDL set to -Infinity]
+ expected: FAIL
+
+ [thead.ch (<thead char>): IDL set to "\\0"]
+ expected: FAIL
+
+ [thead.ch (<thead char>): IDL set to null]
+ expected: FAIL
+
+ [thead.ch (<thead char>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [thead.ch (<thead char>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): setAttribute() to ""]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): setAttribute() to undefined]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): setAttribute() to 7]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): setAttribute() to true]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): setAttribute() to false]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): setAttribute() to NaN]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): setAttribute() to null]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): IDL set to ""]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): IDL set to undefined]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): IDL set to 7]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): IDL set to 1.5]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): IDL set to true]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): IDL set to false]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): IDL set to NaN]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): IDL set to Infinity]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): IDL set to -Infinity]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): IDL set to "\\0"]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): IDL set to null]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [thead.chOff (<thead charoff>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [thead.vAlign: setAttribute() to ""]
+ expected: FAIL
+
+ [thead.vAlign: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [thead.vAlign: setAttribute() to undefined]
+ expected: FAIL
+
+ [thead.vAlign: setAttribute() to 7]
+ expected: FAIL
+
+ [thead.vAlign: setAttribute() to 1.5]
+ expected: FAIL
+
+ [thead.vAlign: setAttribute() to true]
+ expected: FAIL
+
+ [thead.vAlign: setAttribute() to false]
+ expected: FAIL
+
+ [thead.vAlign: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [thead.vAlign: setAttribute() to NaN]
+ expected: FAIL
+
+ [thead.vAlign: setAttribute() to Infinity]
+ expected: FAIL
+
+ [thead.vAlign: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [thead.vAlign: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [thead.vAlign: setAttribute() to null]
+ expected: FAIL
+
+ [thead.vAlign: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [thead.vAlign: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [thead.vAlign: IDL set to ""]
+ expected: FAIL
+
+ [thead.vAlign: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [thead.vAlign: IDL set to undefined]
+ expected: FAIL
+
+ [thead.vAlign: IDL set to 7]
+ expected: FAIL
+
+ [thead.vAlign: IDL set to 1.5]
+ expected: FAIL
+
+ [thead.vAlign: IDL set to true]
+ expected: FAIL
+
+ [thead.vAlign: IDL set to false]
+ expected: FAIL
+
+ [thead.vAlign: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [thead.vAlign: IDL set to NaN]
+ expected: FAIL
+
+ [thead.vAlign: IDL set to Infinity]
+ expected: FAIL
+
+ [thead.vAlign: IDL set to -Infinity]
+ expected: FAIL
+
+ [thead.vAlign: IDL set to "\\0"]
+ expected: FAIL
+
+ [thead.vAlign: IDL set to null]
+ expected: FAIL
+
+ [thead.vAlign: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [thead.vAlign: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to true]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to false]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to null]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [tfoot.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to ""]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to undefined]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to 7]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to true]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to false]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to NaN]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to null]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [tfoot.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [tfoot.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [tfoot.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tfoot.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [tfoot.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [tfoot.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [tfoot.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [tfoot.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [tfoot.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [tfoot.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [tfoot.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [tfoot.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [tfoot.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [tfoot.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [tfoot.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [tfoot.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [tfoot.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [tfoot.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tfoot.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [tfoot.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [tfoot.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [tfoot.accessKey: IDL set to true]
+ expected: FAIL
+
+ [tfoot.accessKey: IDL set to false]
+ expected: FAIL
+
+ [tfoot.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [tfoot.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [tfoot.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [tfoot.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [tfoot.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [tfoot.accessKey: IDL set to null]
+ expected: FAIL
+
+ [tfoot.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [tfoot.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [tfoot.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [tfoot.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [tfoot.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [tfoot.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [tfoot.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [tfoot.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [tfoot.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [tfoot.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [tfoot.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [tfoot.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [tfoot.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [tfoot.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [tfoot.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [tfoot.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [tfoot.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [tfoot.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [tfoot.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [tfoot.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [tfoot.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [tfoot.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [tfoot.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [tfoot.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [tfoot.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [tfoot.align: setAttribute() to ""]
+ expected: FAIL
+
+ [tfoot.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tfoot.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [tfoot.align: setAttribute() to 7]
+ expected: FAIL
+
+ [tfoot.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [tfoot.align: setAttribute() to true]
+ expected: FAIL
+
+ [tfoot.align: setAttribute() to false]
+ expected: FAIL
+
+ [tfoot.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [tfoot.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [tfoot.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [tfoot.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [tfoot.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [tfoot.align: setAttribute() to null]
+ expected: FAIL
+
+ [tfoot.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [tfoot.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [tfoot.align: IDL set to ""]
+ expected: FAIL
+
+ [tfoot.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tfoot.align: IDL set to undefined]
+ expected: FAIL
+
+ [tfoot.align: IDL set to 7]
+ expected: FAIL
+
+ [tfoot.align: IDL set to 1.5]
+ expected: FAIL
+
+ [tfoot.align: IDL set to true]
+ expected: FAIL
+
+ [tfoot.align: IDL set to false]
+ expected: FAIL
+
+ [tfoot.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [tfoot.align: IDL set to NaN]
+ expected: FAIL
+
+ [tfoot.align: IDL set to Infinity]
+ expected: FAIL
+
+ [tfoot.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [tfoot.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [tfoot.align: IDL set to null]
+ expected: FAIL
+
+ [tfoot.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [tfoot.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): setAttribute() to ""]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): setAttribute() to undefined]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): setAttribute() to 7]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): setAttribute() to true]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): setAttribute() to false]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): setAttribute() to NaN]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): setAttribute() to null]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): IDL set to ""]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): IDL set to undefined]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): IDL set to 7]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): IDL set to 1.5]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): IDL set to true]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): IDL set to false]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): IDL set to NaN]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): IDL set to Infinity]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): IDL set to -Infinity]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): IDL set to "\\0"]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): IDL set to null]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [tfoot.ch (<tfoot char>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): setAttribute() to ""]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): setAttribute() to undefined]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): setAttribute() to 7]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): setAttribute() to true]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): setAttribute() to false]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): setAttribute() to NaN]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): setAttribute() to null]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): IDL set to ""]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): IDL set to undefined]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): IDL set to 7]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): IDL set to 1.5]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): IDL set to true]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): IDL set to false]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): IDL set to NaN]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): IDL set to Infinity]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): IDL set to -Infinity]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): IDL set to "\\0"]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): IDL set to null]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [tfoot.chOff (<tfoot charoff>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [tfoot.vAlign: setAttribute() to ""]
+ expected: FAIL
+
+ [tfoot.vAlign: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tfoot.vAlign: setAttribute() to undefined]
+ expected: FAIL
+
+ [tfoot.vAlign: setAttribute() to 7]
+ expected: FAIL
+
+ [tfoot.vAlign: setAttribute() to 1.5]
+ expected: FAIL
+
+ [tfoot.vAlign: setAttribute() to true]
+ expected: FAIL
+
+ [tfoot.vAlign: setAttribute() to false]
+ expected: FAIL
+
+ [tfoot.vAlign: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [tfoot.vAlign: setAttribute() to NaN]
+ expected: FAIL
+
+ [tfoot.vAlign: setAttribute() to Infinity]
+ expected: FAIL
+
+ [tfoot.vAlign: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [tfoot.vAlign: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [tfoot.vAlign: setAttribute() to null]
+ expected: FAIL
+
+ [tfoot.vAlign: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [tfoot.vAlign: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [tfoot.vAlign: IDL set to ""]
+ expected: FAIL
+
+ [tfoot.vAlign: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tfoot.vAlign: IDL set to undefined]
+ expected: FAIL
+
+ [tfoot.vAlign: IDL set to 7]
+ expected: FAIL
+
+ [tfoot.vAlign: IDL set to 1.5]
+ expected: FAIL
+
+ [tfoot.vAlign: IDL set to true]
+ expected: FAIL
+
+ [tfoot.vAlign: IDL set to false]
+ expected: FAIL
+
+ [tfoot.vAlign: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [tfoot.vAlign: IDL set to NaN]
+ expected: FAIL
+
+ [tfoot.vAlign: IDL set to Infinity]
+ expected: FAIL
+
+ [tfoot.vAlign: IDL set to -Infinity]
+ expected: FAIL
+
+ [tfoot.vAlign: IDL set to "\\0"]
+ expected: FAIL
+
+ [tfoot.vAlign: IDL set to null]
+ expected: FAIL
+
+ [tfoot.vAlign: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [tfoot.vAlign: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to true]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to false]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to null]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [tr.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [tr.dir: IDL set to ""]
+ expected: FAIL
+
+ [tr.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tr.dir: IDL set to undefined]
+ expected: FAIL
+
+ [tr.dir: IDL set to 7]
+ expected: FAIL
+
+ [tr.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [tr.dir: IDL set to true]
+ expected: FAIL
+
+ [tr.dir: IDL set to false]
+ expected: FAIL
+
+ [tr.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [tr.dir: IDL set to NaN]
+ expected: FAIL
+
+ [tr.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [tr.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [tr.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [tr.dir: IDL set to null]
+ expected: FAIL
+
+ [tr.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [tr.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [tr.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [tr.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [tr.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [tr.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [tr.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [tr.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [tr.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [tr.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [tr.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [tr.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [tr.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [tr.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [tr.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [tr.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [tr.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [tr.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [tr.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tr.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [tr.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [tr.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [tr.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [tr.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [tr.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [tr.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [tr.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [tr.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [tr.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [tr.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [tr.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [tr.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [tr.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [tr.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tr.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [tr.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [tr.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [tr.accessKey: IDL set to true]
+ expected: FAIL
+
+ [tr.accessKey: IDL set to false]
+ expected: FAIL
+
+ [tr.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [tr.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [tr.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [tr.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [tr.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [tr.accessKey: IDL set to null]
+ expected: FAIL
+
+ [tr.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [tr.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [tr.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [tr.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [tr.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [tr.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [tr.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [tr.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [tr.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [tr.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [tr.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [tr.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [tr.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [tr.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [tr.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [tr.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [tr.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [tr.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [tr.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [tr.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [tr.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [tr.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [tr.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [tr.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [tr.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [tr.align: setAttribute() to ""]
+ expected: FAIL
+
+ [tr.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tr.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [tr.align: setAttribute() to 7]
+ expected: FAIL
+
+ [tr.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [tr.align: setAttribute() to true]
+ expected: FAIL
+
+ [tr.align: setAttribute() to false]
+ expected: FAIL
+
+ [tr.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [tr.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [tr.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [tr.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [tr.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [tr.align: setAttribute() to null]
+ expected: FAIL
+
+ [tr.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [tr.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [tr.align: IDL set to ""]
+ expected: FAIL
+
+ [tr.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tr.align: IDL set to undefined]
+ expected: FAIL
+
+ [tr.align: IDL set to 7]
+ expected: FAIL
+
+ [tr.align: IDL set to 1.5]
+ expected: FAIL
+
+ [tr.align: IDL set to true]
+ expected: FAIL
+
+ [tr.align: IDL set to false]
+ expected: FAIL
+
+ [tr.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [tr.align: IDL set to NaN]
+ expected: FAIL
+
+ [tr.align: IDL set to Infinity]
+ expected: FAIL
+
+ [tr.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [tr.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [tr.align: IDL set to null]
+ expected: FAIL
+
+ [tr.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [tr.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [tr.ch (<tr char>): setAttribute() to ""]
+ expected: FAIL
+
+ [tr.ch (<tr char>): setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tr.ch (<tr char>): setAttribute() to undefined]
+ expected: FAIL
+
+ [tr.ch (<tr char>): setAttribute() to 7]
+ expected: FAIL
+
+ [tr.ch (<tr char>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [tr.ch (<tr char>): setAttribute() to true]
+ expected: FAIL
+
+ [tr.ch (<tr char>): setAttribute() to false]
+ expected: FAIL
+
+ [tr.ch (<tr char>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [tr.ch (<tr char>): setAttribute() to NaN]
+ expected: FAIL
+
+ [tr.ch (<tr char>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [tr.ch (<tr char>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [tr.ch (<tr char>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [tr.ch (<tr char>): setAttribute() to null]
+ expected: FAIL
+
+ [tr.ch (<tr char>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [tr.ch (<tr char>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [tr.ch (<tr char>): IDL set to ""]
+ expected: FAIL
+
+ [tr.ch (<tr char>): IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tr.ch (<tr char>): IDL set to undefined]
+ expected: FAIL
+
+ [tr.ch (<tr char>): IDL set to 7]
+ expected: FAIL
+
+ [tr.ch (<tr char>): IDL set to 1.5]
+ expected: FAIL
+
+ [tr.ch (<tr char>): IDL set to true]
+ expected: FAIL
+
+ [tr.ch (<tr char>): IDL set to false]
+ expected: FAIL
+
+ [tr.ch (<tr char>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [tr.ch (<tr char>): IDL set to NaN]
+ expected: FAIL
+
+ [tr.ch (<tr char>): IDL set to Infinity]
+ expected: FAIL
+
+ [tr.ch (<tr char>): IDL set to -Infinity]
+ expected: FAIL
+
+ [tr.ch (<tr char>): IDL set to "\\0"]
+ expected: FAIL
+
+ [tr.ch (<tr char>): IDL set to null]
+ expected: FAIL
+
+ [tr.ch (<tr char>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [tr.ch (<tr char>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): setAttribute() to ""]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): setAttribute() to undefined]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): setAttribute() to 7]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): setAttribute() to true]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): setAttribute() to false]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): setAttribute() to NaN]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): setAttribute() to null]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): IDL set to ""]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): IDL set to undefined]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): IDL set to 7]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): IDL set to 1.5]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): IDL set to true]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): IDL set to false]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): IDL set to NaN]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): IDL set to Infinity]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): IDL set to -Infinity]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): IDL set to "\\0"]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): IDL set to null]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [tr.chOff (<tr charoff>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [tr.vAlign: setAttribute() to ""]
+ expected: FAIL
+
+ [tr.vAlign: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tr.vAlign: setAttribute() to undefined]
+ expected: FAIL
+
+ [tr.vAlign: setAttribute() to 7]
+ expected: FAIL
+
+ [tr.vAlign: setAttribute() to 1.5]
+ expected: FAIL
+
+ [tr.vAlign: setAttribute() to true]
+ expected: FAIL
+
+ [tr.vAlign: setAttribute() to false]
+ expected: FAIL
+
+ [tr.vAlign: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [tr.vAlign: setAttribute() to NaN]
+ expected: FAIL
+
+ [tr.vAlign: setAttribute() to Infinity]
+ expected: FAIL
+
+ [tr.vAlign: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [tr.vAlign: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [tr.vAlign: setAttribute() to null]
+ expected: FAIL
+
+ [tr.vAlign: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [tr.vAlign: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [tr.vAlign: IDL set to ""]
+ expected: FAIL
+
+ [tr.vAlign: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [tr.vAlign: IDL set to undefined]
+ expected: FAIL
+
+ [tr.vAlign: IDL set to 7]
+ expected: FAIL
+
+ [tr.vAlign: IDL set to 1.5]
+ expected: FAIL
+
+ [tr.vAlign: IDL set to true]
+ expected: FAIL
+
+ [tr.vAlign: IDL set to false]
+ expected: FAIL
+
+ [tr.vAlign: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [tr.vAlign: IDL set to NaN]
+ expected: FAIL
+
+ [tr.vAlign: IDL set to Infinity]
+ expected: FAIL
+
+ [tr.vAlign: IDL set to -Infinity]
+ expected: FAIL
+
+ [tr.vAlign: IDL set to "\\0"]
+ expected: FAIL
+
+ [tr.vAlign: IDL set to null]
+ expected: FAIL
+
+ [tr.vAlign: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [tr.vAlign: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [td.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [td.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [td.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [td.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [td.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [td.dir: setAttribute() to true]
+ expected: FAIL
+
+ [td.dir: setAttribute() to false]
+ expected: FAIL
+
+ [td.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [td.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [td.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [td.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [td.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [td.dir: setAttribute() to null]
+ expected: FAIL
+
+ [td.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [td.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [td.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [td.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [td.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [td.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [td.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [td.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [td.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [td.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [td.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [td.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [td.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [td.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [td.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [td.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [td.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [td.dir: IDL set to ""]
+ expected: FAIL
+
+ [td.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [td.dir: IDL set to undefined]
+ expected: FAIL
+
+ [td.dir: IDL set to 7]
+ expected: FAIL
+
+ [td.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [td.dir: IDL set to true]
+ expected: FAIL
+
+ [td.dir: IDL set to false]
+ expected: FAIL
+
+ [td.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [td.dir: IDL set to NaN]
+ expected: FAIL
+
+ [td.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [td.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [td.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [td.dir: IDL set to null]
+ expected: FAIL
+
+ [td.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [td.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [td.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [td.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [td.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [td.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [td.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [td.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [td.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [td.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [td.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [td.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [td.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [td.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [td.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [td.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [td.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [td.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [td.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [td.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [td.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [td.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [td.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [td.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [td.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [td.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [td.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [td.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [td.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [td.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [td.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [td.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [td.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [td.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [td.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [td.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [td.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [td.accessKey: IDL set to true]
+ expected: FAIL
+
+ [td.accessKey: IDL set to false]
+ expected: FAIL
+
+ [td.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [td.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [td.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [td.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [td.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [td.accessKey: IDL set to null]
+ expected: FAIL
+
+ [td.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [td.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [td.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [td.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [td.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [td.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [td.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [td.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [td.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [td.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [td.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [td.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [td.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [td.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [td.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [td.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [td.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [td.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [td.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [td.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [td.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [td.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [td.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [td.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [td.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to -2147483649]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to -36]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to -1]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to 0]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to 1]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to 257]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to 2147483648]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to 4294967295]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to 4294967296]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to ""]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to "-1"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to "-0"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to "0"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to "1"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to "\\v7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to "7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to "
7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to "
7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to "᠎7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to undefined]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to 1.5]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to true]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to false]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to NaN]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to Infinity]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to object "2"]
+ expected: FAIL
+
+ [td.rowSpan: setAttribute() to object "3"]
+ expected: FAIL
+
+ [td.rowSpan: IDL set to 0]
+ expected: FAIL
+
+ [td.rowSpan: IDL set to 1]
+ expected: FAIL
+
+ [td.rowSpan: IDL set to 257]
+ expected: FAIL
+
+ [td.rowSpan: IDL set to 2147483647]
+ expected: FAIL
+
+ [td.rowSpan: IDL set to "-0"]
+ expected: FAIL
+
+ [td.rowSpan: IDL set to 2147483648]
+ expected: FAIL
+
+ [td.rowSpan: IDL set to 4294967295]
+ expected: FAIL
+
+ [td.scope: setAttribute() to ""]
+ expected: FAIL
+
+ [td.scope: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [td.scope: setAttribute() to undefined]
+ expected: FAIL
+
+ [td.scope: setAttribute() to 7]
+ expected: FAIL
+
+ [td.scope: setAttribute() to 1.5]
+ expected: FAIL
+
+ [td.scope: setAttribute() to true]
+ expected: FAIL
+
+ [td.scope: setAttribute() to false]
+ expected: FAIL
+
+ [td.scope: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to NaN]
+ expected: FAIL
+
+ [td.scope: setAttribute() to Infinity]
+ expected: FAIL
+
+ [td.scope: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [td.scope: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to null]
+ expected: FAIL
+
+ [td.scope: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to "row"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to "xrow"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to "row\\0"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to "ow"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to "ROW"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to "col"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to "xcol"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to "col\\0"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to "ol"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to "COL"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to "rowgroup"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to "xrowgroup"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to "rowgroup\\0"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to "owgroup"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to "ROWGROUP"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to "colgroup"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to "xcolgroup"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to "colgroup\\0"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to "olgroup"]
+ expected: FAIL
+
+ [td.scope: setAttribute() to "COLGROUP"]
+ expected: FAIL
+
+ [td.scope: IDL set to ""]
+ expected: FAIL
+
+ [td.scope: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [td.scope: IDL set to undefined]
+ expected: FAIL
+
+ [td.scope: IDL set to 7]
+ expected: FAIL
+
+ [td.scope: IDL set to 1.5]
+ expected: FAIL
+
+ [td.scope: IDL set to true]
+ expected: FAIL
+
+ [td.scope: IDL set to false]
+ expected: FAIL
+
+ [td.scope: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [td.scope: IDL set to NaN]
+ expected: FAIL
+
+ [td.scope: IDL set to Infinity]
+ expected: FAIL
+
+ [td.scope: IDL set to -Infinity]
+ expected: FAIL
+
+ [td.scope: IDL set to "\\0"]
+ expected: FAIL
+
+ [td.scope: IDL set to null]
+ expected: FAIL
+
+ [td.scope: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [td.scope: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [td.scope: IDL set to "row"]
+ expected: FAIL
+
+ [td.scope: IDL set to "xrow"]
+ expected: FAIL
+
+ [td.scope: IDL set to "row\\0"]
+ expected: FAIL
+
+ [td.scope: IDL set to "ow"]
+ expected: FAIL
+
+ [td.scope: IDL set to "ROW"]
+ expected: FAIL
+
+ [td.scope: IDL set to "col"]
+ expected: FAIL
+
+ [td.scope: IDL set to "xcol"]
+ expected: FAIL
+
+ [td.scope: IDL set to "col\\0"]
+ expected: FAIL
+
+ [td.scope: IDL set to "ol"]
+ expected: FAIL
+
+ [td.scope: IDL set to "COL"]
+ expected: FAIL
+
+ [td.scope: IDL set to "rowgroup"]
+ expected: FAIL
+
+ [td.scope: IDL set to "xrowgroup"]
+ expected: FAIL
+
+ [td.scope: IDL set to "rowgroup\\0"]
+ expected: FAIL
+
+ [td.scope: IDL set to "owgroup"]
+ expected: FAIL
+
+ [td.scope: IDL set to "ROWGROUP"]
+ expected: FAIL
+
+ [td.scope: IDL set to "colgroup"]
+ expected: FAIL
+
+ [td.scope: IDL set to "xcolgroup"]
+ expected: FAIL
+
+ [td.scope: IDL set to "colgroup\\0"]
+ expected: FAIL
+
+ [td.scope: IDL set to "olgroup"]
+ expected: FAIL
+
+ [td.scope: IDL set to "COLGROUP"]
+ expected: FAIL
+
+ [td.abbr: setAttribute() to ""]
+ expected: FAIL
+
+ [td.abbr: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [td.abbr: setAttribute() to undefined]
+ expected: FAIL
+
+ [td.abbr: setAttribute() to 7]
+ expected: FAIL
+
+ [td.abbr: setAttribute() to 1.5]
+ expected: FAIL
+
+ [td.abbr: setAttribute() to true]
+ expected: FAIL
+
+ [td.abbr: setAttribute() to false]
+ expected: FAIL
+
+ [td.abbr: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [td.abbr: setAttribute() to NaN]
+ expected: FAIL
+
+ [td.abbr: setAttribute() to Infinity]
+ expected: FAIL
+
+ [td.abbr: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [td.abbr: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [td.abbr: setAttribute() to null]
+ expected: FAIL
+
+ [td.abbr: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [td.abbr: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [td.abbr: IDL set to ""]
+ expected: FAIL
+
+ [td.abbr: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [td.abbr: IDL set to undefined]
+ expected: FAIL
+
+ [td.abbr: IDL set to 7]
+ expected: FAIL
+
+ [td.abbr: IDL set to 1.5]
+ expected: FAIL
+
+ [td.abbr: IDL set to true]
+ expected: FAIL
+
+ [td.abbr: IDL set to false]
+ expected: FAIL
+
+ [td.abbr: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [td.abbr: IDL set to NaN]
+ expected: FAIL
+
+ [td.abbr: IDL set to Infinity]
+ expected: FAIL
+
+ [td.abbr: IDL set to -Infinity]
+ expected: FAIL
+
+ [td.abbr: IDL set to "\\0"]
+ expected: FAIL
+
+ [td.abbr: IDL set to null]
+ expected: FAIL
+
+ [td.abbr: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [td.abbr: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [td.align: setAttribute() to ""]
+ expected: FAIL
+
+ [td.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [td.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [td.align: setAttribute() to 7]
+ expected: FAIL
+
+ [td.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [td.align: setAttribute() to true]
+ expected: FAIL
+
+ [td.align: setAttribute() to false]
+ expected: FAIL
+
+ [td.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [td.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [td.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [td.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [td.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [td.align: setAttribute() to null]
+ expected: FAIL
+
+ [td.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [td.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [td.align: IDL set to ""]
+ expected: FAIL
+
+ [td.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [td.align: IDL set to undefined]
+ expected: FAIL
+
+ [td.align: IDL set to 7]
+ expected: FAIL
+
+ [td.align: IDL set to 1.5]
+ expected: FAIL
+
+ [td.align: IDL set to true]
+ expected: FAIL
+
+ [td.align: IDL set to false]
+ expected: FAIL
+
+ [td.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [td.align: IDL set to NaN]
+ expected: FAIL
+
+ [td.align: IDL set to Infinity]
+ expected: FAIL
+
+ [td.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [td.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [td.align: IDL set to null]
+ expected: FAIL
+
+ [td.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [td.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [td.axis: setAttribute() to ""]
+ expected: FAIL
+
+ [td.axis: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [td.axis: setAttribute() to undefined]
+ expected: FAIL
+
+ [td.axis: setAttribute() to 7]
+ expected: FAIL
+
+ [td.axis: setAttribute() to 1.5]
+ expected: FAIL
+
+ [td.axis: setAttribute() to true]
+ expected: FAIL
+
+ [td.axis: setAttribute() to false]
+ expected: FAIL
+
+ [td.axis: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [td.axis: setAttribute() to NaN]
+ expected: FAIL
+
+ [td.axis: setAttribute() to Infinity]
+ expected: FAIL
+
+ [td.axis: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [td.axis: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [td.axis: setAttribute() to null]
+ expected: FAIL
+
+ [td.axis: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [td.axis: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [td.axis: IDL set to ""]
+ expected: FAIL
+
+ [td.axis: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [td.axis: IDL set to undefined]
+ expected: FAIL
+
+ [td.axis: IDL set to 7]
+ expected: FAIL
+
+ [td.axis: IDL set to 1.5]
+ expected: FAIL
+
+ [td.axis: IDL set to true]
+ expected: FAIL
+
+ [td.axis: IDL set to false]
+ expected: FAIL
+
+ [td.axis: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [td.axis: IDL set to NaN]
+ expected: FAIL
+
+ [td.axis: IDL set to Infinity]
+ expected: FAIL
+
+ [td.axis: IDL set to -Infinity]
+ expected: FAIL
+
+ [td.axis: IDL set to "\\0"]
+ expected: FAIL
+
+ [td.axis: IDL set to null]
+ expected: FAIL
+
+ [td.axis: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [td.axis: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [td.height: setAttribute() to ""]
+ expected: FAIL
+
+ [td.height: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [td.height: setAttribute() to undefined]
+ expected: FAIL
+
+ [td.height: setAttribute() to 7]
+ expected: FAIL
+
+ [td.height: setAttribute() to 1.5]
+ expected: FAIL
+
+ [td.height: setAttribute() to true]
+ expected: FAIL
+
+ [td.height: setAttribute() to false]
+ expected: FAIL
+
+ [td.height: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [td.height: setAttribute() to NaN]
+ expected: FAIL
+
+ [td.height: setAttribute() to Infinity]
+ expected: FAIL
+
+ [td.height: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [td.height: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [td.height: setAttribute() to null]
+ expected: FAIL
+
+ [td.height: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [td.height: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [td.height: IDL set to ""]
+ expected: FAIL
+
+ [td.height: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [td.height: IDL set to undefined]
+ expected: FAIL
+
+ [td.height: IDL set to 7]
+ expected: FAIL
+
+ [td.height: IDL set to 1.5]
+ expected: FAIL
+
+ [td.height: IDL set to true]
+ expected: FAIL
+
+ [td.height: IDL set to false]
+ expected: FAIL
+
+ [td.height: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [td.height: IDL set to NaN]
+ expected: FAIL
+
+ [td.height: IDL set to Infinity]
+ expected: FAIL
+
+ [td.height: IDL set to -Infinity]
+ expected: FAIL
+
+ [td.height: IDL set to "\\0"]
+ expected: FAIL
+
+ [td.height: IDL set to null]
+ expected: FAIL
+
+ [td.height: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [td.height: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [td.ch (<td char>): setAttribute() to ""]
+ expected: FAIL
+
+ [td.ch (<td char>): setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [td.ch (<td char>): setAttribute() to undefined]
+ expected: FAIL
+
+ [td.ch (<td char>): setAttribute() to 7]
+ expected: FAIL
+
+ [td.ch (<td char>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [td.ch (<td char>): setAttribute() to true]
+ expected: FAIL
+
+ [td.ch (<td char>): setAttribute() to false]
+ expected: FAIL
+
+ [td.ch (<td char>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [td.ch (<td char>): setAttribute() to NaN]
+ expected: FAIL
+
+ [td.ch (<td char>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [td.ch (<td char>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [td.ch (<td char>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [td.ch (<td char>): setAttribute() to null]
+ expected: FAIL
+
+ [td.ch (<td char>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [td.ch (<td char>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [td.ch (<td char>): IDL set to ""]
+ expected: FAIL
+
+ [td.ch (<td char>): IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [td.ch (<td char>): IDL set to undefined]
+ expected: FAIL
+
+ [td.ch (<td char>): IDL set to 7]
+ expected: FAIL
+
+ [td.ch (<td char>): IDL set to 1.5]
+ expected: FAIL
+
+ [td.ch (<td char>): IDL set to true]
+ expected: FAIL
+
+ [td.ch (<td char>): IDL set to false]
+ expected: FAIL
+
+ [td.ch (<td char>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [td.ch (<td char>): IDL set to NaN]
+ expected: FAIL
+
+ [td.ch (<td char>): IDL set to Infinity]
+ expected: FAIL
+
+ [td.ch (<td char>): IDL set to -Infinity]
+ expected: FAIL
+
+ [td.ch (<td char>): IDL set to "\\0"]
+ expected: FAIL
+
+ [td.ch (<td char>): IDL set to null]
+ expected: FAIL
+
+ [td.ch (<td char>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [td.ch (<td char>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): setAttribute() to ""]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): setAttribute() to undefined]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): setAttribute() to 7]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): setAttribute() to true]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): setAttribute() to false]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): setAttribute() to NaN]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): setAttribute() to null]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): IDL set to ""]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): IDL set to undefined]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): IDL set to 7]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): IDL set to 1.5]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): IDL set to true]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): IDL set to false]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): IDL set to NaN]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): IDL set to Infinity]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): IDL set to -Infinity]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): IDL set to "\\0"]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): IDL set to null]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [td.chOff (<td charoff>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [td.noWrap: setAttribute() to ""]
+ expected: FAIL
+
+ [td.noWrap: setAttribute() to " foo "]
+ expected: FAIL
+
+ [td.noWrap: setAttribute() to undefined]
+ expected: FAIL
+
+ [td.noWrap: setAttribute() to null]
+ expected: FAIL
+
+ [td.noWrap: setAttribute() to 7]
+ expected: FAIL
+
+ [td.noWrap: setAttribute() to 1.5]
+ expected: FAIL
+
+ [td.noWrap: setAttribute() to true]
+ expected: FAIL
+
+ [td.noWrap: setAttribute() to false]
+ expected: FAIL
+
+ [td.noWrap: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [td.noWrap: setAttribute() to NaN]
+ expected: FAIL
+
+ [td.noWrap: setAttribute() to Infinity]
+ expected: FAIL
+
+ [td.noWrap: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [td.noWrap: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [td.noWrap: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [td.noWrap: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [td.noWrap: setAttribute() to "noWrap"]
+ expected: FAIL
+
+ [td.noWrap: IDL set to ""]
+ expected: FAIL
+
+ [td.noWrap: IDL set to " foo "]
+ expected: FAIL
+
+ [td.noWrap: IDL set to undefined]
+ expected: FAIL
+
+ [td.noWrap: IDL set to null]
+ expected: FAIL
+
+ [td.noWrap: IDL set to 7]
+ expected: FAIL
+
+ [td.noWrap: IDL set to 1.5]
+ expected: FAIL
+
+ [td.noWrap: IDL set to false]
+ expected: FAIL
+
+ [td.noWrap: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [td.noWrap: IDL set to NaN]
+ expected: FAIL
+
+ [td.noWrap: IDL set to Infinity]
+ expected: FAIL
+
+ [td.noWrap: IDL set to -Infinity]
+ expected: FAIL
+
+ [td.noWrap: IDL set to "\\0"]
+ expected: FAIL
+
+ [td.noWrap: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [td.noWrap: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [td.vAlign: setAttribute() to ""]
+ expected: FAIL
+
+ [td.vAlign: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [td.vAlign: setAttribute() to undefined]
+ expected: FAIL
+
+ [td.vAlign: setAttribute() to 7]
+ expected: FAIL
+
+ [td.vAlign: setAttribute() to 1.5]
+ expected: FAIL
+
+ [td.vAlign: setAttribute() to true]
+ expected: FAIL
+
+ [td.vAlign: setAttribute() to false]
+ expected: FAIL
+
+ [td.vAlign: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [td.vAlign: setAttribute() to NaN]
+ expected: FAIL
+
+ [td.vAlign: setAttribute() to Infinity]
+ expected: FAIL
+
+ [td.vAlign: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [td.vAlign: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [td.vAlign: setAttribute() to null]
+ expected: FAIL
+
+ [td.vAlign: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [td.vAlign: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [td.vAlign: IDL set to ""]
+ expected: FAIL
+
+ [td.vAlign: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [td.vAlign: IDL set to undefined]
+ expected: FAIL
+
+ [td.vAlign: IDL set to 7]
+ expected: FAIL
+
+ [td.vAlign: IDL set to 1.5]
+ expected: FAIL
+
+ [td.vAlign: IDL set to true]
+ expected: FAIL
+
+ [td.vAlign: IDL set to false]
+ expected: FAIL
+
+ [td.vAlign: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [td.vAlign: IDL set to NaN]
+ expected: FAIL
+
+ [td.vAlign: IDL set to Infinity]
+ expected: FAIL
+
+ [td.vAlign: IDL set to -Infinity]
+ expected: FAIL
+
+ [td.vAlign: IDL set to "\\0"]
+ expected: FAIL
+
+ [td.vAlign: IDL set to null]
+ expected: FAIL
+
+ [td.vAlign: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [td.vAlign: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [th.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [th.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [th.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [th.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [th.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [th.dir: setAttribute() to true]
+ expected: FAIL
+
+ [th.dir: setAttribute() to false]
+ expected: FAIL
+
+ [th.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [th.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [th.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [th.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [th.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [th.dir: setAttribute() to null]
+ expected: FAIL
+
+ [th.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [th.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [th.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [th.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [th.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [th.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [th.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [th.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [th.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [th.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [th.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [th.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [th.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [th.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [th.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [th.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [th.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [th.dir: IDL set to ""]
+ expected: FAIL
+
+ [th.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [th.dir: IDL set to undefined]
+ expected: FAIL
+
+ [th.dir: IDL set to 7]
+ expected: FAIL
+
+ [th.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [th.dir: IDL set to true]
+ expected: FAIL
+
+ [th.dir: IDL set to false]
+ expected: FAIL
+
+ [th.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [th.dir: IDL set to NaN]
+ expected: FAIL
+
+ [th.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [th.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [th.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [th.dir: IDL set to null]
+ expected: FAIL
+
+ [th.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [th.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [th.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [th.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [th.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [th.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [th.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [th.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [th.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [th.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [th.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [th.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [th.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [th.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [th.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [th.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [th.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [th.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [th.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [th.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [th.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [th.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [th.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [th.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [th.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [th.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [th.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [th.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [th.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [th.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [th.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [th.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [th.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [th.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [th.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [th.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [th.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [th.accessKey: IDL set to true]
+ expected: FAIL
+
+ [th.accessKey: IDL set to false]
+ expected: FAIL
+
+ [th.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [th.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [th.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [th.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [th.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [th.accessKey: IDL set to null]
+ expected: FAIL
+
+ [th.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [th.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [th.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [th.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [th.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [th.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [th.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [th.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [th.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [th.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [th.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [th.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [th.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [th.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [th.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [th.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [th.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [th.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [th.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [th.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [th.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [th.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [th.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [th.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [th.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to -2147483649]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to -36]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to -1]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to 0]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to 1]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to 257]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to 2147483648]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to 4294967295]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to 4294967296]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to ""]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to "-1"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to "-0"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to "0"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to "1"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to "\\v7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to "7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to "
7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to "
7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to "᠎7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to " 7"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to undefined]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to 1.5]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to true]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to false]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to NaN]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to Infinity]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to object "2"]
+ expected: FAIL
+
+ [th.rowSpan: setAttribute() to object "3"]
+ expected: FAIL
+
+ [th.rowSpan: IDL set to 0]
+ expected: FAIL
+
+ [th.rowSpan: IDL set to 1]
+ expected: FAIL
+
+ [th.rowSpan: IDL set to 257]
+ expected: FAIL
+
+ [th.rowSpan: IDL set to 2147483647]
+ expected: FAIL
+
+ [th.rowSpan: IDL set to "-0"]
+ expected: FAIL
+
+ [th.rowSpan: IDL set to 2147483648]
+ expected: FAIL
+
+ [th.rowSpan: IDL set to 4294967295]
+ expected: FAIL
+
+ [th.scope: setAttribute() to ""]
+ expected: FAIL
+
+ [th.scope: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [th.scope: setAttribute() to undefined]
+ expected: FAIL
+
+ [th.scope: setAttribute() to 7]
+ expected: FAIL
+
+ [th.scope: setAttribute() to 1.5]
+ expected: FAIL
+
+ [th.scope: setAttribute() to true]
+ expected: FAIL
+
+ [th.scope: setAttribute() to false]
+ expected: FAIL
+
+ [th.scope: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to NaN]
+ expected: FAIL
+
+ [th.scope: setAttribute() to Infinity]
+ expected: FAIL
+
+ [th.scope: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [th.scope: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to null]
+ expected: FAIL
+
+ [th.scope: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to "row"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to "xrow"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to "row\\0"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to "ow"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to "ROW"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to "col"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to "xcol"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to "col\\0"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to "ol"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to "COL"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to "rowgroup"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to "xrowgroup"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to "rowgroup\\0"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to "owgroup"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to "ROWGROUP"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to "colgroup"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to "xcolgroup"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to "colgroup\\0"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to "olgroup"]
+ expected: FAIL
+
+ [th.scope: setAttribute() to "COLGROUP"]
+ expected: FAIL
+
+ [th.scope: IDL set to ""]
+ expected: FAIL
+
+ [th.scope: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [th.scope: IDL set to undefined]
+ expected: FAIL
+
+ [th.scope: IDL set to 7]
+ expected: FAIL
+
+ [th.scope: IDL set to 1.5]
+ expected: FAIL
+
+ [th.scope: IDL set to true]
+ expected: FAIL
+
+ [th.scope: IDL set to false]
+ expected: FAIL
+
+ [th.scope: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [th.scope: IDL set to NaN]
+ expected: FAIL
+
+ [th.scope: IDL set to Infinity]
+ expected: FAIL
+
+ [th.scope: IDL set to -Infinity]
+ expected: FAIL
+
+ [th.scope: IDL set to "\\0"]
+ expected: FAIL
+
+ [th.scope: IDL set to null]
+ expected: FAIL
+
+ [th.scope: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [th.scope: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [th.scope: IDL set to "row"]
+ expected: FAIL
+
+ [th.scope: IDL set to "xrow"]
+ expected: FAIL
+
+ [th.scope: IDL set to "row\\0"]
+ expected: FAIL
+
+ [th.scope: IDL set to "ow"]
+ expected: FAIL
+
+ [th.scope: IDL set to "ROW"]
+ expected: FAIL
+
+ [th.scope: IDL set to "col"]
+ expected: FAIL
+
+ [th.scope: IDL set to "xcol"]
+ expected: FAIL
+
+ [th.scope: IDL set to "col\\0"]
+ expected: FAIL
+
+ [th.scope: IDL set to "ol"]
+ expected: FAIL
+
+ [th.scope: IDL set to "COL"]
+ expected: FAIL
+
+ [th.scope: IDL set to "rowgroup"]
+ expected: FAIL
+
+ [th.scope: IDL set to "xrowgroup"]
+ expected: FAIL
+
+ [th.scope: IDL set to "rowgroup\\0"]
+ expected: FAIL
+
+ [th.scope: IDL set to "owgroup"]
+ expected: FAIL
+
+ [th.scope: IDL set to "ROWGROUP"]
+ expected: FAIL
+
+ [th.scope: IDL set to "colgroup"]
+ expected: FAIL
+
+ [th.scope: IDL set to "xcolgroup"]
+ expected: FAIL
+
+ [th.scope: IDL set to "colgroup\\0"]
+ expected: FAIL
+
+ [th.scope: IDL set to "olgroup"]
+ expected: FAIL
+
+ [th.scope: IDL set to "COLGROUP"]
+ expected: FAIL
+
+ [th.abbr: setAttribute() to ""]
+ expected: FAIL
+
+ [th.abbr: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [th.abbr: setAttribute() to undefined]
+ expected: FAIL
+
+ [th.abbr: setAttribute() to 7]
+ expected: FAIL
+
+ [th.abbr: setAttribute() to 1.5]
+ expected: FAIL
+
+ [th.abbr: setAttribute() to true]
+ expected: FAIL
+
+ [th.abbr: setAttribute() to false]
+ expected: FAIL
+
+ [th.abbr: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [th.abbr: setAttribute() to NaN]
+ expected: FAIL
+
+ [th.abbr: setAttribute() to Infinity]
+ expected: FAIL
+
+ [th.abbr: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [th.abbr: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [th.abbr: setAttribute() to null]
+ expected: FAIL
+
+ [th.abbr: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [th.abbr: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [th.abbr: IDL set to ""]
+ expected: FAIL
+
+ [th.abbr: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [th.abbr: IDL set to undefined]
+ expected: FAIL
+
+ [th.abbr: IDL set to 7]
+ expected: FAIL
+
+ [th.abbr: IDL set to 1.5]
+ expected: FAIL
+
+ [th.abbr: IDL set to true]
+ expected: FAIL
+
+ [th.abbr: IDL set to false]
+ expected: FAIL
+
+ [th.abbr: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [th.abbr: IDL set to NaN]
+ expected: FAIL
+
+ [th.abbr: IDL set to Infinity]
+ expected: FAIL
+
+ [th.abbr: IDL set to -Infinity]
+ expected: FAIL
+
+ [th.abbr: IDL set to "\\0"]
+ expected: FAIL
+
+ [th.abbr: IDL set to null]
+ expected: FAIL
+
+ [th.abbr: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [th.abbr: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [th.align: setAttribute() to ""]
+ expected: FAIL
+
+ [th.align: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [th.align: setAttribute() to undefined]
+ expected: FAIL
+
+ [th.align: setAttribute() to 7]
+ expected: FAIL
+
+ [th.align: setAttribute() to 1.5]
+ expected: FAIL
+
+ [th.align: setAttribute() to true]
+ expected: FAIL
+
+ [th.align: setAttribute() to false]
+ expected: FAIL
+
+ [th.align: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [th.align: setAttribute() to NaN]
+ expected: FAIL
+
+ [th.align: setAttribute() to Infinity]
+ expected: FAIL
+
+ [th.align: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [th.align: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [th.align: setAttribute() to null]
+ expected: FAIL
+
+ [th.align: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [th.align: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [th.align: IDL set to ""]
+ expected: FAIL
+
+ [th.align: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [th.align: IDL set to undefined]
+ expected: FAIL
+
+ [th.align: IDL set to 7]
+ expected: FAIL
+
+ [th.align: IDL set to 1.5]
+ expected: FAIL
+
+ [th.align: IDL set to true]
+ expected: FAIL
+
+ [th.align: IDL set to false]
+ expected: FAIL
+
+ [th.align: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [th.align: IDL set to NaN]
+ expected: FAIL
+
+ [th.align: IDL set to Infinity]
+ expected: FAIL
+
+ [th.align: IDL set to -Infinity]
+ expected: FAIL
+
+ [th.align: IDL set to "\\0"]
+ expected: FAIL
+
+ [th.align: IDL set to null]
+ expected: FAIL
+
+ [th.align: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [th.align: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [th.axis: setAttribute() to ""]
+ expected: FAIL
+
+ [th.axis: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [th.axis: setAttribute() to undefined]
+ expected: FAIL
+
+ [th.axis: setAttribute() to 7]
+ expected: FAIL
+
+ [th.axis: setAttribute() to 1.5]
+ expected: FAIL
+
+ [th.axis: setAttribute() to true]
+ expected: FAIL
+
+ [th.axis: setAttribute() to false]
+ expected: FAIL
+
+ [th.axis: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [th.axis: setAttribute() to NaN]
+ expected: FAIL
+
+ [th.axis: setAttribute() to Infinity]
+ expected: FAIL
+
+ [th.axis: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [th.axis: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [th.axis: setAttribute() to null]
+ expected: FAIL
+
+ [th.axis: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [th.axis: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [th.axis: IDL set to ""]
+ expected: FAIL
+
+ [th.axis: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [th.axis: IDL set to undefined]
+ expected: FAIL
+
+ [th.axis: IDL set to 7]
+ expected: FAIL
+
+ [th.axis: IDL set to 1.5]
+ expected: FAIL
+
+ [th.axis: IDL set to true]
+ expected: FAIL
+
+ [th.axis: IDL set to false]
+ expected: FAIL
+
+ [th.axis: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [th.axis: IDL set to NaN]
+ expected: FAIL
+
+ [th.axis: IDL set to Infinity]
+ expected: FAIL
+
+ [th.axis: IDL set to -Infinity]
+ expected: FAIL
+
+ [th.axis: IDL set to "\\0"]
+ expected: FAIL
+
+ [th.axis: IDL set to null]
+ expected: FAIL
+
+ [th.axis: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [th.axis: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [th.height: setAttribute() to ""]
+ expected: FAIL
+
+ [th.height: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [th.height: setAttribute() to undefined]
+ expected: FAIL
+
+ [th.height: setAttribute() to 7]
+ expected: FAIL
+
+ [th.height: setAttribute() to 1.5]
+ expected: FAIL
+
+ [th.height: setAttribute() to true]
+ expected: FAIL
+
+ [th.height: setAttribute() to false]
+ expected: FAIL
+
+ [th.height: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [th.height: setAttribute() to NaN]
+ expected: FAIL
+
+ [th.height: setAttribute() to Infinity]
+ expected: FAIL
+
+ [th.height: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [th.height: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [th.height: setAttribute() to null]
+ expected: FAIL
+
+ [th.height: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [th.height: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [th.height: IDL set to ""]
+ expected: FAIL
+
+ [th.height: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [th.height: IDL set to undefined]
+ expected: FAIL
+
+ [th.height: IDL set to 7]
+ expected: FAIL
+
+ [th.height: IDL set to 1.5]
+ expected: FAIL
+
+ [th.height: IDL set to true]
+ expected: FAIL
+
+ [th.height: IDL set to false]
+ expected: FAIL
+
+ [th.height: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [th.height: IDL set to NaN]
+ expected: FAIL
+
+ [th.height: IDL set to Infinity]
+ expected: FAIL
+
+ [th.height: IDL set to -Infinity]
+ expected: FAIL
+
+ [th.height: IDL set to "\\0"]
+ expected: FAIL
+
+ [th.height: IDL set to null]
+ expected: FAIL
+
+ [th.height: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [th.height: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [th.ch (<th char>): setAttribute() to ""]
+ expected: FAIL
+
+ [th.ch (<th char>): setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [th.ch (<th char>): setAttribute() to undefined]
+ expected: FAIL
+
+ [th.ch (<th char>): setAttribute() to 7]
+ expected: FAIL
+
+ [th.ch (<th char>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [th.ch (<th char>): setAttribute() to true]
+ expected: FAIL
+
+ [th.ch (<th char>): setAttribute() to false]
+ expected: FAIL
+
+ [th.ch (<th char>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [th.ch (<th char>): setAttribute() to NaN]
+ expected: FAIL
+
+ [th.ch (<th char>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [th.ch (<th char>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [th.ch (<th char>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [th.ch (<th char>): setAttribute() to null]
+ expected: FAIL
+
+ [th.ch (<th char>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [th.ch (<th char>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [th.ch (<th char>): IDL set to ""]
+ expected: FAIL
+
+ [th.ch (<th char>): IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [th.ch (<th char>): IDL set to undefined]
+ expected: FAIL
+
+ [th.ch (<th char>): IDL set to 7]
+ expected: FAIL
+
+ [th.ch (<th char>): IDL set to 1.5]
+ expected: FAIL
+
+ [th.ch (<th char>): IDL set to true]
+ expected: FAIL
+
+ [th.ch (<th char>): IDL set to false]
+ expected: FAIL
+
+ [th.ch (<th char>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [th.ch (<th char>): IDL set to NaN]
+ expected: FAIL
+
+ [th.ch (<th char>): IDL set to Infinity]
+ expected: FAIL
+
+ [th.ch (<th char>): IDL set to -Infinity]
+ expected: FAIL
+
+ [th.ch (<th char>): IDL set to "\\0"]
+ expected: FAIL
+
+ [th.ch (<th char>): IDL set to null]
+ expected: FAIL
+
+ [th.ch (<th char>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [th.ch (<th char>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): setAttribute() to ""]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): setAttribute() to undefined]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): setAttribute() to 7]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): setAttribute() to 1.5]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): setAttribute() to true]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): setAttribute() to false]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): setAttribute() to NaN]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): setAttribute() to Infinity]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): setAttribute() to -Infinity]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): setAttribute() to "\\0"]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): setAttribute() to null]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): IDL set to ""]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): IDL set to undefined]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): IDL set to 7]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): IDL set to 1.5]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): IDL set to true]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): IDL set to false]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): IDL set to NaN]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): IDL set to Infinity]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): IDL set to -Infinity]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): IDL set to "\\0"]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): IDL set to null]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): IDL set to object "test-toString"]
+ expected: FAIL
+
+ [th.chOff (<th charoff>): IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [th.noWrap: setAttribute() to ""]
+ expected: FAIL
+
+ [th.noWrap: setAttribute() to " foo "]
+ expected: FAIL
+
+ [th.noWrap: setAttribute() to undefined]
+ expected: FAIL
+
+ [th.noWrap: setAttribute() to null]
+ expected: FAIL
+
+ [th.noWrap: setAttribute() to 7]
+ expected: FAIL
+
+ [th.noWrap: setAttribute() to 1.5]
+ expected: FAIL
+
+ [th.noWrap: setAttribute() to true]
+ expected: FAIL
+
+ [th.noWrap: setAttribute() to false]
+ expected: FAIL
+
+ [th.noWrap: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [th.noWrap: setAttribute() to NaN]
+ expected: FAIL
+
+ [th.noWrap: setAttribute() to Infinity]
+ expected: FAIL
+
+ [th.noWrap: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [th.noWrap: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [th.noWrap: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [th.noWrap: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [th.noWrap: setAttribute() to "noWrap"]
+ expected: FAIL
+
+ [th.noWrap: IDL set to ""]
+ expected: FAIL
+
+ [th.noWrap: IDL set to " foo "]
+ expected: FAIL
+
+ [th.noWrap: IDL set to undefined]
+ expected: FAIL
+
+ [th.noWrap: IDL set to null]
+ expected: FAIL
+
+ [th.noWrap: IDL set to 7]
+ expected: FAIL
+
+ [th.noWrap: IDL set to 1.5]
+ expected: FAIL
+
+ [th.noWrap: IDL set to false]
+ expected: FAIL
+
+ [th.noWrap: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [th.noWrap: IDL set to NaN]
+ expected: FAIL
+
+ [th.noWrap: IDL set to Infinity]
+ expected: FAIL
+
+ [th.noWrap: IDL set to -Infinity]
+ expected: FAIL
+
+ [th.noWrap: IDL set to "\\0"]
+ expected: FAIL
+
+ [th.noWrap: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [th.noWrap: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [th.vAlign: setAttribute() to ""]
+ expected: FAIL
+
+ [th.vAlign: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [th.vAlign: setAttribute() to undefined]
+ expected: FAIL
+
+ [th.vAlign: setAttribute() to 7]
+ expected: FAIL
+
+ [th.vAlign: setAttribute() to 1.5]
+ expected: FAIL
+
+ [th.vAlign: setAttribute() to true]
+ expected: FAIL
+
+ [th.vAlign: setAttribute() to false]
+ expected: FAIL
+
+ [th.vAlign: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [th.vAlign: setAttribute() to NaN]
+ expected: FAIL
+
+ [th.vAlign: setAttribute() to Infinity]
+ expected: FAIL
+
+ [th.vAlign: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [th.vAlign: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [th.vAlign: setAttribute() to null]
+ expected: FAIL
+
+ [th.vAlign: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [th.vAlign: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [th.vAlign: IDL set to ""]
+ expected: FAIL
+
+ [th.vAlign: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [th.vAlign: IDL set to undefined]
+ expected: FAIL
+
+ [th.vAlign: IDL set to 7]
+ expected: FAIL
+
+ [th.vAlign: IDL set to 1.5]
+ expected: FAIL
+
+ [th.vAlign: IDL set to true]
+ expected: FAIL
+
+ [th.vAlign: IDL set to false]
+ expected: FAIL
+
+ [th.vAlign: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [th.vAlign: IDL set to NaN]
+ expected: FAIL
+
+ [th.vAlign: IDL set to Infinity]
+ expected: FAIL
+
+ [th.vAlign: IDL set to -Infinity]
+ expected: FAIL
+
+ [th.vAlign: IDL set to "\\0"]
+ expected: FAIL
+
+ [th.vAlign: IDL set to null]
+ expected: FAIL
+
+ [th.vAlign: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [th.vAlign: IDL set to object "test-valueOf"]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/dom/reflection-text.html.ini b/tests/wpt/metadata/html/dom/reflection-text.html.ini
index 741a0ffbbbf..df94215cfa9 100644
--- a/tests/wpt/metadata/html/dom/reflection-text.html.ini
+++ b/tests/wpt/metadata/html/dom/reflection-text.html.ini
@@ -24411,3 +24411,10662 @@
[a.ping: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo " followed by getAttribute()]
expected: FAIL
+ [a.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [a.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [a.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [a.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [a.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [a.dir: setAttribute() to true]
+ expected: FAIL
+
+ [a.dir: setAttribute() to false]
+ expected: FAIL
+
+ [a.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [a.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [a.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [a.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [a.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [a.dir: setAttribute() to null]
+ expected: FAIL
+
+ [a.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [a.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [a.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [a.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [a.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [a.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [a.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [a.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [a.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [a.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [a.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [a.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [a.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [a.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [a.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [a.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [a.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [a.dir: IDL set to ""]
+ expected: FAIL
+
+ [a.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [a.dir: IDL set to undefined]
+ expected: FAIL
+
+ [a.dir: IDL set to 7]
+ expected: FAIL
+
+ [a.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [a.dir: IDL set to true]
+ expected: FAIL
+
+ [a.dir: IDL set to false]
+ expected: FAIL
+
+ [a.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [a.dir: IDL set to NaN]
+ expected: FAIL
+
+ [a.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [a.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [a.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [a.dir: IDL set to null]
+ expected: FAIL
+
+ [a.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [a.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [a.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [a.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [a.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [a.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [a.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [a.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [a.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [a.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [a.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [a.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [a.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [a.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [a.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [a.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [a.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [a.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [a.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [a.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [a.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [a.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [a.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [a.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [a.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [a.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [a.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [a.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [a.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [a.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [a.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [a.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [a.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [a.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [a.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [a.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [a.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [a.accessKey: IDL set to true]
+ expected: FAIL
+
+ [a.accessKey: IDL set to false]
+ expected: FAIL
+
+ [a.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [a.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [a.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [a.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [a.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [a.accessKey: IDL set to null]
+ expected: FAIL
+
+ [a.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [a.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [a.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [a.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [a.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [a.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [a.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [a.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [a.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [a.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [a.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [a.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [a.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [a.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [a.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [a.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [a.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [a.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [a.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [a.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [a.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [a.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [a.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [a.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [a.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [a.download: setAttribute() to ""]
+ expected: FAIL
+
+ [a.download: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [a.download: setAttribute() to undefined]
+ expected: FAIL
+
+ [a.download: setAttribute() to 7]
+ expected: FAIL
+
+ [a.download: setAttribute() to 1.5]
+ expected: FAIL
+
+ [a.download: setAttribute() to true]
+ expected: FAIL
+
+ [a.download: setAttribute() to false]
+ expected: FAIL
+
+ [a.download: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [a.download: setAttribute() to NaN]
+ expected: FAIL
+
+ [a.download: setAttribute() to Infinity]
+ expected: FAIL
+
+ [a.download: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [a.download: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [a.download: setAttribute() to null]
+ expected: FAIL
+
+ [a.download: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [a.download: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [a.download: IDL set to ""]
+ expected: FAIL
+
+ [a.download: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [a.download: IDL set to undefined]
+ expected: FAIL
+
+ [a.download: IDL set to 7]
+ expected: FAIL
+
+ [a.download: IDL set to 1.5]
+ expected: FAIL
+
+ [a.download: IDL set to true]
+ expected: FAIL
+
+ [a.download: IDL set to false]
+ expected: FAIL
+
+ [a.download: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [a.download: IDL set to NaN]
+ expected: FAIL
+
+ [a.download: IDL set to Infinity]
+ expected: FAIL
+
+ [a.download: IDL set to -Infinity]
+ expected: FAIL
+
+ [a.download: IDL set to "\\0"]
+ expected: FAIL
+
+ [a.download: IDL set to null]
+ expected: FAIL
+
+ [a.download: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [a.download: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [a.ping: setAttribute() to ""]
+ expected: FAIL
+
+ [a.ping: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [a.ping: setAttribute() to undefined]
+ expected: FAIL
+
+ [a.ping: setAttribute() to 7]
+ expected: FAIL
+
+ [a.ping: setAttribute() to 1.5]
+ expected: FAIL
+
+ [a.ping: setAttribute() to true]
+ expected: FAIL
+
+ [a.ping: setAttribute() to false]
+ expected: FAIL
+
+ [a.ping: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [a.ping: setAttribute() to NaN]
+ expected: FAIL
+
+ [a.ping: setAttribute() to Infinity]
+ expected: FAIL
+
+ [a.ping: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [a.ping: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [a.ping: setAttribute() to null]
+ expected: FAIL
+
+ [a.ping: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [a.ping: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [a.ping: IDL set to ""]
+ expected: FAIL
+
+ [a.ping: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [a.ping: IDL set to undefined]
+ expected: FAIL
+
+ [a.ping: IDL set to 7]
+ expected: FAIL
+
+ [a.ping: IDL set to 1.5]
+ expected: FAIL
+
+ [a.ping: IDL set to true]
+ expected: FAIL
+
+ [a.ping: IDL set to false]
+ expected: FAIL
+
+ [a.ping: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [a.ping: IDL set to NaN]
+ expected: FAIL
+
+ [a.ping: IDL set to Infinity]
+ expected: FAIL
+
+ [a.ping: IDL set to -Infinity]
+ expected: FAIL
+
+ [a.ping: IDL set to "\\0"]
+ expected: FAIL
+
+ [a.ping: IDL set to null]
+ expected: FAIL
+
+ [a.ping: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [a.ping: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [a.rel: setAttribute() to ""]
+ expected: FAIL
+
+ [a.rel: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [a.rel: setAttribute() to undefined]
+ expected: FAIL
+
+ [a.rel: setAttribute() to 7]
+ expected: FAIL
+
+ [a.rel: setAttribute() to 1.5]
+ expected: FAIL
+
+ [a.rel: setAttribute() to true]
+ expected: FAIL
+
+ [a.rel: setAttribute() to false]
+ expected: FAIL
+
+ [a.rel: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [a.rel: setAttribute() to NaN]
+ expected: FAIL
+
+ [a.rel: setAttribute() to Infinity]
+ expected: FAIL
+
+ [a.rel: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [a.rel: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [a.rel: setAttribute() to null]
+ expected: FAIL
+
+ [a.rel: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [a.rel: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [a.rel: IDL set to ""]
+ expected: FAIL
+
+ [a.rel: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [a.rel: IDL set to undefined]
+ expected: FAIL
+
+ [a.rel: IDL set to 7]
+ expected: FAIL
+
+ [a.rel: IDL set to 1.5]
+ expected: FAIL
+
+ [a.rel: IDL set to true]
+ expected: FAIL
+
+ [a.rel: IDL set to false]
+ expected: FAIL
+
+ [a.rel: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [a.rel: IDL set to NaN]
+ expected: FAIL
+
+ [a.rel: IDL set to Infinity]
+ expected: FAIL
+
+ [a.rel: IDL set to -Infinity]
+ expected: FAIL
+
+ [a.rel: IDL set to "\\0"]
+ expected: FAIL
+
+ [a.rel: IDL set to null]
+ expected: FAIL
+
+ [a.rel: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [a.rel: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [a.hreflang: setAttribute() to ""]
+ expected: FAIL
+
+ [a.hreflang: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [a.hreflang: setAttribute() to undefined]
+ expected: FAIL
+
+ [a.hreflang: setAttribute() to 7]
+ expected: FAIL
+
+ [a.hreflang: setAttribute() to 1.5]
+ expected: FAIL
+
+ [a.hreflang: setAttribute() to true]
+ expected: FAIL
+
+ [a.hreflang: setAttribute() to false]
+ expected: FAIL
+
+ [a.hreflang: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [a.hreflang: setAttribute() to NaN]
+ expected: FAIL
+
+ [a.hreflang: setAttribute() to Infinity]
+ expected: FAIL
+
+ [a.hreflang: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [a.hreflang: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [a.hreflang: setAttribute() to null]
+ expected: FAIL
+
+ [a.hreflang: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [a.hreflang: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [a.hreflang: IDL set to ""]
+ expected: FAIL
+
+ [a.hreflang: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [a.hreflang: IDL set to undefined]
+ expected: FAIL
+
+ [a.hreflang: IDL set to 7]
+ expected: FAIL
+
+ [a.hreflang: IDL set to 1.5]
+ expected: FAIL
+
+ [a.hreflang: IDL set to true]
+ expected: FAIL
+
+ [a.hreflang: IDL set to false]
+ expected: FAIL
+
+ [a.hreflang: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [a.hreflang: IDL set to NaN]
+ expected: FAIL
+
+ [a.hreflang: IDL set to Infinity]
+ expected: FAIL
+
+ [a.hreflang: IDL set to -Infinity]
+ expected: FAIL
+
+ [a.hreflang: IDL set to "\\0"]
+ expected: FAIL
+
+ [a.hreflang: IDL set to null]
+ expected: FAIL
+
+ [a.hreflang: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [a.hreflang: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [a.type: setAttribute() to ""]
+ expected: FAIL
+
+ [a.type: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [a.type: setAttribute() to undefined]
+ expected: FAIL
+
+ [a.type: setAttribute() to 7]
+ expected: FAIL
+
+ [a.type: setAttribute() to 1.5]
+ expected: FAIL
+
+ [a.type: setAttribute() to true]
+ expected: FAIL
+
+ [a.type: setAttribute() to false]
+ expected: FAIL
+
+ [a.type: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [a.type: setAttribute() to NaN]
+ expected: FAIL
+
+ [a.type: setAttribute() to Infinity]
+ expected: FAIL
+
+ [a.type: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [a.type: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [a.type: setAttribute() to null]
+ expected: FAIL
+
+ [a.type: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [a.type: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [a.type: IDL set to ""]
+ expected: FAIL
+
+ [a.type: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [a.type: IDL set to undefined]
+ expected: FAIL
+
+ [a.type: IDL set to 7]
+ expected: FAIL
+
+ [a.type: IDL set to 1.5]
+ expected: FAIL
+
+ [a.type: IDL set to true]
+ expected: FAIL
+
+ [a.type: IDL set to false]
+ expected: FAIL
+
+ [a.type: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [a.type: IDL set to NaN]
+ expected: FAIL
+
+ [a.type: IDL set to Infinity]
+ expected: FAIL
+
+ [a.type: IDL set to -Infinity]
+ expected: FAIL
+
+ [a.type: IDL set to "\\0"]
+ expected: FAIL
+
+ [a.type: IDL set to null]
+ expected: FAIL
+
+ [a.type: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [a.type: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [a.charset: setAttribute() to ""]
+ expected: FAIL
+
+ [a.charset: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [a.charset: setAttribute() to undefined]
+ expected: FAIL
+
+ [a.charset: setAttribute() to 7]
+ expected: FAIL
+
+ [a.charset: setAttribute() to 1.5]
+ expected: FAIL
+
+ [a.charset: setAttribute() to true]
+ expected: FAIL
+
+ [a.charset: setAttribute() to false]
+ expected: FAIL
+
+ [a.charset: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [a.charset: setAttribute() to NaN]
+ expected: FAIL
+
+ [a.charset: setAttribute() to Infinity]
+ expected: FAIL
+
+ [a.charset: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [a.charset: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [a.charset: setAttribute() to null]
+ expected: FAIL
+
+ [a.charset: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [a.charset: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [a.charset: IDL set to ""]
+ expected: FAIL
+
+ [a.charset: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [a.charset: IDL set to undefined]
+ expected: FAIL
+
+ [a.charset: IDL set to 7]
+ expected: FAIL
+
+ [a.charset: IDL set to 1.5]
+ expected: FAIL
+
+ [a.charset: IDL set to true]
+ expected: FAIL
+
+ [a.charset: IDL set to false]
+ expected: FAIL
+
+ [a.charset: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [a.charset: IDL set to NaN]
+ expected: FAIL
+
+ [a.charset: IDL set to Infinity]
+ expected: FAIL
+
+ [a.charset: IDL set to -Infinity]
+ expected: FAIL
+
+ [a.charset: IDL set to "\\0"]
+ expected: FAIL
+
+ [a.charset: IDL set to null]
+ expected: FAIL
+
+ [a.charset: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [a.charset: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [em.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [em.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [em.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [em.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [em.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [em.dir: setAttribute() to true]
+ expected: FAIL
+
+ [em.dir: setAttribute() to false]
+ expected: FAIL
+
+ [em.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [em.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [em.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [em.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [em.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [em.dir: setAttribute() to null]
+ expected: FAIL
+
+ [em.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [em.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [em.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [em.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [em.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [em.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [em.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [em.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [em.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [em.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [em.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [em.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [em.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [em.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [em.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [em.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [em.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [em.dir: IDL set to ""]
+ expected: FAIL
+
+ [em.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [em.dir: IDL set to undefined]
+ expected: FAIL
+
+ [em.dir: IDL set to 7]
+ expected: FAIL
+
+ [em.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [em.dir: IDL set to true]
+ expected: FAIL
+
+ [em.dir: IDL set to false]
+ expected: FAIL
+
+ [em.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [em.dir: IDL set to NaN]
+ expected: FAIL
+
+ [em.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [em.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [em.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [em.dir: IDL set to null]
+ expected: FAIL
+
+ [em.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [em.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [em.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [em.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [em.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [em.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [em.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [em.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [em.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [em.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [em.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [em.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [em.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [em.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [em.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [em.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [em.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [em.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [em.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [em.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [em.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [em.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [em.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [em.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [em.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [em.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [em.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [em.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [em.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [em.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [em.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [em.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [em.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [em.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [em.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [em.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [em.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [em.accessKey: IDL set to true]
+ expected: FAIL
+
+ [em.accessKey: IDL set to false]
+ expected: FAIL
+
+ [em.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [em.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [em.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [em.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [em.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [em.accessKey: IDL set to null]
+ expected: FAIL
+
+ [em.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [em.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [em.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [em.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [em.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [em.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [em.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [em.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [em.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [em.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [em.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [em.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [em.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [em.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [em.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [em.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [em.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [em.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [em.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [em.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [em.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [em.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [em.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [em.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [em.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to true]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to false]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to null]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [strong.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [strong.dir: IDL set to ""]
+ expected: FAIL
+
+ [strong.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [strong.dir: IDL set to undefined]
+ expected: FAIL
+
+ [strong.dir: IDL set to 7]
+ expected: FAIL
+
+ [strong.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [strong.dir: IDL set to true]
+ expected: FAIL
+
+ [strong.dir: IDL set to false]
+ expected: FAIL
+
+ [strong.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [strong.dir: IDL set to NaN]
+ expected: FAIL
+
+ [strong.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [strong.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [strong.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [strong.dir: IDL set to null]
+ expected: FAIL
+
+ [strong.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [strong.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [strong.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [strong.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [strong.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [strong.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [strong.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [strong.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [strong.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [strong.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [strong.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [strong.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [strong.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [strong.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [strong.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [strong.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [strong.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [strong.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [strong.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [strong.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [strong.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [strong.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [strong.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [strong.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [strong.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [strong.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [strong.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [strong.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [strong.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [strong.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [strong.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [strong.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [strong.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [strong.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [strong.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [strong.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [strong.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [strong.accessKey: IDL set to true]
+ expected: FAIL
+
+ [strong.accessKey: IDL set to false]
+ expected: FAIL
+
+ [strong.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [strong.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [strong.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [strong.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [strong.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [strong.accessKey: IDL set to null]
+ expected: FAIL
+
+ [strong.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [strong.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [strong.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [strong.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [strong.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [strong.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [strong.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [strong.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [strong.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [strong.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [strong.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [strong.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [strong.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [strong.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [strong.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [strong.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [strong.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [strong.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [strong.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [strong.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [strong.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [strong.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [strong.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [strong.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [strong.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [small.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [small.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [small.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [small.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [small.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [small.dir: setAttribute() to true]
+ expected: FAIL
+
+ [small.dir: setAttribute() to false]
+ expected: FAIL
+
+ [small.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [small.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [small.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [small.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [small.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [small.dir: setAttribute() to null]
+ expected: FAIL
+
+ [small.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [small.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [small.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [small.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [small.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [small.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [small.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [small.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [small.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [small.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [small.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [small.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [small.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [small.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [small.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [small.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [small.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [small.dir: IDL set to ""]
+ expected: FAIL
+
+ [small.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [small.dir: IDL set to undefined]
+ expected: FAIL
+
+ [small.dir: IDL set to 7]
+ expected: FAIL
+
+ [small.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [small.dir: IDL set to true]
+ expected: FAIL
+
+ [small.dir: IDL set to false]
+ expected: FAIL
+
+ [small.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [small.dir: IDL set to NaN]
+ expected: FAIL
+
+ [small.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [small.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [small.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [small.dir: IDL set to null]
+ expected: FAIL
+
+ [small.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [small.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [small.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [small.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [small.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [small.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [small.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [small.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [small.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [small.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [small.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [small.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [small.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [small.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [small.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [small.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [small.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [small.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [small.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [small.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [small.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [small.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [small.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [small.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [small.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [small.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [small.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [small.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [small.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [small.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [small.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [small.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [small.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [small.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [small.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [small.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [small.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [small.accessKey: IDL set to true]
+ expected: FAIL
+
+ [small.accessKey: IDL set to false]
+ expected: FAIL
+
+ [small.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [small.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [small.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [small.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [small.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [small.accessKey: IDL set to null]
+ expected: FAIL
+
+ [small.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [small.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [small.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [small.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [small.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [small.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [small.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [small.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [small.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [small.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [small.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [small.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [small.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [small.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [small.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [small.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [small.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [small.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [small.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [small.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [small.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [small.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [small.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [small.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [small.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [s.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [s.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [s.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [s.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [s.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [s.dir: setAttribute() to true]
+ expected: FAIL
+
+ [s.dir: setAttribute() to false]
+ expected: FAIL
+
+ [s.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [s.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [s.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [s.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [s.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [s.dir: setAttribute() to null]
+ expected: FAIL
+
+ [s.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [s.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [s.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [s.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [s.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [s.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [s.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [s.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [s.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [s.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [s.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [s.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [s.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [s.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [s.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [s.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [s.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [s.dir: IDL set to ""]
+ expected: FAIL
+
+ [s.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [s.dir: IDL set to undefined]
+ expected: FAIL
+
+ [s.dir: IDL set to 7]
+ expected: FAIL
+
+ [s.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [s.dir: IDL set to true]
+ expected: FAIL
+
+ [s.dir: IDL set to false]
+ expected: FAIL
+
+ [s.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [s.dir: IDL set to NaN]
+ expected: FAIL
+
+ [s.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [s.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [s.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [s.dir: IDL set to null]
+ expected: FAIL
+
+ [s.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [s.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [s.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [s.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [s.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [s.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [s.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [s.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [s.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [s.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [s.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [s.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [s.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [s.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [s.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [s.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [s.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [s.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [s.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [s.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [s.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [s.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [s.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [s.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [s.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [s.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [s.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [s.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [s.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [s.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [s.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [s.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [s.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [s.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [s.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [s.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [s.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [s.accessKey: IDL set to true]
+ expected: FAIL
+
+ [s.accessKey: IDL set to false]
+ expected: FAIL
+
+ [s.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [s.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [s.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [s.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [s.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [s.accessKey: IDL set to null]
+ expected: FAIL
+
+ [s.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [s.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [s.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [s.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [s.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [s.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [s.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [s.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [s.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [s.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [s.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [s.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [s.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [s.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [s.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [s.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [s.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [s.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [s.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [s.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [s.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [s.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [s.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [s.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [s.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to true]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to false]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to null]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [cite.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [cite.dir: IDL set to ""]
+ expected: FAIL
+
+ [cite.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [cite.dir: IDL set to undefined]
+ expected: FAIL
+
+ [cite.dir: IDL set to 7]
+ expected: FAIL
+
+ [cite.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [cite.dir: IDL set to true]
+ expected: FAIL
+
+ [cite.dir: IDL set to false]
+ expected: FAIL
+
+ [cite.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [cite.dir: IDL set to NaN]
+ expected: FAIL
+
+ [cite.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [cite.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [cite.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [cite.dir: IDL set to null]
+ expected: FAIL
+
+ [cite.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [cite.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [cite.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [cite.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [cite.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [cite.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [cite.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [cite.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [cite.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [cite.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [cite.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [cite.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [cite.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [cite.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [cite.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [cite.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [cite.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [cite.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [cite.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [cite.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [cite.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [cite.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [cite.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [cite.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [cite.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [cite.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [cite.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [cite.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [cite.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [cite.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [cite.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [cite.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [cite.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [cite.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [cite.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [cite.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [cite.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [cite.accessKey: IDL set to true]
+ expected: FAIL
+
+ [cite.accessKey: IDL set to false]
+ expected: FAIL
+
+ [cite.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [cite.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [cite.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [cite.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [cite.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [cite.accessKey: IDL set to null]
+ expected: FAIL
+
+ [cite.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [cite.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [cite.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [cite.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [cite.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [cite.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [cite.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [cite.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [cite.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [cite.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [cite.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [cite.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [cite.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [cite.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [cite.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [cite.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [cite.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [cite.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [cite.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [cite.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [cite.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [cite.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [cite.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [cite.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [cite.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [q.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [q.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [q.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [q.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [q.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [q.dir: setAttribute() to true]
+ expected: FAIL
+
+ [q.dir: setAttribute() to false]
+ expected: FAIL
+
+ [q.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [q.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [q.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [q.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [q.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [q.dir: setAttribute() to null]
+ expected: FAIL
+
+ [q.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [q.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [q.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [q.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [q.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [q.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [q.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [q.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [q.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [q.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [q.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [q.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [q.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [q.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [q.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [q.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [q.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [q.dir: IDL set to ""]
+ expected: FAIL
+
+ [q.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [q.dir: IDL set to undefined]
+ expected: FAIL
+
+ [q.dir: IDL set to 7]
+ expected: FAIL
+
+ [q.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [q.dir: IDL set to true]
+ expected: FAIL
+
+ [q.dir: IDL set to false]
+ expected: FAIL
+
+ [q.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [q.dir: IDL set to NaN]
+ expected: FAIL
+
+ [q.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [q.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [q.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [q.dir: IDL set to null]
+ expected: FAIL
+
+ [q.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [q.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [q.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [q.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [q.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [q.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [q.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [q.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [q.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [q.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [q.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [q.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [q.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [q.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [q.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [q.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [q.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [q.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [q.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [q.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [q.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [q.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [q.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [q.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [q.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [q.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [q.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [q.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [q.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [q.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [q.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [q.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [q.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [q.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [q.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [q.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [q.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [q.accessKey: IDL set to true]
+ expected: FAIL
+
+ [q.accessKey: IDL set to false]
+ expected: FAIL
+
+ [q.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [q.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [q.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [q.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [q.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [q.accessKey: IDL set to null]
+ expected: FAIL
+
+ [q.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [q.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [q.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [q.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [q.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [q.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [q.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [q.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [q.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [q.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [q.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [q.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [q.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [q.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [q.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [q.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [q.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [q.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [q.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [q.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [q.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [q.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [q.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [q.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [q.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [q.cite: setAttribute() to ""]
+ expected: FAIL
+
+ [q.cite: setAttribute() to " foo "]
+ expected: FAIL
+
+ [q.cite: setAttribute() to "http://site.example/"]
+ expected: FAIL
+
+ [q.cite: setAttribute() to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [q.cite: setAttribute() to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [q.cite: setAttribute() to undefined]
+ expected: FAIL
+
+ [q.cite: setAttribute() to 7]
+ expected: FAIL
+
+ [q.cite: setAttribute() to 1.5]
+ expected: FAIL
+
+ [q.cite: setAttribute() to true]
+ expected: FAIL
+
+ [q.cite: setAttribute() to false]
+ expected: FAIL
+
+ [q.cite: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [q.cite: setAttribute() to NaN]
+ expected: FAIL
+
+ [q.cite: setAttribute() to Infinity]
+ expected: FAIL
+
+ [q.cite: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [q.cite: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [q.cite: setAttribute() to null]
+ expected: FAIL
+
+ [q.cite: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [q.cite: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [q.cite: IDL set to ""]
+ expected: FAIL
+
+ [q.cite: IDL set to " foo "]
+ expected: FAIL
+
+ [q.cite: IDL set to "http://site.example/"]
+ expected: FAIL
+
+ [q.cite: IDL set to "//site.example/path???@#l"]
+ expected: FAIL
+
+ [q.cite: IDL set to "\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f "]
+ expected: FAIL
+
+ [q.cite: IDL set to undefined]
+ expected: FAIL
+
+ [q.cite: IDL set to 7]
+ expected: FAIL
+
+ [q.cite: IDL set to 1.5]
+ expected: FAIL
+
+ [q.cite: IDL set to true]
+ expected: FAIL
+
+ [q.cite: IDL set to false]
+ expected: FAIL
+
+ [q.cite: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [q.cite: IDL set to NaN]
+ expected: FAIL
+
+ [q.cite: IDL set to Infinity]
+ expected: FAIL
+
+ [q.cite: IDL set to -Infinity]
+ expected: FAIL
+
+ [q.cite: IDL set to "\\0"]
+ expected: FAIL
+
+ [q.cite: IDL set to null]
+ expected: FAIL
+
+ [q.cite: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [q.cite: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to true]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to false]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to null]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [dfn.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [dfn.dir: IDL set to ""]
+ expected: FAIL
+
+ [dfn.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dfn.dir: IDL set to undefined]
+ expected: FAIL
+
+ [dfn.dir: IDL set to 7]
+ expected: FAIL
+
+ [dfn.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [dfn.dir: IDL set to true]
+ expected: FAIL
+
+ [dfn.dir: IDL set to false]
+ expected: FAIL
+
+ [dfn.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [dfn.dir: IDL set to NaN]
+ expected: FAIL
+
+ [dfn.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [dfn.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [dfn.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [dfn.dir: IDL set to null]
+ expected: FAIL
+
+ [dfn.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [dfn.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [dfn.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [dfn.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [dfn.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [dfn.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [dfn.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [dfn.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [dfn.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [dfn.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [dfn.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [dfn.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [dfn.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [dfn.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [dfn.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [dfn.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [dfn.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [dfn.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [dfn.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dfn.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [dfn.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [dfn.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [dfn.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [dfn.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [dfn.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [dfn.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [dfn.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [dfn.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [dfn.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [dfn.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [dfn.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [dfn.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [dfn.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [dfn.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [dfn.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [dfn.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [dfn.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [dfn.accessKey: IDL set to true]
+ expected: FAIL
+
+ [dfn.accessKey: IDL set to false]
+ expected: FAIL
+
+ [dfn.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [dfn.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [dfn.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [dfn.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [dfn.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [dfn.accessKey: IDL set to null]
+ expected: FAIL
+
+ [dfn.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [dfn.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [dfn.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [dfn.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [dfn.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [dfn.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [dfn.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [dfn.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [dfn.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [dfn.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [dfn.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [dfn.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [dfn.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [dfn.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [dfn.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [dfn.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [dfn.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [dfn.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [dfn.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [dfn.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [dfn.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [dfn.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [dfn.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [dfn.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [dfn.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to true]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to false]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to null]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [abbr.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [abbr.dir: IDL set to ""]
+ expected: FAIL
+
+ [abbr.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [abbr.dir: IDL set to undefined]
+ expected: FAIL
+
+ [abbr.dir: IDL set to 7]
+ expected: FAIL
+
+ [abbr.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [abbr.dir: IDL set to true]
+ expected: FAIL
+
+ [abbr.dir: IDL set to false]
+ expected: FAIL
+
+ [abbr.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [abbr.dir: IDL set to NaN]
+ expected: FAIL
+
+ [abbr.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [abbr.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [abbr.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [abbr.dir: IDL set to null]
+ expected: FAIL
+
+ [abbr.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [abbr.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [abbr.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [abbr.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [abbr.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [abbr.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [abbr.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [abbr.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [abbr.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [abbr.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [abbr.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [abbr.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [abbr.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [abbr.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [abbr.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [abbr.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [abbr.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [abbr.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [abbr.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [abbr.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [abbr.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [abbr.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [abbr.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [abbr.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [abbr.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [abbr.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [abbr.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [abbr.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [abbr.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [abbr.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [abbr.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [abbr.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [abbr.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [abbr.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [abbr.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [abbr.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [abbr.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [abbr.accessKey: IDL set to true]
+ expected: FAIL
+
+ [abbr.accessKey: IDL set to false]
+ expected: FAIL
+
+ [abbr.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [abbr.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [abbr.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [abbr.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [abbr.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [abbr.accessKey: IDL set to null]
+ expected: FAIL
+
+ [abbr.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [abbr.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [abbr.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [abbr.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [abbr.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [abbr.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [abbr.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [abbr.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [abbr.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [abbr.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [abbr.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [abbr.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [abbr.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [abbr.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [abbr.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [abbr.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [abbr.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [abbr.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [abbr.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [abbr.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [abbr.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [abbr.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [abbr.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [abbr.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [abbr.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [data.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [data.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [data.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [data.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [data.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [data.dir: setAttribute() to true]
+ expected: FAIL
+
+ [data.dir: setAttribute() to false]
+ expected: FAIL
+
+ [data.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [data.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [data.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [data.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [data.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [data.dir: setAttribute() to null]
+ expected: FAIL
+
+ [data.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [data.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [data.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [data.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [data.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [data.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [data.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [data.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [data.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [data.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [data.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [data.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [data.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [data.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [data.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [data.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [data.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [data.dir: IDL set to ""]
+ expected: FAIL
+
+ [data.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [data.dir: IDL set to undefined]
+ expected: FAIL
+
+ [data.dir: IDL set to 7]
+ expected: FAIL
+
+ [data.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [data.dir: IDL set to true]
+ expected: FAIL
+
+ [data.dir: IDL set to false]
+ expected: FAIL
+
+ [data.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [data.dir: IDL set to NaN]
+ expected: FAIL
+
+ [data.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [data.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [data.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [data.dir: IDL set to null]
+ expected: FAIL
+
+ [data.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [data.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [data.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [data.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [data.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [data.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [data.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [data.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [data.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [data.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [data.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [data.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [data.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [data.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [data.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [data.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [data.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [data.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [data.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [data.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [data.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [data.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [data.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [data.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [data.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [data.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [data.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [data.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [data.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [data.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [data.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [data.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [data.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [data.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [data.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [data.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [data.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [data.accessKey: IDL set to true]
+ expected: FAIL
+
+ [data.accessKey: IDL set to false]
+ expected: FAIL
+
+ [data.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [data.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [data.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [data.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [data.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [data.accessKey: IDL set to null]
+ expected: FAIL
+
+ [data.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [data.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [data.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [data.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [data.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [data.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [data.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [data.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [data.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [data.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [data.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [data.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [data.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [data.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [data.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [data.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [data.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [data.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [data.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [data.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [data.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [data.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [data.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [data.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [data.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [time.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [time.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [time.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [time.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [time.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [time.dir: setAttribute() to true]
+ expected: FAIL
+
+ [time.dir: setAttribute() to false]
+ expected: FAIL
+
+ [time.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [time.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [time.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [time.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [time.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [time.dir: setAttribute() to null]
+ expected: FAIL
+
+ [time.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [time.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [time.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [time.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [time.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [time.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [time.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [time.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [time.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [time.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [time.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [time.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [time.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [time.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [time.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [time.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [time.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [time.dir: IDL set to ""]
+ expected: FAIL
+
+ [time.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [time.dir: IDL set to undefined]
+ expected: FAIL
+
+ [time.dir: IDL set to 7]
+ expected: FAIL
+
+ [time.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [time.dir: IDL set to true]
+ expected: FAIL
+
+ [time.dir: IDL set to false]
+ expected: FAIL
+
+ [time.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [time.dir: IDL set to NaN]
+ expected: FAIL
+
+ [time.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [time.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [time.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [time.dir: IDL set to null]
+ expected: FAIL
+
+ [time.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [time.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [time.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [time.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [time.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [time.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [time.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [time.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [time.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [time.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [time.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [time.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [time.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [time.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [time.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [time.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [time.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [time.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [time.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [time.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [time.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [time.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [time.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [time.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [time.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [time.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [time.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [time.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [time.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [time.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [time.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [time.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [time.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [time.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [time.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [time.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [time.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [time.accessKey: IDL set to true]
+ expected: FAIL
+
+ [time.accessKey: IDL set to false]
+ expected: FAIL
+
+ [time.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [time.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [time.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [time.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [time.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [time.accessKey: IDL set to null]
+ expected: FAIL
+
+ [time.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [time.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [time.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [time.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [time.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [time.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [time.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [time.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [time.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [time.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [time.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [time.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [time.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [time.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [time.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [time.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [time.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [time.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [time.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [time.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [time.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [time.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [time.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [time.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [time.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [time.dateTime: setAttribute() to ""]
+ expected: FAIL
+
+ [time.dateTime: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [time.dateTime: setAttribute() to undefined]
+ expected: FAIL
+
+ [time.dateTime: setAttribute() to 7]
+ expected: FAIL
+
+ [time.dateTime: setAttribute() to 1.5]
+ expected: FAIL
+
+ [time.dateTime: setAttribute() to true]
+ expected: FAIL
+
+ [time.dateTime: setAttribute() to false]
+ expected: FAIL
+
+ [time.dateTime: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [time.dateTime: setAttribute() to NaN]
+ expected: FAIL
+
+ [time.dateTime: setAttribute() to Infinity]
+ expected: FAIL
+
+ [time.dateTime: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [time.dateTime: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [time.dateTime: setAttribute() to null]
+ expected: FAIL
+
+ [time.dateTime: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [time.dateTime: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [time.dateTime: IDL set to ""]
+ expected: FAIL
+
+ [time.dateTime: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [time.dateTime: IDL set to undefined]
+ expected: FAIL
+
+ [time.dateTime: IDL set to 7]
+ expected: FAIL
+
+ [time.dateTime: IDL set to 1.5]
+ expected: FAIL
+
+ [time.dateTime: IDL set to true]
+ expected: FAIL
+
+ [time.dateTime: IDL set to false]
+ expected: FAIL
+
+ [time.dateTime: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [time.dateTime: IDL set to NaN]
+ expected: FAIL
+
+ [time.dateTime: IDL set to Infinity]
+ expected: FAIL
+
+ [time.dateTime: IDL set to -Infinity]
+ expected: FAIL
+
+ [time.dateTime: IDL set to "\\0"]
+ expected: FAIL
+
+ [time.dateTime: IDL set to null]
+ expected: FAIL
+
+ [time.dateTime: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [time.dateTime: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [code.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [code.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [code.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [code.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [code.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [code.dir: setAttribute() to true]
+ expected: FAIL
+
+ [code.dir: setAttribute() to false]
+ expected: FAIL
+
+ [code.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [code.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [code.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [code.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [code.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [code.dir: setAttribute() to null]
+ expected: FAIL
+
+ [code.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [code.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [code.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [code.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [code.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [code.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [code.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [code.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [code.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [code.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [code.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [code.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [code.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [code.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [code.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [code.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [code.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [code.dir: IDL set to ""]
+ expected: FAIL
+
+ [code.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [code.dir: IDL set to undefined]
+ expected: FAIL
+
+ [code.dir: IDL set to 7]
+ expected: FAIL
+
+ [code.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [code.dir: IDL set to true]
+ expected: FAIL
+
+ [code.dir: IDL set to false]
+ expected: FAIL
+
+ [code.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [code.dir: IDL set to NaN]
+ expected: FAIL
+
+ [code.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [code.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [code.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [code.dir: IDL set to null]
+ expected: FAIL
+
+ [code.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [code.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [code.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [code.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [code.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [code.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [code.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [code.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [code.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [code.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [code.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [code.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [code.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [code.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [code.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [code.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [code.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [code.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [code.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [code.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [code.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [code.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [code.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [code.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [code.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [code.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [code.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [code.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [code.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [code.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [code.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [code.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [code.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [code.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [code.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [code.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [code.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [code.accessKey: IDL set to true]
+ expected: FAIL
+
+ [code.accessKey: IDL set to false]
+ expected: FAIL
+
+ [code.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [code.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [code.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [code.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [code.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [code.accessKey: IDL set to null]
+ expected: FAIL
+
+ [code.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [code.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [code.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [code.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [code.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [code.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [code.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [code.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [code.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [code.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [code.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [code.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [code.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [code.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [code.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [code.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [code.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [code.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [code.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [code.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [code.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [code.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [code.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [code.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [code.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [var.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [var.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [var.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [var.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [var.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [var.dir: setAttribute() to true]
+ expected: FAIL
+
+ [var.dir: setAttribute() to false]
+ expected: FAIL
+
+ [var.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [var.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [var.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [var.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [var.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [var.dir: setAttribute() to null]
+ expected: FAIL
+
+ [var.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [var.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [var.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [var.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [var.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [var.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [var.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [var.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [var.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [var.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [var.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [var.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [var.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [var.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [var.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [var.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [var.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [var.dir: IDL set to ""]
+ expected: FAIL
+
+ [var.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [var.dir: IDL set to undefined]
+ expected: FAIL
+
+ [var.dir: IDL set to 7]
+ expected: FAIL
+
+ [var.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [var.dir: IDL set to true]
+ expected: FAIL
+
+ [var.dir: IDL set to false]
+ expected: FAIL
+
+ [var.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [var.dir: IDL set to NaN]
+ expected: FAIL
+
+ [var.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [var.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [var.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [var.dir: IDL set to null]
+ expected: FAIL
+
+ [var.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [var.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [var.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [var.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [var.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [var.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [var.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [var.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [var.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [var.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [var.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [var.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [var.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [var.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [var.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [var.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [var.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [var.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [var.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [var.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [var.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [var.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [var.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [var.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [var.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [var.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [var.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [var.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [var.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [var.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [var.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [var.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [var.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [var.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [var.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [var.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [var.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [var.accessKey: IDL set to true]
+ expected: FAIL
+
+ [var.accessKey: IDL set to false]
+ expected: FAIL
+
+ [var.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [var.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [var.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [var.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [var.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [var.accessKey: IDL set to null]
+ expected: FAIL
+
+ [var.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [var.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [var.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [var.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [var.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [var.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [var.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [var.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [var.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [var.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [var.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [var.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [var.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [var.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [var.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [var.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [var.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [var.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [var.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [var.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [var.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [var.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [var.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [var.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [var.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to true]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to false]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to null]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [samp.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [samp.dir: IDL set to ""]
+ expected: FAIL
+
+ [samp.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [samp.dir: IDL set to undefined]
+ expected: FAIL
+
+ [samp.dir: IDL set to 7]
+ expected: FAIL
+
+ [samp.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [samp.dir: IDL set to true]
+ expected: FAIL
+
+ [samp.dir: IDL set to false]
+ expected: FAIL
+
+ [samp.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [samp.dir: IDL set to NaN]
+ expected: FAIL
+
+ [samp.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [samp.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [samp.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [samp.dir: IDL set to null]
+ expected: FAIL
+
+ [samp.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [samp.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [samp.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [samp.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [samp.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [samp.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [samp.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [samp.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [samp.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [samp.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [samp.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [samp.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [samp.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [samp.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [samp.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [samp.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [samp.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [samp.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [samp.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [samp.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [samp.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [samp.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [samp.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [samp.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [samp.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [samp.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [samp.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [samp.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [samp.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [samp.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [samp.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [samp.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [samp.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [samp.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [samp.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [samp.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [samp.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [samp.accessKey: IDL set to true]
+ expected: FAIL
+
+ [samp.accessKey: IDL set to false]
+ expected: FAIL
+
+ [samp.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [samp.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [samp.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [samp.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [samp.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [samp.accessKey: IDL set to null]
+ expected: FAIL
+
+ [samp.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [samp.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [samp.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [samp.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [samp.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [samp.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [samp.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [samp.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [samp.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [samp.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [samp.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [samp.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [samp.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [samp.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [samp.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [samp.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [samp.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [samp.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [samp.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [samp.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [samp.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [samp.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [samp.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [samp.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [samp.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to true]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to false]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to null]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [kbd.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [kbd.dir: IDL set to ""]
+ expected: FAIL
+
+ [kbd.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [kbd.dir: IDL set to undefined]
+ expected: FAIL
+
+ [kbd.dir: IDL set to 7]
+ expected: FAIL
+
+ [kbd.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [kbd.dir: IDL set to true]
+ expected: FAIL
+
+ [kbd.dir: IDL set to false]
+ expected: FAIL
+
+ [kbd.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [kbd.dir: IDL set to NaN]
+ expected: FAIL
+
+ [kbd.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [kbd.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [kbd.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [kbd.dir: IDL set to null]
+ expected: FAIL
+
+ [kbd.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [kbd.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [kbd.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [kbd.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [kbd.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [kbd.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [kbd.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [kbd.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [kbd.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [kbd.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [kbd.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [kbd.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [kbd.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [kbd.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [kbd.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [kbd.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [kbd.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [kbd.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [kbd.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [kbd.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [kbd.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [kbd.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [kbd.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [kbd.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [kbd.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [kbd.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [kbd.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [kbd.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [kbd.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [kbd.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [kbd.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [kbd.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [kbd.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [kbd.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [kbd.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [kbd.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [kbd.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [kbd.accessKey: IDL set to true]
+ expected: FAIL
+
+ [kbd.accessKey: IDL set to false]
+ expected: FAIL
+
+ [kbd.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [kbd.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [kbd.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [kbd.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [kbd.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [kbd.accessKey: IDL set to null]
+ expected: FAIL
+
+ [kbd.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [kbd.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [kbd.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [kbd.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [kbd.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [kbd.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [kbd.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [kbd.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [kbd.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [kbd.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [kbd.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [kbd.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [kbd.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [kbd.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [kbd.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [kbd.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [kbd.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [kbd.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [kbd.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [kbd.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [kbd.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [kbd.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [kbd.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [kbd.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [kbd.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to true]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to false]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to null]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [sub.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [sub.dir: IDL set to ""]
+ expected: FAIL
+
+ [sub.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [sub.dir: IDL set to undefined]
+ expected: FAIL
+
+ [sub.dir: IDL set to 7]
+ expected: FAIL
+
+ [sub.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [sub.dir: IDL set to true]
+ expected: FAIL
+
+ [sub.dir: IDL set to false]
+ expected: FAIL
+
+ [sub.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [sub.dir: IDL set to NaN]
+ expected: FAIL
+
+ [sub.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [sub.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [sub.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [sub.dir: IDL set to null]
+ expected: FAIL
+
+ [sub.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [sub.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [sub.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [sub.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [sub.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [sub.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [sub.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [sub.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [sub.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [sub.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [sub.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [sub.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [sub.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [sub.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [sub.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [sub.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [sub.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [sub.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [sub.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [sub.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [sub.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [sub.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [sub.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [sub.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [sub.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [sub.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [sub.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [sub.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [sub.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [sub.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [sub.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [sub.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [sub.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [sub.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [sub.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [sub.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [sub.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [sub.accessKey: IDL set to true]
+ expected: FAIL
+
+ [sub.accessKey: IDL set to false]
+ expected: FAIL
+
+ [sub.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [sub.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [sub.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [sub.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [sub.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [sub.accessKey: IDL set to null]
+ expected: FAIL
+
+ [sub.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [sub.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [sub.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [sub.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [sub.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [sub.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [sub.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [sub.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [sub.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [sub.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [sub.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [sub.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [sub.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [sub.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [sub.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [sub.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [sub.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [sub.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [sub.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [sub.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [sub.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [sub.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [sub.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [sub.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [sub.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to true]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to false]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to null]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [sup.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [sup.dir: IDL set to ""]
+ expected: FAIL
+
+ [sup.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [sup.dir: IDL set to undefined]
+ expected: FAIL
+
+ [sup.dir: IDL set to 7]
+ expected: FAIL
+
+ [sup.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [sup.dir: IDL set to true]
+ expected: FAIL
+
+ [sup.dir: IDL set to false]
+ expected: FAIL
+
+ [sup.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [sup.dir: IDL set to NaN]
+ expected: FAIL
+
+ [sup.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [sup.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [sup.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [sup.dir: IDL set to null]
+ expected: FAIL
+
+ [sup.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [sup.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [sup.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [sup.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [sup.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [sup.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [sup.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [sup.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [sup.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [sup.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [sup.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [sup.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [sup.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [sup.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [sup.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [sup.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [sup.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [sup.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [sup.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [sup.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [sup.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [sup.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [sup.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [sup.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [sup.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [sup.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [sup.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [sup.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [sup.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [sup.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [sup.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [sup.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [sup.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [sup.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [sup.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [sup.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [sup.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [sup.accessKey: IDL set to true]
+ expected: FAIL
+
+ [sup.accessKey: IDL set to false]
+ expected: FAIL
+
+ [sup.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [sup.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [sup.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [sup.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [sup.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [sup.accessKey: IDL set to null]
+ expected: FAIL
+
+ [sup.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [sup.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [sup.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [sup.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [sup.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [sup.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [sup.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [sup.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [sup.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [sup.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [sup.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [sup.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [sup.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [sup.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [sup.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [sup.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [sup.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [sup.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [sup.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [sup.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [sup.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [sup.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [sup.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [sup.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [sup.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [i.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [i.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [i.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [i.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [i.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [i.dir: setAttribute() to true]
+ expected: FAIL
+
+ [i.dir: setAttribute() to false]
+ expected: FAIL
+
+ [i.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [i.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [i.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [i.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [i.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [i.dir: setAttribute() to null]
+ expected: FAIL
+
+ [i.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [i.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [i.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [i.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [i.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [i.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [i.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [i.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [i.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [i.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [i.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [i.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [i.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [i.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [i.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [i.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [i.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [i.dir: IDL set to ""]
+ expected: FAIL
+
+ [i.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [i.dir: IDL set to undefined]
+ expected: FAIL
+
+ [i.dir: IDL set to 7]
+ expected: FAIL
+
+ [i.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [i.dir: IDL set to true]
+ expected: FAIL
+
+ [i.dir: IDL set to false]
+ expected: FAIL
+
+ [i.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [i.dir: IDL set to NaN]
+ expected: FAIL
+
+ [i.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [i.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [i.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [i.dir: IDL set to null]
+ expected: FAIL
+
+ [i.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [i.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [i.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [i.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [i.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [i.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [i.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [i.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [i.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [i.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [i.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [i.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [i.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [i.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [i.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [i.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [i.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [i.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [i.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [i.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [i.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [i.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [i.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [i.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [i.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [i.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [i.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [i.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [i.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [i.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [i.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [i.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [i.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [i.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [i.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [i.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [i.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [i.accessKey: IDL set to true]
+ expected: FAIL
+
+ [i.accessKey: IDL set to false]
+ expected: FAIL
+
+ [i.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [i.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [i.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [i.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [i.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [i.accessKey: IDL set to null]
+ expected: FAIL
+
+ [i.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [i.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [i.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [i.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [i.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [i.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [i.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [i.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [i.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [i.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [i.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [i.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [i.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [i.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [i.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [i.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [i.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [i.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [i.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [i.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [i.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [i.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [i.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [i.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [i.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [b.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [b.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [b.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [b.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [b.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [b.dir: setAttribute() to true]
+ expected: FAIL
+
+ [b.dir: setAttribute() to false]
+ expected: FAIL
+
+ [b.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [b.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [b.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [b.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [b.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [b.dir: setAttribute() to null]
+ expected: FAIL
+
+ [b.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [b.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [b.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [b.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [b.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [b.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [b.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [b.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [b.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [b.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [b.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [b.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [b.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [b.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [b.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [b.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [b.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [b.dir: IDL set to ""]
+ expected: FAIL
+
+ [b.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [b.dir: IDL set to undefined]
+ expected: FAIL
+
+ [b.dir: IDL set to 7]
+ expected: FAIL
+
+ [b.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [b.dir: IDL set to true]
+ expected: FAIL
+
+ [b.dir: IDL set to false]
+ expected: FAIL
+
+ [b.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [b.dir: IDL set to NaN]
+ expected: FAIL
+
+ [b.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [b.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [b.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [b.dir: IDL set to null]
+ expected: FAIL
+
+ [b.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [b.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [b.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [b.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [b.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [b.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [b.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [b.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [b.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [b.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [b.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [b.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [b.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [b.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [b.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [b.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [b.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [b.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [b.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [b.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [b.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [b.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [b.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [b.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [b.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [b.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [b.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [b.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [b.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [b.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [b.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [b.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [b.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [b.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [b.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [b.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [b.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [b.accessKey: IDL set to true]
+ expected: FAIL
+
+ [b.accessKey: IDL set to false]
+ expected: FAIL
+
+ [b.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [b.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [b.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [b.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [b.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [b.accessKey: IDL set to null]
+ expected: FAIL
+
+ [b.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [b.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [b.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [b.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [b.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [b.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [b.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [b.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [b.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [b.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [b.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [b.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [b.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [b.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [b.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [b.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [b.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [b.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [b.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [b.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [b.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [b.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [b.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [b.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [b.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [u.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [u.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [u.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [u.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [u.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [u.dir: setAttribute() to true]
+ expected: FAIL
+
+ [u.dir: setAttribute() to false]
+ expected: FAIL
+
+ [u.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [u.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [u.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [u.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [u.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [u.dir: setAttribute() to null]
+ expected: FAIL
+
+ [u.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [u.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [u.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [u.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [u.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [u.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [u.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [u.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [u.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [u.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [u.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [u.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [u.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [u.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [u.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [u.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [u.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [u.dir: IDL set to ""]
+ expected: FAIL
+
+ [u.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [u.dir: IDL set to undefined]
+ expected: FAIL
+
+ [u.dir: IDL set to 7]
+ expected: FAIL
+
+ [u.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [u.dir: IDL set to true]
+ expected: FAIL
+
+ [u.dir: IDL set to false]
+ expected: FAIL
+
+ [u.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [u.dir: IDL set to NaN]
+ expected: FAIL
+
+ [u.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [u.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [u.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [u.dir: IDL set to null]
+ expected: FAIL
+
+ [u.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [u.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [u.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [u.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [u.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [u.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [u.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [u.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [u.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [u.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [u.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [u.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [u.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [u.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [u.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [u.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [u.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [u.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [u.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [u.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [u.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [u.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [u.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [u.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [u.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [u.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [u.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [u.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [u.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [u.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [u.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [u.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [u.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [u.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [u.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [u.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [u.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [u.accessKey: IDL set to true]
+ expected: FAIL
+
+ [u.accessKey: IDL set to false]
+ expected: FAIL
+
+ [u.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [u.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [u.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [u.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [u.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [u.accessKey: IDL set to null]
+ expected: FAIL
+
+ [u.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [u.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [u.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [u.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [u.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [u.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [u.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [u.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [u.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [u.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [u.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [u.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [u.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [u.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [u.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [u.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [u.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [u.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [u.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [u.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [u.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [u.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [u.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [u.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [u.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to true]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to false]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to null]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [mark.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [mark.dir: IDL set to ""]
+ expected: FAIL
+
+ [mark.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [mark.dir: IDL set to undefined]
+ expected: FAIL
+
+ [mark.dir: IDL set to 7]
+ expected: FAIL
+
+ [mark.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [mark.dir: IDL set to true]
+ expected: FAIL
+
+ [mark.dir: IDL set to false]
+ expected: FAIL
+
+ [mark.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [mark.dir: IDL set to NaN]
+ expected: FAIL
+
+ [mark.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [mark.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [mark.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [mark.dir: IDL set to null]
+ expected: FAIL
+
+ [mark.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [mark.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [mark.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [mark.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [mark.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [mark.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [mark.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [mark.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [mark.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [mark.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [mark.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [mark.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [mark.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [mark.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [mark.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [mark.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [mark.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [mark.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [mark.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [mark.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [mark.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [mark.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [mark.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [mark.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [mark.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [mark.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [mark.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [mark.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [mark.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [mark.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [mark.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [mark.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [mark.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [mark.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [mark.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [mark.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [mark.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [mark.accessKey: IDL set to true]
+ expected: FAIL
+
+ [mark.accessKey: IDL set to false]
+ expected: FAIL
+
+ [mark.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [mark.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [mark.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [mark.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [mark.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [mark.accessKey: IDL set to null]
+ expected: FAIL
+
+ [mark.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [mark.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [mark.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [mark.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [mark.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [mark.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [mark.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [mark.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [mark.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [mark.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [mark.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [mark.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [mark.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [mark.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [mark.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [mark.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [mark.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [mark.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [mark.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [mark.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [mark.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [mark.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [mark.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [mark.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [mark.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to true]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to false]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to null]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [ruby.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [ruby.dir: IDL set to ""]
+ expected: FAIL
+
+ [ruby.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ruby.dir: IDL set to undefined]
+ expected: FAIL
+
+ [ruby.dir: IDL set to 7]
+ expected: FAIL
+
+ [ruby.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [ruby.dir: IDL set to true]
+ expected: FAIL
+
+ [ruby.dir: IDL set to false]
+ expected: FAIL
+
+ [ruby.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [ruby.dir: IDL set to NaN]
+ expected: FAIL
+
+ [ruby.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [ruby.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [ruby.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [ruby.dir: IDL set to null]
+ expected: FAIL
+
+ [ruby.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [ruby.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [ruby.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [ruby.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [ruby.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [ruby.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [ruby.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [ruby.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [ruby.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [ruby.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [ruby.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [ruby.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [ruby.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [ruby.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [ruby.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [ruby.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [ruby.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [ruby.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [ruby.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ruby.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [ruby.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [ruby.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [ruby.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [ruby.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [ruby.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [ruby.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [ruby.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [ruby.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [ruby.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [ruby.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [ruby.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [ruby.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [ruby.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [ruby.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [ruby.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [ruby.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [ruby.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [ruby.accessKey: IDL set to true]
+ expected: FAIL
+
+ [ruby.accessKey: IDL set to false]
+ expected: FAIL
+
+ [ruby.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [ruby.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [ruby.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [ruby.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [ruby.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [ruby.accessKey: IDL set to null]
+ expected: FAIL
+
+ [ruby.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [ruby.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [ruby.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [ruby.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [ruby.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [ruby.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [ruby.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [ruby.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [ruby.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [ruby.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [ruby.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [ruby.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [ruby.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [ruby.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [ruby.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [ruby.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [ruby.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [ruby.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [ruby.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [ruby.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [ruby.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [ruby.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [ruby.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [ruby.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [ruby.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to true]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to false]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to null]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [rt.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [rt.dir: IDL set to ""]
+ expected: FAIL
+
+ [rt.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [rt.dir: IDL set to undefined]
+ expected: FAIL
+
+ [rt.dir: IDL set to 7]
+ expected: FAIL
+
+ [rt.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [rt.dir: IDL set to true]
+ expected: FAIL
+
+ [rt.dir: IDL set to false]
+ expected: FAIL
+
+ [rt.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [rt.dir: IDL set to NaN]
+ expected: FAIL
+
+ [rt.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [rt.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [rt.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [rt.dir: IDL set to null]
+ expected: FAIL
+
+ [rt.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [rt.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [rt.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [rt.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [rt.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [rt.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [rt.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [rt.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [rt.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [rt.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [rt.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [rt.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [rt.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [rt.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [rt.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [rt.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [rt.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [rt.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [rt.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [rt.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [rt.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [rt.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [rt.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [rt.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [rt.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [rt.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [rt.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [rt.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [rt.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [rt.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [rt.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [rt.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [rt.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [rt.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [rt.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [rt.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [rt.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [rt.accessKey: IDL set to true]
+ expected: FAIL
+
+ [rt.accessKey: IDL set to false]
+ expected: FAIL
+
+ [rt.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [rt.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [rt.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [rt.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [rt.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [rt.accessKey: IDL set to null]
+ expected: FAIL
+
+ [rt.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [rt.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [rt.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [rt.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [rt.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [rt.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [rt.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [rt.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [rt.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [rt.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [rt.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [rt.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [rt.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [rt.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [rt.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [rt.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [rt.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [rt.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [rt.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [rt.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [rt.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [rt.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [rt.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [rt.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [rt.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to true]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to false]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to null]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [rp.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [rp.dir: IDL set to ""]
+ expected: FAIL
+
+ [rp.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [rp.dir: IDL set to undefined]
+ expected: FAIL
+
+ [rp.dir: IDL set to 7]
+ expected: FAIL
+
+ [rp.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [rp.dir: IDL set to true]
+ expected: FAIL
+
+ [rp.dir: IDL set to false]
+ expected: FAIL
+
+ [rp.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [rp.dir: IDL set to NaN]
+ expected: FAIL
+
+ [rp.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [rp.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [rp.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [rp.dir: IDL set to null]
+ expected: FAIL
+
+ [rp.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [rp.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [rp.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [rp.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [rp.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [rp.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [rp.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [rp.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [rp.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [rp.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [rp.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [rp.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [rp.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [rp.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [rp.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [rp.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [rp.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [rp.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [rp.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [rp.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [rp.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [rp.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [rp.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [rp.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [rp.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [rp.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [rp.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [rp.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [rp.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [rp.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [rp.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [rp.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [rp.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [rp.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [rp.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [rp.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [rp.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [rp.accessKey: IDL set to true]
+ expected: FAIL
+
+ [rp.accessKey: IDL set to false]
+ expected: FAIL
+
+ [rp.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [rp.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [rp.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [rp.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [rp.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [rp.accessKey: IDL set to null]
+ expected: FAIL
+
+ [rp.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [rp.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [rp.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [rp.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [rp.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [rp.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [rp.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [rp.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [rp.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [rp.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [rp.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [rp.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [rp.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [rp.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [rp.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [rp.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [rp.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [rp.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [rp.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [rp.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [rp.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [rp.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [rp.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [rp.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [rp.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to true]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to false]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to null]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [bdi.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [bdi.dir: IDL set to ""]
+ expected: FAIL
+
+ [bdi.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [bdi.dir: IDL set to undefined]
+ expected: FAIL
+
+ [bdi.dir: IDL set to 7]
+ expected: FAIL
+
+ [bdi.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [bdi.dir: IDL set to true]
+ expected: FAIL
+
+ [bdi.dir: IDL set to false]
+ expected: FAIL
+
+ [bdi.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [bdi.dir: IDL set to NaN]
+ expected: FAIL
+
+ [bdi.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [bdi.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [bdi.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [bdi.dir: IDL set to null]
+ expected: FAIL
+
+ [bdi.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [bdi.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [bdi.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [bdi.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [bdi.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [bdi.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [bdi.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [bdi.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [bdi.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [bdi.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [bdi.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [bdi.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [bdi.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [bdi.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [bdi.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [bdi.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [bdi.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [bdi.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [bdi.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [bdi.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [bdi.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [bdi.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [bdi.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [bdi.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [bdi.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [bdi.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [bdi.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [bdi.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [bdi.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [bdi.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [bdi.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [bdi.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [bdi.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [bdi.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [bdi.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [bdi.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [bdi.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [bdi.accessKey: IDL set to true]
+ expected: FAIL
+
+ [bdi.accessKey: IDL set to false]
+ expected: FAIL
+
+ [bdi.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [bdi.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [bdi.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [bdi.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [bdi.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [bdi.accessKey: IDL set to null]
+ expected: FAIL
+
+ [bdi.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [bdi.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [bdi.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [bdi.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [bdi.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [bdi.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [bdi.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [bdi.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [bdi.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [bdi.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [bdi.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [bdi.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [bdi.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [bdi.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [bdi.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [bdi.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [bdi.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [bdi.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [bdi.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [bdi.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [bdi.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [bdi.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [bdi.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [bdi.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [bdi.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to true]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to false]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to null]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [bdo.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [bdo.dir: IDL set to ""]
+ expected: FAIL
+
+ [bdo.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [bdo.dir: IDL set to undefined]
+ expected: FAIL
+
+ [bdo.dir: IDL set to 7]
+ expected: FAIL
+
+ [bdo.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [bdo.dir: IDL set to true]
+ expected: FAIL
+
+ [bdo.dir: IDL set to false]
+ expected: FAIL
+
+ [bdo.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [bdo.dir: IDL set to NaN]
+ expected: FAIL
+
+ [bdo.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [bdo.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [bdo.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [bdo.dir: IDL set to null]
+ expected: FAIL
+
+ [bdo.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [bdo.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [bdo.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [bdo.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [bdo.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [bdo.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [bdo.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [bdo.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [bdo.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [bdo.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [bdo.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [bdo.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [bdo.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [bdo.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [bdo.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [bdo.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [bdo.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [bdo.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [bdo.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [bdo.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [bdo.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [bdo.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [bdo.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [bdo.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [bdo.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [bdo.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [bdo.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [bdo.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [bdo.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [bdo.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [bdo.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [bdo.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [bdo.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [bdo.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [bdo.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [bdo.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [bdo.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [bdo.accessKey: IDL set to true]
+ expected: FAIL
+
+ [bdo.accessKey: IDL set to false]
+ expected: FAIL
+
+ [bdo.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [bdo.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [bdo.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [bdo.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [bdo.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [bdo.accessKey: IDL set to null]
+ expected: FAIL
+
+ [bdo.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [bdo.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [bdo.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [bdo.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [bdo.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [bdo.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [bdo.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [bdo.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [bdo.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [bdo.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [bdo.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [bdo.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [bdo.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [bdo.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [bdo.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [bdo.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [bdo.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [bdo.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [bdo.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [bdo.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [bdo.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [bdo.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [bdo.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [bdo.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [bdo.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [span.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [span.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [span.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [span.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [span.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [span.dir: setAttribute() to true]
+ expected: FAIL
+
+ [span.dir: setAttribute() to false]
+ expected: FAIL
+
+ [span.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [span.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [span.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [span.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [span.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [span.dir: setAttribute() to null]
+ expected: FAIL
+
+ [span.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [span.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [span.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [span.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [span.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [span.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [span.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [span.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [span.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [span.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [span.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [span.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [span.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [span.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [span.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [span.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [span.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [span.dir: IDL set to ""]
+ expected: FAIL
+
+ [span.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [span.dir: IDL set to undefined]
+ expected: FAIL
+
+ [span.dir: IDL set to 7]
+ expected: FAIL
+
+ [span.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [span.dir: IDL set to true]
+ expected: FAIL
+
+ [span.dir: IDL set to false]
+ expected: FAIL
+
+ [span.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [span.dir: IDL set to NaN]
+ expected: FAIL
+
+ [span.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [span.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [span.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [span.dir: IDL set to null]
+ expected: FAIL
+
+ [span.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [span.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [span.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [span.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [span.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [span.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [span.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [span.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [span.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [span.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [span.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [span.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [span.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [span.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [span.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [span.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [span.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [span.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [span.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [span.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [span.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [span.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [span.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [span.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [span.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [span.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [span.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [span.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [span.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [span.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [span.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [span.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [span.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [span.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [span.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [span.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [span.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [span.accessKey: IDL set to true]
+ expected: FAIL
+
+ [span.accessKey: IDL set to false]
+ expected: FAIL
+
+ [span.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [span.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [span.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [span.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [span.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [span.accessKey: IDL set to null]
+ expected: FAIL
+
+ [span.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [span.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [span.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [span.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [span.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [span.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [span.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [span.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [span.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [span.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [span.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [span.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [span.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [span.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [span.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [span.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [span.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [span.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [span.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [span.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [span.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [span.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [span.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [span.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [span.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [br.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [br.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [br.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [br.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [br.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [br.dir: setAttribute() to true]
+ expected: FAIL
+
+ [br.dir: setAttribute() to false]
+ expected: FAIL
+
+ [br.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [br.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [br.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [br.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [br.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [br.dir: setAttribute() to null]
+ expected: FAIL
+
+ [br.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [br.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [br.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [br.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [br.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [br.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [br.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [br.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [br.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [br.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [br.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [br.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [br.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [br.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [br.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [br.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [br.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [br.dir: IDL set to ""]
+ expected: FAIL
+
+ [br.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [br.dir: IDL set to undefined]
+ expected: FAIL
+
+ [br.dir: IDL set to 7]
+ expected: FAIL
+
+ [br.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [br.dir: IDL set to true]
+ expected: FAIL
+
+ [br.dir: IDL set to false]
+ expected: FAIL
+
+ [br.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [br.dir: IDL set to NaN]
+ expected: FAIL
+
+ [br.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [br.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [br.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [br.dir: IDL set to null]
+ expected: FAIL
+
+ [br.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [br.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [br.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [br.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [br.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [br.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [br.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [br.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [br.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [br.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [br.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [br.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [br.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [br.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [br.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [br.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [br.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [br.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [br.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [br.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [br.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [br.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [br.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [br.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [br.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [br.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [br.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [br.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [br.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [br.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [br.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [br.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [br.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [br.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [br.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [br.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [br.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [br.accessKey: IDL set to true]
+ expected: FAIL
+
+ [br.accessKey: IDL set to false]
+ expected: FAIL
+
+ [br.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [br.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [br.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [br.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [br.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [br.accessKey: IDL set to null]
+ expected: FAIL
+
+ [br.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [br.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [br.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [br.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [br.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [br.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [br.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [br.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [br.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [br.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [br.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [br.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [br.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [br.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [br.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [br.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [br.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [br.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [br.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [br.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [br.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [br.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [br.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [br.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [br.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [br.clear: setAttribute() to ""]
+ expected: FAIL
+
+ [br.clear: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [br.clear: setAttribute() to undefined]
+ expected: FAIL
+
+ [br.clear: setAttribute() to 7]
+ expected: FAIL
+
+ [br.clear: setAttribute() to 1.5]
+ expected: FAIL
+
+ [br.clear: setAttribute() to true]
+ expected: FAIL
+
+ [br.clear: setAttribute() to false]
+ expected: FAIL
+
+ [br.clear: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [br.clear: setAttribute() to NaN]
+ expected: FAIL
+
+ [br.clear: setAttribute() to Infinity]
+ expected: FAIL
+
+ [br.clear: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [br.clear: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [br.clear: setAttribute() to null]
+ expected: FAIL
+
+ [br.clear: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [br.clear: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [br.clear: IDL set to ""]
+ expected: FAIL
+
+ [br.clear: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [br.clear: IDL set to undefined]
+ expected: FAIL
+
+ [br.clear: IDL set to 7]
+ expected: FAIL
+
+ [br.clear: IDL set to 1.5]
+ expected: FAIL
+
+ [br.clear: IDL set to true]
+ expected: FAIL
+
+ [br.clear: IDL set to false]
+ expected: FAIL
+
+ [br.clear: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [br.clear: IDL set to NaN]
+ expected: FAIL
+
+ [br.clear: IDL set to Infinity]
+ expected: FAIL
+
+ [br.clear: IDL set to -Infinity]
+ expected: FAIL
+
+ [br.clear: IDL set to "\\0"]
+ expected: FAIL
+
+ [br.clear: IDL set to null]
+ expected: FAIL
+
+ [br.clear: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [br.clear: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to true]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to false]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to null]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [wbr.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [wbr.dir: IDL set to ""]
+ expected: FAIL
+
+ [wbr.dir: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [wbr.dir: IDL set to undefined]
+ expected: FAIL
+
+ [wbr.dir: IDL set to 7]
+ expected: FAIL
+
+ [wbr.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [wbr.dir: IDL set to true]
+ expected: FAIL
+
+ [wbr.dir: IDL set to false]
+ expected: FAIL
+
+ [wbr.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [wbr.dir: IDL set to NaN]
+ expected: FAIL
+
+ [wbr.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [wbr.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [wbr.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [wbr.dir: IDL set to null]
+ expected: FAIL
+
+ [wbr.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [wbr.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [wbr.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [wbr.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [wbr.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [wbr.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [wbr.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [wbr.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [wbr.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [wbr.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [wbr.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [wbr.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [wbr.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [wbr.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [wbr.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [wbr.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [wbr.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [wbr.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [wbr.accessKey: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [wbr.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [wbr.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [wbr.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [wbr.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [wbr.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [wbr.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [wbr.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [wbr.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [wbr.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [wbr.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [wbr.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [wbr.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [wbr.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [wbr.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [wbr.accessKey: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f foo "]
+ expected: FAIL
+
+ [wbr.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [wbr.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [wbr.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [wbr.accessKey: IDL set to true]
+ expected: FAIL
+
+ [wbr.accessKey: IDL set to false]
+ expected: FAIL
+
+ [wbr.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [wbr.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [wbr.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [wbr.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [wbr.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [wbr.accessKey: IDL set to null]
+ expected: FAIL
+
+ [wbr.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [wbr.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [wbr.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [wbr.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [wbr.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [wbr.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [wbr.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [wbr.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [wbr.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [wbr.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [wbr.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [wbr.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [wbr.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [wbr.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [wbr.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [wbr.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [wbr.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [wbr.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [wbr.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [wbr.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [wbr.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [wbr.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [wbr.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [wbr.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [wbr.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/htmlallcollection.html.ini b/tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/htmlallcollection.html.ini
index df721f4c59d..ad7d4ea8ad6 100644
--- a/tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/htmlallcollection.html.ini
+++ b/tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/htmlallcollection.html.ini
@@ -36,3 +36,96 @@
[Should find both anchors and produce a list]
expected: FAIL
+ [document.all is an HTMLAllCollection]
+ expected: FAIL
+
+ [length attribute]
+ expected: FAIL
+
+ [indexed property getter]
+ expected: FAIL
+
+ [indexed property getter out of range]
+ expected: FAIL
+
+ [named property getter]
+ expected: FAIL
+
+ [named property getter with dot syntax]
+ expected: FAIL
+
+ [named property getter with invalid name]
+ expected: FAIL
+
+ [named property getter returning collection]
+ expected: FAIL
+
+ [named property getter with "array index property name"]
+ expected: FAIL
+
+ [named property getter with invalid "array index property name"]
+ expected: FAIL
+
+ [namedItem method]
+ expected: FAIL
+
+ [namedItem method with invalid name]
+ expected: FAIL
+
+ [namedItem method returning collection]
+ expected: FAIL
+
+ [namedItem method with "array index property name"]
+ expected: FAIL
+
+ [namedItem method with invalid "array index property name"]
+ expected: FAIL
+
+ [namedItem method with no argument]
+ expected: FAIL
+
+ [legacy caller]
+ expected: FAIL
+
+ [legacy caller with invalid name]
+ expected: FAIL
+
+ [legacy caller returning collection]
+ expected: FAIL
+
+ [legacy caller with "array index property name"]
+ expected: FAIL
+
+ [legacy caller with "array index property name" as number]
+ expected: FAIL
+
+ [legacy caller with invalid "array index property name"]
+ expected: FAIL
+
+ [legacy caller with no argument]
+ expected: FAIL
+
+ [item method]
+ expected: FAIL
+
+ [item method with invalid name]
+ expected: FAIL
+
+ [item method returning collection]
+ expected: FAIL
+
+ [item method with "array index property name"]
+ expected: FAIL
+
+ [item method with "array index property name" as number]
+ expected: FAIL
+
+ [item method with invalid "array index property name"]
+ expected: FAIL
+
+ [item method with no argument]
+ expected: FAIL
+
+ [collections are new live HTMLCollection instances]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe-append-to-child-document.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe-append-to-child-document.html.ini
new file mode 100644
index 00000000000..4e30edb2bbd
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe-append-to-child-document.html.ini
@@ -0,0 +1,5 @@
+[iframe-append-to-child-document.html]
+ type: testharness
+ [Append iframe element to its own child document]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini
index 35b9d111e6b..fc37df7e3fa 100644
--- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping.html.ini
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html.ini
@@ -1,4 +1,4 @@
-[iframe_sandbox_popups_escaping.html]
+[iframe_sandbox_popups_escaping-1.html]
type: testharness
expected: TIMEOUT
[Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
new file mode 100644
index 00000000000..96bbb277115
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html.ini
@@ -0,0 +1,6 @@
+[iframe_sandbox_popups_escaping-2.html]
+ type: testharness
+ expected: ERROR
+ [Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
new file mode 100644
index 00000000000..5f60c78e73c
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html.ini
@@ -0,0 +1,6 @@
+[iframe_sandbox_popups_escaping-3.html]
+ type: testharness
+ expected: TIMEOUT
+ [Check that popups from a sandboxed iframe escape the sandbox if\n allow-popups-to-escape-sandbox is used]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
index 9b96fa64ffa..9df1ac56f2a 100644
--- a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping.html.ini
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html.ini
@@ -1,4 +1,4 @@
-[iframe_sandbox_popups_nonescaping.html]
+[iframe_sandbox_popups_nonescaping-1.html]
type: testharness
expected: TIMEOUT
[Check that popups from a sandboxed iframe do not escape the sandbox]
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
new file mode 100644
index 00000000000..80a6d970279
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html.ini
@@ -0,0 +1,6 @@
+[iframe_sandbox_popups_nonescaping-2.html]
+ type: testharness
+ expected: ERROR
+ [Check that popups from a sandboxed iframe do not escape the sandbox]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini
new file mode 100644
index 00000000000..e440b1e38c6
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html.ini
@@ -0,0 +1,6 @@
+[iframe_sandbox_popups_nonescaping-3.html]
+ type: testharness
+ expected: TIMEOUT
+ [Check that popups from a sandboxed iframe do not escape the sandbox]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/data-url.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/data-url.html.ini
new file mode 100644
index 00000000000..ad38dae0de6
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/data-url.html.ini
@@ -0,0 +1,3 @@
+[data-url.html]
+ type: testharness
+ expected: ERROR
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/usemap-casing.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/usemap-casing.html.ini
new file mode 100644
index 00000000000..1da261971d2
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/usemap-casing.html.ini
@@ -0,0 +1,11 @@
+[usemap-casing.html]
+ type: testharness
+ [Image with usemap of #sanityCheck should match the area with map named sanityCheck]
+ expected: FAIL
+
+ [Image with usemap of #tÉdz5アパートFi should not match any of the areas]
+ expected: FAIL
+
+ [Image with usemap of #ΣΣ should not match any of the areas]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-object-element/usemap-casing.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-object-element/usemap-casing.html.ini
new file mode 100644
index 00000000000..2d47bb185db
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-object-element/usemap-casing.html.ini
@@ -0,0 +1,8 @@
+[usemap-casing.html]
+ type: testharness
+ [Object with usemap of #sanityCheck should match the area with map named sanityCheck]
+ expected: FAIL
+
+ [Object with usemap of undefined should not match any of the areas]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-checkValidity.html.ini b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-checkValidity.html.ini
index 3def3e50cf1..b83b69dd2bc 100644
--- a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-checkValidity.html.ini
+++ b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-checkValidity.html.ini
@@ -397,3 +397,33 @@
[[INPUT in DATETIME-LOCAL status\] suffering from being missing (in a form)]
expected: FAIL
+ [[INPUT in TEXT status\] not suffering from being too long]
+ expected: FAIL
+
+ [[INPUT in TEXT status\] not suffering from being too long (in a form)]
+ expected: FAIL
+
+ [[INPUT in SEARCH status\] not suffering from being too long]
+ expected: FAIL
+
+ [[INPUT in SEARCH status\] not suffering from being too long (in a form)]
+ expected: FAIL
+
+ [[INPUT in TEL status\] not suffering from being too long]
+ expected: FAIL
+
+ [[INPUT in TEL status\] not suffering from being too long (in a form)]
+ expected: FAIL
+
+ [[INPUT in PASSWORD status\] not suffering from being too long]
+ expected: FAIL
+
+ [[INPUT in PASSWORD status\] not suffering from being too long (in a form)]
+ expected: FAIL
+
+ [[INPUT in EMAIL status\] not suffering from being too long]
+ expected: FAIL
+
+ [[INPUT in EMAIL status\] not suffering from being too long (in a form)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-reportValidity.html.ini b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-reportValidity.html.ini
index af1bb61dd88..4dbcff22c2c 100644
--- a/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-reportValidity.html.ini
+++ b/tests/wpt/metadata/html/semantics/forms/constraints/form-validation-reportValidity.html.ini
@@ -397,3 +397,39 @@
[[INPUT in DATETIME-LOCAL status\] suffering from being missing (in a form)]
expected: FAIL
+ [[INPUT in TEXT status\] not suffering from being too long]
+ expected: FAIL
+
+ [[INPUT in TEXT status\] not suffering from being too long (in a form)]
+ expected: FAIL
+
+ [[INPUT in SEARCH status\] not suffering from being too long]
+ expected: FAIL
+
+ [[INPUT in SEARCH status\] not suffering from being too long (in a form)]
+ expected: FAIL
+
+ [[INPUT in TEL status\] not suffering from being too long]
+ expected: FAIL
+
+ [[INPUT in TEL status\] not suffering from being too long (in a form)]
+ expected: FAIL
+
+ [[INPUT in PASSWORD status\] not suffering from being too long]
+ expected: FAIL
+
+ [[INPUT in PASSWORD status\] not suffering from being too long (in a form)]
+ expected: FAIL
+
+ [[INPUT in URL status\] not suffering from being too long]
+ expected: FAIL
+
+ [[INPUT in URL status\] not suffering from being too long (in a form)]
+ expected: FAIL
+
+ [[INPUT in EMAIL status\] not suffering from being too long]
+ expected: FAIL
+
+ [[INPUT in EMAIL status\] not suffering from being too long (in a form)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-form-element/form-indexed-element.html.ini b/tests/wpt/metadata/html/semantics/forms/the-form-element/form-indexed-element.html.ini
new file mode 100644
index 00000000000..9ddeed4253f
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-form-element/form-indexed-element.html.ini
@@ -0,0 +1,5 @@
+[form-indexed-element.html]
+ type: testharness
+ [Trying to delete an indexed property name should never work]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-form-element/form-nameditem.html.ini b/tests/wpt/metadata/html/semantics/forms/the-form-element/form-nameditem.html.ini
index 3afc5ac928d..12f4dc33127 100644
--- a/tests/wpt/metadata/html/semantics/forms/the-form-element/form-nameditem.html.ini
+++ b/tests/wpt/metadata/html/semantics/forms/the-form-element/form-nameditem.html.ini
@@ -24,3 +24,9 @@
[Input should only be a named property on the innermost form that contains it]
expected: FAIL
+ [Trying to set an expando that would shadow an already-existing named property]
+ expected: FAIL
+
+ [Trying to set an expando that shadows a named property that gets added later]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-input-element/radio-groupname-case.html.ini b/tests/wpt/metadata/html/semantics/forms/the-input-element/radio-groupname-case.html.ini
index 4de30f16232..69e88a9bd4e 100644
--- a/tests/wpt/metadata/html/semantics/forms/the-input-element/radio-groupname-case.html.ini
+++ b/tests/wpt/metadata/html/semantics/forms/the-input-element/radio-groupname-case.html.ini
@@ -3,3 +3,24 @@
[radio button group name = paSSfield-killroyß]
expected: FAIL
+ [Among names like sImPlE, everything must be checkable at the same time]
+ expected: FAIL
+
+ [Among names like paSSfield-killroyß, everything must be checkable at the same time]
+ expected: FAIL
+
+ [Among names like глупый, everything must be checkable at the same time]
+ expected: FAIL
+
+ [Among names like åωk, everything must be checkable at the same time]
+ expected: FAIL
+
+ [Among names like blah1, everything must be checkable at the same time]
+ expected: FAIL
+
+ [Among names like tÉdz5アパートFi, everything must be checkable at the same time]
+ expected: FAIL
+
+ [Among names like ΣΣ, everything must be checkable at the same time]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes.html.ini b/tests/wpt/metadata/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes.html.ini
new file mode 100644
index 00000000000..a75f62fcd7a
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes.html.ini
@@ -0,0 +1,3 @@
+[grouping-li-reftest-list-owner-skip-no-boxes.html]
+ type: reftest
+ expected: FAIL
diff --git a/tests/wpt/metadata/html/semantics/grouping-content/the-ol-element/grouping-ol.html.ini b/tests/wpt/metadata/html/semantics/grouping-content/the-ol-element/grouping-ol.html.ini
index ffd29aadfbe..7d2ad021a79 100644
--- a/tests/wpt/metadata/html/semantics/grouping-content/the-ol-element/grouping-ol.html.ini
+++ b/tests/wpt/metadata/html/semantics/grouping-content/the-ol-element/grouping-ol.html.ini
@@ -69,3 +69,18 @@
[IDL and content attribute parse start of '7e2' correctly.]
expected: FAIL
+ [Default start value (if none provided) for reversed list = 1.]
+ expected: FAIL
+
+ [Default start value (if failed to parse) for reversed list = 1.]
+ expected: FAIL
+
+ [Default start value for reversed list = 1 (even with tons of other child elements).]
+ expected: FAIL
+
+ [Adding child element to reversed list does not change start value]
+ expected: FAIL
+
+ [Deleting child element from reversed list does not change start value]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini b/tests/wpt/metadata/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini
new file mode 100644
index 00000000000..f57fa77bf15
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html.ini
@@ -0,0 +1,6 @@
+[htmlanchorelement_noopener.html]
+ type: testharness
+ expected: ERROR
+ [Check that rel=noopener with target=_self does a normal load]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-1.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-1.html.ini
new file mode 100644
index 00000000000..d1d06476fa9
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-1.html.ini
@@ -0,0 +1,6 @@
+[script-onerror-insertion-point-1.html]
+ type: testharness
+ expected: TIMEOUT
+ [Test that the insertion point is defined in the error event of a parser-inserted script that actually started a fetch (but just had it fail).]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-2.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-2.html.ini
new file mode 100644
index 00000000000..0579394435a
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-2.html.ini
@@ -0,0 +1,6 @@
+[script-onerror-insertion-point-2.html]
+ type: testharness
+ expected: TIMEOUT
+ [Test that the insertion point is not defined in the error event of a\n parser-inserted script that has an unparseable URL]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/script-onload-insertion-point.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/script-onload-insertion-point.html.ini
new file mode 100644
index 00000000000..e71e15f1e26
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/script-onload-insertion-point.html.ini
@@ -0,0 +1,6 @@
+[script-onload-insertion-point.html]
+ type: testharness
+ expected: TIMEOUT
+ [Test that the insertion point is defined in the load event of a parser-inserted script.]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/html/semantics/tabular-data/the-table-element/remove-row.html.ini b/tests/wpt/metadata/html/semantics/tabular-data/the-table-element/remove-row.html.ini
new file mode 100644
index 00000000000..4939cb2245e
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/tabular-data/the-table-element/remove-row.html.ini
@@ -0,0 +1,5 @@
+[remove-row.html]
+ type: testharness
+ [deleteRow(-1) with no rows]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-exception.html.ini b/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-exception.html.ini
new file mode 100644
index 00000000000..16eab64d467
--- /dev/null
+++ b/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-exception.html.ini
@@ -0,0 +1,5 @@
+[callback-exception.html]
+ type: testharness
+ [requestIdleCallback callback exceptions are reported to error handler]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-iframe.html.ini b/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-iframe.html.ini
new file mode 100644
index 00000000000..a03d6526f51
--- /dev/null
+++ b/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-iframe.html.ini
@@ -0,0 +1,5 @@
+[callback-iframe.html]
+ type: testharness
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-invoked.html.ini b/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-invoked.html.ini
new file mode 100644
index 00000000000..1845bd519ec
--- /dev/null
+++ b/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-invoked.html.ini
@@ -0,0 +1,5 @@
+[callback-invoked.html]
+ type: testharness
+ [requestIdleCallback callback is invoked at least once before the timeout]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-multiple-calls.html.ini b/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-multiple-calls.html.ini
new file mode 100644
index 00000000000..c3b83c83b4d
--- /dev/null
+++ b/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-multiple-calls.html.ini
@@ -0,0 +1,8 @@
+[callback-multiple-calls.html]
+ type: testharness
+ [requestIdleCallback callbacks should be invoked in order (called iteratively)]
+ expected: FAIL
+
+ [requestIdleCallback callbacks should be invoked in order (called recursively)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-timeout.html.ini b/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-timeout.html.ini
new file mode 100644
index 00000000000..85673d7ab4d
--- /dev/null
+++ b/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-timeout.html.ini
@@ -0,0 +1,5 @@
+[callback-timeout.html]
+ type: testharness
+ [requestIdleCallback callback should time out]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/webappapis/idle-callbacks/cancel-invoked.html.ini b/tests/wpt/metadata/html/webappapis/idle-callbacks/cancel-invoked.html.ini
new file mode 100644
index 00000000000..444b53ec311
--- /dev/null
+++ b/tests/wpt/metadata/html/webappapis/idle-callbacks/cancel-invoked.html.ini
@@ -0,0 +1,8 @@
+[cancel-invoked.html]
+ type: testharness
+ [cancelIdleCallback does nothing if there is no callback with the given handle]
+ expected: FAIL
+
+ [A cancelled callback is never invoked]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/webappapis/idle-callbacks/idlharness.html.ini b/tests/wpt/metadata/html/webappapis/idle-callbacks/idlharness.html.ini
new file mode 100644
index 00000000000..7abbe7ccb3f
--- /dev/null
+++ b/tests/wpt/metadata/html/webappapis/idle-callbacks/idlharness.html.ini
@@ -0,0 +1,20 @@
+[idlharness.html]
+ type: testharness
+ [Window interface: operation requestIdleCallback(IdleRequestCallback,IdleRequestOptions)]
+ expected: FAIL
+
+ [Window interface: operation cancelIdleCallback(unsigned long)]
+ expected: FAIL
+
+ [Window interface: window must inherit property "requestIdleCallback" with the proper type (0)]
+ expected: FAIL
+
+ [Window interface: calling requestIdleCallback(IdleRequestCallback,IdleRequestOptions) on window with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Window interface: window must inherit property "cancelIdleCallback" with the proper type (1)]
+ expected: FAIL
+
+ [Window interface: calling cancelIdleCallback(unsigned long) on window with too few arguments must throw TypeError]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/webappapis/scripting/events/messageevent-constructor.https.html.ini b/tests/wpt/metadata/html/webappapis/scripting/events/messageevent-constructor.https.html.ini
new file mode 100644
index 00000000000..be450cad198
--- /dev/null
+++ b/tests/wpt/metadata/html/webappapis/scripting/events/messageevent-constructor.https.html.ini
@@ -0,0 +1,3 @@
+[messageevent-constructor.https.html]
+ type: testharness
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/mozilla-sync b/tests/wpt/metadata/mozilla-sync
index 54cf2b52036..7ba5d85c476 100644
--- a/tests/wpt/metadata/mozilla-sync
+++ b/tests/wpt/metadata/mozilla-sync
@@ -1 +1 @@
-d00639c55f9a342765483d347a3c29d4647f7411 \ No newline at end of file
+395981742475612eac7ef0bd484b4ae1bc1dd4a8 \ No newline at end of file
diff --git a/tests/wpt/metadata/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
index 5a8b17b252c..d2a41f6dde3 100644
--- a/tests/wpt/metadata/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[insecure-protocol.keep-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is stripped-referrer when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with keep-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
index 6486c515a6b..aa7ec0ba382 100644
--- a/tests/wpt/metadata/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
@@ -1,5 +1,6 @@
[insecure-protocol.no-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is stripped-referrer when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with no-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
index c19491b1b08..229985e7d03 100644
--- a/tests/wpt/metadata/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/no-referrer-when-downgrade/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[insecure-protocol.swap-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is stripped-referrer when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with swap-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
new file mode 100644
index 00000000000..2fd62426af3
--- /dev/null
+++ b/tests/wpt/metadata/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -0,0 +1,6 @@
+[generic.keep-origin-redirect.http.html]
+ type: testharness
+ expected: ERROR
+ [The referrer URL is omitted when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with keep-origin-redirect and when\n the target request is same-origin.]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
new file mode 100644
index 00000000000..fa0ae73704b
--- /dev/null
+++ b/tests/wpt/metadata/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
@@ -0,0 +1,6 @@
+[generic.no-redirect.http.html]
+ type: testharness
+ expected: ERROR
+ [The referrer URL is omitted when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with no-redirect and when\n the target request is same-origin.]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
new file mode 100644
index 00000000000..37986e818e8
--- /dev/null
+++ b/tests/wpt/metadata/referrer-policy/no-referrer/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -0,0 +1,6 @@
+[generic.swap-origin-redirect.http.html]
+ type: testharness
+ expected: ERROR
+ [The referrer URL is omitted when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with swap-origin-redirect and when\n the target request is same-origin.]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini
index 9779888b173..0855e75ee4e 100644
--- a/tests/wpt/metadata/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[same-origin-insecure.keep-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is stripped-referrer when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with keep-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini
index 9be071f3b14..7729e52746d 100644
--- a/tests/wpt/metadata/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini
@@ -1,5 +1,6 @@
[same-origin-insecure.no-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is stripped-referrer when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with no-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
index 239e18b55e3..1f1b6d8165a 100644
--- a/tests/wpt/metadata/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[same-origin-insecure.swap-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is origin when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with swap-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
index b45d809e90a..43031436a8a 100644
--- a/tests/wpt/metadata/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[generic.keep-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is origin when a\n document served over http requires an http\n sub-resource via img-tag using the attr-referrer\n delivery method with keep-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
index 4404c0df21d..ee76201d9ac 100644
--- a/tests/wpt/metadata/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
@@ -1,5 +1,6 @@
[generic.no-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is origin when a\n document served over http requires an http\n sub-resource via img-tag using the attr-referrer\n delivery method with no-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
index eabc3db0c45..11af6643a52 100644
--- a/tests/wpt/metadata/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/origin/attr-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[generic.swap-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is origin when a\n document served over http requires an http\n sub-resource via img-tag using the attr-referrer\n delivery method with swap-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
index 218a95656f6..f6de541b500 100644
--- a/tests/wpt/metadata/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[generic.keep-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is origin when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with keep-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
index fb7be2a4f64..07bb098274d 100644
--- a/tests/wpt/metadata/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
@@ -1,5 +1,6 @@
[generic.no-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is origin when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with no-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
index bd6c0a3eeeb..55f0f79a584 100644
--- a/tests/wpt/metadata/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/origin/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[generic.swap-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is origin when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with swap-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
index bc1357bbd93..a7682972f80 100644
--- a/tests/wpt/metadata/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[generic.keep-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is origin when a\n document served over http requires an http\n sub-resource via img-tag using the meta-referrer\n delivery method with keep-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
index db7a14d2aa3..8443755051a 100644
--- a/tests/wpt/metadata/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
@@ -1,5 +1,6 @@
[generic.no-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is origin when a\n document served over http requires an http\n sub-resource via img-tag using the meta-referrer\n delivery method with no-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
index 2e87dbf0fbc..791fb0947b2 100644
--- a/tests/wpt/metadata/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/origin/meta-referrer/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[generic.swap-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is origin when a\n document served over http requires an http\n sub-resource via img-tag using the meta-referrer\n delivery method with swap-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini
index 7b43c5b2729..b56fbd35227 100644
--- a/tests/wpt/metadata/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[same-origin-insecure.keep-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is stripped-referrer when a\n document served over http requires an http\n sub-resource via img-tag using the attr-referrer\n delivery method with keep-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini
index c94849cfab8..7997014cbee 100644
--- a/tests/wpt/metadata/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini
@@ -1,5 +1,6 @@
[same-origin-insecure.no-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is stripped-referrer when a\n document served over http requires an http\n sub-resource via img-tag using the attr-referrer\n delivery method with no-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
new file mode 100644
index 00000000000..1939c9c7c6b
--- /dev/null
+++ b/tests/wpt/metadata/referrer-policy/same-origin/attr-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
@@ -0,0 +1,6 @@
+[same-origin-insecure.swap-origin-redirect.http.html]
+ type: testharness
+ expected: ERROR
+ [The referrer URL is omitted when a\n document served over http requires an http\n sub-resource via img-tag using the attr-referrer\n delivery method with swap-origin-redirect and when\n the target request is same-origin.]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini
index 9779888b173..0855e75ee4e 100644
--- a/tests/wpt/metadata/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[same-origin-insecure.keep-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is stripped-referrer when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with keep-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini
index 9be071f3b14..7729e52746d 100644
--- a/tests/wpt/metadata/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini
@@ -1,5 +1,6 @@
[same-origin-insecure.no-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is stripped-referrer when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with no-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
new file mode 100644
index 00000000000..5d5bb923ff1
--- /dev/null
+++ b/tests/wpt/metadata/referrer-policy/same-origin/http-rp/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
@@ -0,0 +1,6 @@
+[same-origin-insecure.swap-origin-redirect.http.html]
+ type: testharness
+ expected: ERROR
+ [The referrer URL is omitted when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with swap-origin-redirect and when\n the target request is same-origin.]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini
index 689c6ff7e01..b07f53d3af9 100644
--- a/tests/wpt/metadata/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.keep-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[same-origin-insecure.keep-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is stripped-referrer when a\n document served over http requires an http\n sub-resource via img-tag using the meta-referrer\n delivery method with keep-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini
index 866b6909bcc..354c77ea229 100644
--- a/tests/wpt/metadata/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.no-redirect.http.html.ini
@@ -1,5 +1,6 @@
[same-origin-insecure.no-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is stripped-referrer when a\n document served over http requires an http\n sub-resource via img-tag using the meta-referrer\n delivery method with no-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
new file mode 100644
index 00000000000..02e6bfba68a
--- /dev/null
+++ b/tests/wpt/metadata/referrer-policy/same-origin/meta-referrer/same-origin/http-http/img-tag/same-origin-insecure.swap-origin-redirect.http.html.ini
@@ -0,0 +1,6 @@
+[same-origin-insecure.swap-origin-redirect.http.html]
+ type: testharness
+ expected: ERROR
+ [The referrer URL is omitted when a\n document served over http requires an http\n sub-resource via img-tag using the meta-referrer\n delivery method with swap-origin-redirect and when\n the target request is same-origin.]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html.ini
index 2f45a7b2556..3be9dd45879 100644
--- a/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[same-insecure.keep-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is stripped-referrer when a\n document served over http requires an http\n sub-resource via img-tag using the attr-referrer\n delivery method with keep-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html.ini
index bdde4f3e024..7adfba641a2 100644
--- a/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html.ini
@@ -1,5 +1,6 @@
[same-insecure.no-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is stripped-referrer when a\n document served over http requires an http\n sub-resource via img-tag using the attr-referrer\n delivery method with no-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html.ini
index 34aee35e3b0..6ef7ceb04e3 100644
--- a/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[same-insecure.swap-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is origin when a\n document served over http requires an http\n sub-resource via img-tag using the attr-referrer\n delivery method with swap-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html.ini
index 0dfac59316b..2ab5be97f07 100644
--- a/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[same-insecure.keep-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is stripped-referrer when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with keep-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html.ini
index 4df4961d3c1..a2d374e891a 100644
--- a/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html.ini
@@ -1,5 +1,6 @@
[same-insecure.no-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is stripped-referrer when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with no-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html.ini
index 2f011b0126b..b4542357857 100644
--- a/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/http-rp/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[same-insecure.swap-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is origin when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with swap-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html.ini
index 94726eb94b4..0aebf7d841e 100644
--- a/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.keep-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[same-insecure.keep-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is stripped-referrer when a\n document served over http requires an http\n sub-resource via img-tag using the meta-referrer\n delivery method with keep-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html.ini
index fd6d65484d3..afaf93ee50c 100644
--- a/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.no-redirect.http.html.ini
@@ -1,5 +1,6 @@
[same-insecure.no-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is stripped-referrer when a\n document served over http requires an http\n sub-resource via img-tag using the meta-referrer\n delivery method with no-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html.ini
index 4210cd5eca1..6e0ba4c5559 100644
--- a/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/strict-origin-when-cross-origin/meta-referrer/same-origin/http-http/img-tag/same-insecure.swap-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[same-insecure.swap-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is origin when a\n document served over http requires an http\n sub-resource via img-tag using the meta-referrer\n delivery method with swap-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
index 625557351b7..9fe50f40fbe 100644
--- a/tests/wpt/metadata/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[insecure-protocol.keep-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is origin when a\n document served over http requires an http\n sub-resource via img-tag using the attr-referrer\n delivery method with keep-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
index 802febc9230..cd2004dd6cf 100644
--- a/tests/wpt/metadata/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
@@ -1,5 +1,6 @@
[insecure-protocol.no-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is origin when a\n document served over http requires an http\n sub-resource via img-tag using the attr-referrer\n delivery method with no-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
index 070cd72d2ae..a6f43823b19 100644
--- a/tests/wpt/metadata/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/strict-origin/attr-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[insecure-protocol.swap-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is origin when a\n document served over http requires an http\n sub-resource via img-tag using the attr-referrer\n delivery method with swap-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
index 8eeb7da8fcb..14c0d3a2269 100644
--- a/tests/wpt/metadata/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[insecure-protocol.keep-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is origin when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with keep-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
index 923d4df61de..bce41c16fa0 100644
--- a/tests/wpt/metadata/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
@@ -1,5 +1,6 @@
[insecure-protocol.no-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is origin when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with no-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
index bdab82ffa6f..a3f28899cd6 100644
--- a/tests/wpt/metadata/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/strict-origin/http-rp/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[insecure-protocol.swap-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is origin when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with swap-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
index 16932daf0de..f099e238424 100644
--- a/tests/wpt/metadata/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.keep-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[insecure-protocol.keep-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is origin when a\n document served over http requires an http\n sub-resource via img-tag using the meta-referrer\n delivery method with keep-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
index 3d221db9f00..b941abcb716 100644
--- a/tests/wpt/metadata/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.no-redirect.http.html.ini
@@ -1,5 +1,6 @@
[insecure-protocol.no-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is origin when a\n document served over http requires an http\n sub-resource via img-tag using the meta-referrer\n delivery method with no-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
index 97a2a11b5c8..45b99e0edb3 100644
--- a/tests/wpt/metadata/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/strict-origin/meta-referrer/same-origin/http-http/img-tag/insecure-protocol.swap-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[insecure-protocol.swap-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is origin when a\n document served over http requires an http\n sub-resource via img-tag using the meta-referrer\n delivery method with swap-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
index 1d208d1831a..f04ff25a128 100644
--- a/tests/wpt/metadata/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.keep-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[generic.keep-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is stripped-referrer when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with keep-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
index 710f7724511..8b5eee3a99b 100644
--- a/tests/wpt/metadata/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.no-redirect.http.html.ini
@@ -1,5 +1,6 @@
[generic.no-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is stripped-referrer when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with no-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini b/tests/wpt/metadata/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
index 1e9067d1446..4ea0023d50a 100644
--- a/tests/wpt/metadata/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
+++ b/tests/wpt/metadata/referrer-policy/unsafe-url/http-rp/same-origin/http-http/img-tag/generic.swap-origin-redirect.http.html.ini
@@ -1,5 +1,6 @@
[generic.swap-origin-redirect.http.html]
type: testharness
+ expected: ERROR
[The referrer URL is stripped-referrer when a\n document served over http requires an http\n sub-resource via img-tag using the http-rp\n delivery method with swap-origin-redirect and when\n the target request is same-origin.]
- expected: FAIL
+ expected: NOTRUN
diff --git a/tests/wpt/metadata/url/a-element-xhtml.xhtml.ini b/tests/wpt/metadata/url/a-element-xhtml.xhtml.ini
new file mode 100644
index 00000000000..a922573a689
--- /dev/null
+++ b/tests/wpt/metadata/url/a-element-xhtml.xhtml.ini
@@ -0,0 +1,8 @@
+[a-element-xhtml.xhtml]
+ type: testharness
+ [Parsing: <http://[::127.0.0.1\]> against <http://example.org/foo/bar>]
+ expected: FAIL
+
+ [Parsing: <http://[0:0:0:0:0:0:13.1.68.3\]> against <http://example.org/foo/bar>]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/url/a-element.html.ini b/tests/wpt/metadata/url/a-element.html.ini
new file mode 100644
index 00000000000..2ba0d5823e8
--- /dev/null
+++ b/tests/wpt/metadata/url/a-element.html.ini
@@ -0,0 +1,8 @@
+[a-element.html]
+ type: testharness
+ [Parsing: <http://[::127.0.0.1\]> against <http://example.org/foo/bar>]
+ expected: FAIL
+
+ [Parsing: <http://[0:0:0:0:0:0:13.1.68.3\]> against <http://example.org/foo/bar>]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/url/url-constructor.html.ini b/tests/wpt/metadata/url/url-constructor.html.ini
new file mode 100644
index 00000000000..6c177284507
--- /dev/null
+++ b/tests/wpt/metadata/url/url-constructor.html.ini
@@ -0,0 +1,8 @@
+[url-constructor.html]
+ type: testharness
+ [Parsing: <http://[::127.0.0.1\]> against <http://example.org/foo/bar>]
+ expected: FAIL
+
+ [Parsing: <http://[0:0:0:0:0:0:13.1.68.3\]> against <http://example.org/foo/bar>]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/url/url-setters.html.ini b/tests/wpt/metadata/url/url-setters.html.ini
index 8831fae8677..12c268fa20b 100644
--- a/tests/wpt/metadata/url/url-setters.html.ini
+++ b/tests/wpt/metadata/url/url-setters.html.ini
@@ -15,3 +15,384 @@
[Setting <a:/>.hash = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' No percent-encoding at all (!); nuls, tabs, and newlines are removed]
expected: FAIL
+ [<area>: Setting <a://example.net>.protocol = '' The empty string is not a valid scheme. Setter leaves the URL unchanged.]
+ expected: FAIL
+
+ [<area>: Setting <a://example.net>.protocol = 'b']
+ expected: FAIL
+
+ [<area>: Setting <a://example.net>.protocol = 'B' Upper-case ASCII is lower-cased]
+ expected: FAIL
+
+ [<area>: Setting <a://example.net>.protocol = 'é' Non-ASCII is rejected]
+ expected: FAIL
+
+ [<area>: Setting <a://example.net>.protocol = '0b' No leading digit]
+ expected: FAIL
+
+ [<area>: Setting <a://example.net>.protocol = '+b' No leading punctuation]
+ expected: FAIL
+
+ [<area>: Setting <a://example.net>.protocol = 'bC0+-.']
+ expected: FAIL
+
+ [<area>: Setting <a://example.net>.protocol = 'b,c' Only some punctuation is acceptable]
+ expected: FAIL
+
+ [<area>: Setting <a://example.net>.protocol = 'bé' Non-ASCII is rejected]
+ expected: FAIL
+
+ [URL: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special. Note: this may change, see https://github.com/whatwg/url/issues/104]
+ expected: FAIL
+
+ [<a>: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special. Note: this may change, see https://github.com/whatwg/url/issues/104]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net>.protocol = 'b' Can’t switch from special scheme to non-special. Note: this may change, see https://github.com/whatwg/url/issues/104]
+ expected: FAIL
+
+ [<area>: Setting <mailto:me@example.net>.protocol = 'http' Cannot-be-a-base URL doesn’t have a host, but URL in a special scheme must.]
+ expected: FAIL
+
+ [URL: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special. Note: this may change, see https://github.com/whatwg/url/issues/104]
+ expected: FAIL
+
+ [<a>: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special. Note: this may change, see https://github.com/whatwg/url/issues/104]
+ expected: FAIL
+
+ [<area>: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special. Note: this may change, see https://github.com/whatwg/url/issues/104]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net>.protocol = 'https:foo : bar' Stuff after the first ':' is ignored]
+ expected: FAIL
+
+ [<area>: Setting <data:text/html,<p>Test>.protocol = 'view-source+data:foo : bar' Stuff after the first ':' is ignored]
+ expected: FAIL
+
+ [<area>: Setting <file:///home/you/index.html>.username = 'me' No host means no username]
+ expected: FAIL
+
+ [<area>: Setting <unix:/run/foo.socket>.username = 'me' No host means no username]
+ expected: FAIL
+
+ [<area>: Setting <mailto:you@example.net>.username = 'me' Cannot-be-a-base means no username]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net>.username = 'me']
+ expected: FAIL
+
+ [<area>: Setting <http://:secret@example.net>.username = 'me']
+ expected: FAIL
+
+ [<area>: Setting <http://me@example.net>.username = '']
+ expected: FAIL
+
+ [<area>: Setting <http://me:secret@example.net>.username = '']
+ expected: FAIL
+
+ [<area>: Setting <http://example.net>.username = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set.]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net>.username = '%c3%89té' Bytes already percent-encoded are left as-is.]
+ expected: FAIL
+
+ [<area>: Setting <file:///home/me/index.html>.password = 'secret' No host means no password]
+ expected: FAIL
+
+ [<area>: Setting <unix:/run/foo.socket>.password = 'secret' No host means no password]
+ expected: FAIL
+
+ [<area>: Setting <mailto:me@example.net>.password = 'secret' Cannot-be-a-base means no password]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net>.password = 'secret']
+ expected: FAIL
+
+ [<area>: Setting <http://me@example.net>.password = 'secret']
+ expected: FAIL
+
+ [<area>: Setting <http://:secret@example.net>.password = '']
+ expected: FAIL
+
+ [<area>: Setting <http://me:secret@example.net>.password = '']
+ expected: FAIL
+
+ [<area>: Setting <http://example.net>.password = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' UTF-8 percent encoding with the userinfo encode set.]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net>.password = '%c3%89té' Bytes already percent-encoded are left as-is.]
+ expected: FAIL
+
+ [<area>: Setting <mailto:me@example.net>.host = 'example.com' Cannot-be-a-base means no host]
+ expected: FAIL
+
+ [<area>: Setting <data:text/plain,Stuff>.host = 'example.net' Cannot-be-a-base means no password]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net>.host = 'example.com:8080']
+ expected: FAIL
+
+ [<area>: Setting <http://example.net:8080>.host = 'example.com' Port number is unchanged if not specified in the new value]
+ expected: FAIL
+
+ [URL: Setting <http://example.net:8080>.host = 'example.com:' Port number is unchanged if not specified]
+ expected: FAIL
+
+ [<a>: Setting <http://example.net:8080>.host = 'example.com:' Port number is unchanged if not specified]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net:8080>.host = 'example.com:' Port number is unchanged if not specified]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net>.host = '' The empty host is not valid for special schemes]
+ expected: FAIL
+
+ [<area>: Setting <view-source+http://example.net/foo>.host = '' The empty host is OK for non-special schemes]
+ expected: FAIL
+
+ [<area>: Setting <a:/foo>.host = 'example.net' Path-only URLs can gain a host]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net>.host = '0x7F000001:8080' IPv4 address syntax is normalized]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net>.host = '[::0:01\]:2' IPv6 address syntax is normalized]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net>.host = 'example.com:80' Default port number is removed]
+ expected: FAIL
+
+ [<area>: Setting <https://example.net>.host = 'example.com:443' Default port number is removed]
+ expected: FAIL
+
+ [<area>: Setting <https://example.net>.host = 'example.com:80' Default port number is only removed for the relevant scheme]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.host = 'example.com/stuff' Stuff after a / delimiter is ignored]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.host = 'example.com:8080/stuff' Stuff after a / delimiter is ignored]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.host = 'example.com?stuff' Stuff after a ? delimiter is ignored]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.host = 'example.com:8080?stuff' Stuff after a ? delimiter is ignored]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.host = 'example.com#stuff' Stuff after a # delimiter is ignored]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.host = 'example.com:8080#stuff' Stuff after a # delimiter is ignored]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.host = 'example.com\\stuff' Stuff after a \\ delimiter is ignored for special schemes]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.host = 'example.com:8080\\stuff' Stuff after a \\ delimiter is ignored for special schemes]
+ expected: FAIL
+
+ [<area>: Setting <view-source+http://example.net/path>.host = 'example.com\\stuff' \\ is not a delimiter for non-special schemes, and it’s invalid in a domain]
+ expected: FAIL
+
+ [<area>: Setting <view-source+http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.host = 'example.com:8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.host = 'example.com:8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.host = 'example.com:65535' Port numbers are 16 bit integers]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.host = 'example.com:65536' Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.]
+ expected: FAIL
+
+ [<area>: Setting <mailto:me@example.net>.hostname = 'example.com' Cannot-be-a-base means no host]
+ expected: FAIL
+
+ [<area>: Setting <data:text/plain,Stuff>.hostname = 'example.net' Cannot-be-a-base means no password]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net:8080>.hostname = 'example.com']
+ expected: FAIL
+
+ [<area>: Setting <http://example.net>.hostname = '' The empty host is not valid for special schemes]
+ expected: FAIL
+
+ [<area>: Setting <view-source+http://example.net/foo>.hostname = '' The empty host is OK for non-special schemes]
+ expected: FAIL
+
+ [<area>: Setting <a:/foo>.hostname = 'example.net' Path-only URLs can gain a host]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net:8080>.hostname = '0x7F000001' IPv4 address syntax is normalized]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net>.hostname = '[::0:01\]' IPv6 address syntax is normalized]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.hostname = 'example.com:8080' Stuff after a : delimiter is ignored]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net:8080/path>.hostname = 'example.com:' Stuff after a : delimiter is ignored]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.hostname = 'example.com/stuff' Stuff after a / delimiter is ignored]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.hostname = 'example.com?stuff' Stuff after a ? delimiter is ignored]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.hostname = 'example.com#stuff' Stuff after a # delimiter is ignored]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.hostname = 'example.com\\stuff' Stuff after a \\ delimiter is ignored for special schemes]
+ expected: FAIL
+
+ [<area>: Setting <view-source+http://example.net/path>.hostname = 'example.com\\stuff' \\ is not a delimiter for non-special schemes, and it’s invalid in a domain]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net>.port = '8080']
+ expected: FAIL
+
+ [<area>: Setting <http://example.net:8080>.port = '' Port number is removed if empty is the new value]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net:8080>.port = '80' Default port number is removed]
+ expected: FAIL
+
+ [<area>: Setting <https://example.net:4433>.port = '443' Default port number is removed]
+ expected: FAIL
+
+ [<area>: Setting <https://example.net>.port = '80' Default port number is only removed for the relevant scheme]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.port = '8080/stuff' Stuff after a / delimiter is ignored]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.port = '8080?stuff' Stuff after a ? delimiter is ignored]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.port = '8080#stuff' Stuff after a # delimiter is ignored]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.port = '8080\\stuff' Stuff after a \\ delimiter is ignored for special schemes]
+ expected: FAIL
+
+ [<area>: Setting <view-source+http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.port = '8080stuff2' Anything other than ASCII digit stops the port parser in a setter but is not an error]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.port = '8080+2' Anything other than ASCII digit stops the port parser in a setter but is not an error]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/path>.port = '65535' Port numbers are 16 bit integers]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net:8080/path>.port = '65536' Port numbers are 16 bit integers, overflowing is an error]
+ expected: FAIL
+
+ [<area>: Setting <mailto:me@example.net>.pathname = '/foo' Cannot-be-a-base don’t have a path]
+ expected: FAIL
+
+ [<area>: Setting <unix:/run/foo.socket?timeout=10>.pathname = '/var/log/../run/bar.socket']
+ expected: FAIL
+
+ [<area>: Setting <https://example.net#nav>.pathname = 'home']
+ expected: FAIL
+
+ [<area>: Setting <https://example.net#nav>.pathname = '../home']
+ expected: FAIL
+
+ [<area>: Setting <http://example.net/home?lang=fr#nav>.pathname = '\\a\\%2E\\b\\%2e.\\c' \\ is a segment delimiter for 'special' URLs]
+ expected: FAIL
+
+ [<area>: Setting <view-source+http://example.net/home?lang=fr#nav>.pathname = '\\a\\%2E\\b\\%2e.\\c' \\ is *not* a segment delimiter for non-'special' URLs]
+ expected: FAIL
+
+ [URL: Setting <a:/>.pathname = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed.]
+ expected: FAIL
+
+ [<a>: Setting <a:/>.pathname = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed.]
+ expected: FAIL
+
+ [<area>: Setting <a:/>.pathname = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' UTF-8 percent encoding with the default encode set. Tabs and newlines are removed.]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net>.pathname = '%2e%2E%c3%89té' Bytes already percent-encoded are left as-is, except %2E.]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net>.pathname = '?' ? needs to be encoded]
+ expected: FAIL
+
+ [<area>: Setting <https://example.net#nav>.search = 'lang=fr']
+ expected: FAIL
+
+ [<area>: Setting <https://example.net?lang=en-US#nav>.search = 'lang=fr']
+ expected: FAIL
+
+ [<area>: Setting <https://example.net?lang=en-US#nav>.search = '?lang=fr']
+ expected: FAIL
+
+ [<area>: Setting <https://example.net?lang=en-US#nav>.search = '??lang=fr']
+ expected: FAIL
+
+ [<area>: Setting <https://example.net?lang=en-US#nav>.search = '?']
+ expected: FAIL
+
+ [<area>: Setting <https://example.net?lang=en-US#nav>.search = '']
+ expected: FAIL
+
+ [<area>: Setting <https://example.net?lang=en-US>.search = '']
+ expected: FAIL
+
+ [<area>: Setting <https://example.net>.search = '']
+ expected: FAIL
+
+ [URL: Setting <a:/>.search = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed.]
+ expected: FAIL
+
+ [<a>: Setting <a:/>.search = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed.]
+ expected: FAIL
+
+ [<area>: Setting <a:/>.search = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed.]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is]
+ expected: FAIL
+
+ [<area>: Setting <https://example.net>.hash = 'main']
+ expected: FAIL
+
+ [<area>: Setting <https://example.net#nav>.hash = 'main']
+ expected: FAIL
+
+ [<area>: Setting <https://example.net?lang=en-US>.hash = '##nav']
+ expected: FAIL
+
+ [<area>: Setting <https://example.net?lang=en-US#nav>.hash = '#main']
+ expected: FAIL
+
+ [<area>: Setting <https://example.net?lang=en-US#nav>.hash = '#']
+ expected: FAIL
+
+ [<area>: Setting <https://example.net?lang=en-US#nav>.hash = '']
+ expected: FAIL
+
+ [URL: Setting <a:/>.hash = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' No percent-encoding at all (!); nuls, tabs, and newlines are removed]
+ expected: FAIL
+
+ [<a>: Setting <a:/>.hash = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' No percent-encoding at all (!); nuls, tabs, and newlines are removed]
+ expected: FAIL
+
+ [<area>: Setting <a:/>.hash = '\x00\x01\t\n\r\x1f !"#$%&'()*+,-./09:;<=>?@AZ[\\\]^_`az{|}~€Éé' No percent-encoding at all (!); nuls, tabs, and newlines are removed]
+ expected: FAIL
+
+ [<area>: Setting <http://example.net>.hash = '%c3%89té' Bytes already percent-encoded are left as-is]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/websockets/multi-globals/message-received.html.ini b/tests/wpt/metadata/websockets/multi-globals/message-received.html.ini
new file mode 100644
index 00000000000..7c5c35722cf
--- /dev/null
+++ b/tests/wpt/metadata/websockets/multi-globals/message-received.html.ini
@@ -0,0 +1,8 @@
+[message-received.html]
+ type: testharness
+ [ArrayBuffer should be created in the relevant realm of the WebSocket]
+ expected: FAIL
+
+ [Blob should be created in the relevant realm of the WebSocket]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/workers/constructors/Worker/DedicatedWorkerGlobalScope-members.worker.js.ini b/tests/wpt/metadata/workers/constructors/Worker/DedicatedWorkerGlobalScope-members.worker.js.ini
index 71011a2a4ca..e15edf551e2 100644
--- a/tests/wpt/metadata/workers/constructors/Worker/DedicatedWorkerGlobalScope-members.worker.js.ini
+++ b/tests/wpt/metadata/workers/constructors/Worker/DedicatedWorkerGlobalScope-members.worker.js.ini
@@ -1,4 +1,4 @@
-[DedicatedWorkerGlobalScope-members.worker]
+[DedicatedWorkerGlobalScope-members.worker.html]
type: testharness
[existence of onoffline]
expected: FAIL
diff --git a/tests/wpt/metadata/workers/constructors/Worker/expected-self-properties.worker.js.ini b/tests/wpt/metadata/workers/constructors/Worker/expected-self-properties.worker.js.ini
index 1e27dc99102..4b41f263de2 100644
--- a/tests/wpt/metadata/workers/constructors/Worker/expected-self-properties.worker.js.ini
+++ b/tests/wpt/metadata/workers/constructors/Worker/expected-self-properties.worker.js.ini
@@ -1,7 +1,8 @@
-[expected-self-properties.worker]
+[expected-self-properties.worker.html]
type: testharness
[existence of MessageChannel]
expected: FAIL
[existence of SharedWorker]
expected: FAIL
+
diff --git a/tests/wpt/metadata/workers/data-url-shared.html.ini b/tests/wpt/metadata/workers/data-url-shared.html.ini
new file mode 100644
index 00000000000..8ca363c84bd
--- /dev/null
+++ b/tests/wpt/metadata/workers/data-url-shared.html.ini
@@ -0,0 +1,5 @@
+[data-url-shared.html]
+ type: testharness
+ [data URL shared worker]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/workers/interfaces.worker.js.ini b/tests/wpt/metadata/workers/interfaces.worker.js.ini
index a3335ec02ae..9c663a5335d 100644
--- a/tests/wpt/metadata/workers/interfaces.worker.js.ini
+++ b/tests/wpt/metadata/workers/interfaces.worker.js.ini
@@ -1,71 +1,3 @@
-[interfaces.worker]
+[interfaces.worker.html]
type: testharness
- expected:
- if os == "mac": TIMEOUT
- if os == "linux": CRASH
- [WorkerGlobalScope interface: operation close()]
- expected: FAIL
-
- [WorkerGlobalScope interface: attribute onerror]
- expected: FAIL
-
- [WorkerGlobalScope interface: attribute onlanguagechange]
- expected: FAIL
-
- [WorkerGlobalScope interface: attribute onoffline]
- expected: FAIL
-
- [WorkerGlobalScope interface: attribute ononline]
- expected: FAIL
-
- [DedicatedWorkerGlobalScope interface: operation postMessage(any,[object Object\])]
- expected: FAIL
-
- [DedicatedWorkerGlobalScope interface: attribute onmessage]
- expected: FAIL
-
- [WorkerGlobalScope interface: self must inherit property "onlanguagechange" with the proper type (4)]
- expected: FAIL
-
- [WorkerGlobalScope interface: self must inherit property "onoffline" with the proper type (5)]
- expected: FAIL
-
- [WorkerGlobalScope interface: self must inherit property "ononline" with the proper type (6)]
- expected: FAIL
-
- [WorkerNavigator interface: attribute languages]
- expected: FAIL
-
- [WorkerNavigator interface: attribute onLine]
- expected: FAIL
-
- [WorkerLocation interface: attribute origin]
- expected: FAIL
-
- [WorkerLocation interface: self.location must inherit property "origin" with the proper type (1)]
- expected: FAIL
-
- [WorkerNavigator interface: self.navigator must inherit property "languages" with the proper type (7)]
- expected: FAIL
-
- [WorkerNavigator interface: self.navigator must inherit property "onLine" with the proper type (8)]
- expected: FAIL
-
- [EventTarget interface: existence and properties of interface object]
- expected: FAIL
-
- [WorkerGlobalScope interface: existence and properties of interface object]
- expected: FAIL
-
- [DedicatedWorkerGlobalScope interface: existence and properties of interface object]
- expected: FAIL
-
- [WorkerNavigator interface: existence and properties of interface object]
- expected: FAIL
-
- [WorkerLocation interface: existence and properties of interface object]
- expected: FAIL
-
- [WorkerGlobalScope interface: self must inherit property "close" with the proper type (2)]
- expected: FAIL
-
+ disabled: https://github.com/servo/servo/issues/12654
diff --git a/tests/wpt/metadata/workers/interfaces/WorkerUtils/navigator/window-only.worker.js.ini b/tests/wpt/metadata/workers/interfaces/WorkerUtils/navigator/window-only.worker.js.ini
deleted file mode 100644
index 33a27f8a6fd..00000000000
--- a/tests/wpt/metadata/workers/interfaces/WorkerUtils/navigator/window-only.worker.js.ini
+++ /dev/null
@@ -1,11 +0,0 @@
-[window-only.worker]
- type: testharness
- [NavigatorID properties exposed only for Window: appCodeName]
- expected: FAIL
-
- [NavigatorID properties exposed only for Window: product]
- expected: FAIL
-
- [NavigatorID properties exposed only for Window: taintEnabled]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/workers/semantics/interface-objects/001.worker.js.ini b/tests/wpt/metadata/workers/semantics/interface-objects/001.worker.js.ini
index 60807857f7a..bf57cc0f245 100644
--- a/tests/wpt/metadata/workers/semantics/interface-objects/001.worker.js.ini
+++ b/tests/wpt/metadata/workers/semantics/interface-objects/001.worker.js.ini
@@ -1,4 +1,4 @@
-[001.worker]
+[001.worker.html]
type: testharness
[The SharedWorker interface object should be exposed.]
expected: FAIL
@@ -9,21 +9,9 @@
[The MessageChannel interface object should be exposed.]
expected: FAIL
- [The CanvasProxy interface object should be exposed.]
- expected: FAIL
-
[The ImageBitmap interface object should be exposed.]
expected: FAIL
- [The DrawingStyle interface object should be exposed.]
- expected: FAIL
-
- [The Path interface object should be exposed.]
- expected: FAIL
-
- [The TextMetrics interface object should be exposed.]
- expected: FAIL
-
[The CanvasPath interface object should be exposed.]
expected: FAIL
@@ -80,3 +68,4 @@
[The IDBTransaction interface object should be exposed.]
expected: FAIL
+
diff --git a/tests/wpt/metadata/workers/semantics/interface-objects/002.worker.js.ini b/tests/wpt/metadata/workers/semantics/interface-objects/002.worker.js.ini
index 9d9c868c272..d05ef098814 100644
--- a/tests/wpt/metadata/workers/semantics/interface-objects/002.worker.js.ini
+++ b/tests/wpt/metadata/workers/semantics/interface-objects/002.worker.js.ini
@@ -1,4 +1,4 @@
-[002.worker]
+[002.worker.html]
type: testharness
[The Location interface object should not be exposed.]
expected: FAIL
diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json
index 4752ad4381f..26d7ae9189b 100644
--- a/tests/wpt/mozilla/meta/MANIFEST.json
+++ b/tests/wpt/mozilla/meta/MANIFEST.json
@@ -8105,7 +8105,7 @@
"mozilla/interfaces.worker.js": [
{
"path": "mozilla/interfaces.worker.js",
- "url": "/_mozilla/mozilla/interfaces.worker"
+ "url": "/_mozilla/mozilla/interfaces.worker.html"
}
],
"mozilla/iterable.html": [
diff --git a/tests/wpt/mozilla/meta/css/matchMedia.html.ini b/tests/wpt/mozilla/meta/css/matchMedia.html.ini
index 4c3498a53a7..41b0d9b51c6 100644
--- a/tests/wpt/mozilla/meta/css/matchMedia.html.ini
+++ b/tests/wpt/mozilla/meta/css/matchMedia.html.ini
@@ -1,6 +1,5 @@
[matchMedia.html]
type: testharness
- expected: OK
[window.matchMedia exists]
expected: FAIL
diff --git a/tests/wpt/web-platform-tests/.gitignore b/tests/wpt/web-platform-tests/.gitignore
index 0274bf6ed95..b70cb0f2b34 100644
--- a/tests/wpt/web-platform-tests/.gitignore
+++ b/tests/wpt/web-platform-tests/.gitignore
@@ -11,3 +11,4 @@ scratch
testharness_runner.html
webdriver/.idea
.vscode/
+.DS_Store
diff --git a/tests/wpt/web-platform-tests/.travis.yml b/tests/wpt/web-platform-tests/.travis.yml
index d2f88f203fa..d2ed86edd56 100644
--- a/tests/wpt/web-platform-tests/.travis.yml
+++ b/tests/wpt/web-platform-tests/.travis.yml
@@ -1,14 +1,50 @@
-sudo: false # cause Travis to start builds much faster
+dist: trusty
language: python
-python:
- - "2.7"
+addons:
+ hosts:
+ - web-platform.test
+ - www.web-platform.test
+ - www1.web-platform.test
+ - www2.web-platform.test
+ - xn--n8j6ds53lwwkrqhv28a.web-platform.test
+ - xn--lve-6lad.web-platform.test
before_install:
- git submodule update --init --recursive
-# command to run tests, e.g. python setup.py test
+ - export DISPLAY=:99.0
+ - sh -e /etc/init.d/xvfb start
+install:
+ - pip install -U setuptools
+ - pip install -U requests
+matrix:
+ include:
+ - os: linux
+ python: "2.7"
+ env:
+ - SCRIPT=ci_lint.sh
+ - os: linux
+ python: "2.7"
+ addons:
+ apt:
+ packages:
+ - libnss3-tools
+ env:
+ - secure: "YTSXPwI0DyCA1GhYrLT9KMEV6b7QQKuEeaQgeFDP38OTzJ1+cIj3CC4SRNqbnJ/6SJwPGcdqSxLuV8m4e5HFFnyCcQnJe6h8EMsTehZ7W3j/fP9UYrJqYqvGpe3Vj3xblO5pwBYmq7sg3jAmmuCgAgOW6VGf7cRMucrsmFeo7VM="
+ - SCRIPT=ci_stability.sh
+ - PRODUCT=firefox
+ - os: linux
+ sudo: required
+ python: "2.7"
+ addons:
+ apt:
+ packages:
+ - libappindicator1
+ - fonts-liberation
+ env:
+ - secure: "YTSXPwI0DyCA1GhYrLT9KMEV6b7QQKuEeaQgeFDP38OTzJ1+cIj3CC4SRNqbnJ/6SJwPGcdqSxLuV8m4e5HFFnyCcQnJe6h8EMsTehZ7W3j/fP9UYrJqYqvGpe3Vj3xblO5pwBYmq7sg3jAmmuCgAgOW6VGf7cRMucrsmFeo7VM="
+ - SCRIPT=ci_stability.sh
+ - PRODUCT=chrome
script:
- - ./lint
- - ./manifest
- - ./diff-manifest.py
+ - bash $SCRIPT
notifications:
email:
on_success: never
diff --git a/tests/wpt/web-platform-tests/2dcontext/compositing/2d.composite.globalAlpha.canvascopy.html b/tests/wpt/web-platform-tests/2dcontext/compositing/2d.composite.globalAlpha.canvascopy.html
new file mode 100644
index 00000000000..e7978c89137
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/compositing/2d.composite.globalAlpha.canvascopy.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.composite.globalAlpha.canvascopy</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.composite.globalAlpha.canvascopy</h1>
+<p class="desc"></p>
+
+
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="/images/green-100x50.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+var canvas2 = document.createElement('canvas');
+canvas2.width = 100;
+canvas2.height = 50;
+var ctx2 = canvas2.getContext('2d');
+ctx2.fillStyle = '#0f0';
+ctx2.fillRect(0, 0, 100, 50);
+
+ctx.fillStyle = '#f00';
+ctx.fillRect(0, 0, 100, 50);
+
+ctx.globalCompositeOperation = 'copy'
+ctx.globalAlpha = 0.51;
+ctx.drawImage(canvas2, 0, 0);
+_assertPixelApprox(canvas, 50,25, 0,255,0,130, "50,25", "0,255,0,130", 2);
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.html
new file mode 100644
index 00000000000..3dbda598b63
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-hsl-1</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-hsl-1</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-hsl-1.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'hsl(120 100.0% 50.0%)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.png
new file mode 100644
index 00000000000..2733836c998
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-1.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.html
new file mode 100644
index 00000000000..25e98dc794c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-hsl-2</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-hsl-2</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-hsl-2.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'hsl(120 100.0% 50.0% / 0.2)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.png
new file mode 100644
index 00000000000..c5661de82b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-2.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.html
new file mode 100644
index 00000000000..de600d94bd8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-hsl-3</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-hsl-3</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-hsl-3.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'hsl(120.0, 100.0%, 50.0%, 0.2)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.png
new file mode 100644
index 00000000000..c5661de82b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-3.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.html
new file mode 100644
index 00000000000..52d917c6cf7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-hsl-4</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-hsl-4</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-hsl-4.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'hsl(120.0, 100.0%, 50.0%, 20%)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.png
new file mode 100644
index 00000000000..c5661de82b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-4.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.html
new file mode 100644
index 00000000000..4f65b3dea2a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-hsl-5</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-hsl-5</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-hsl-5.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'hsl(120deg, 100.0%, 50.0%, 0.2)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.png
new file mode 100644
index 00000000000..c5661de82b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-5.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.html
new file mode 100644
index 00000000000..19aa5974f2c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-hsl-6</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-hsl-6</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-hsl-6.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'hsl(120deg, 100.0%, 50.0%)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.png
new file mode 100644
index 00000000000..2733836c998
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-6.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.html
new file mode 100644
index 00000000000..d9b6a3c98c3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-hsl-7</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-hsl-7</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-hsl-7.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'hsl(133.33333333grad, 100.0%, 50.0%)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.png
new file mode 100644
index 00000000000..2733836c998
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-7.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.html
new file mode 100644
index 00000000000..24e2b51830c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-hsl-8</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-hsl-8</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-hsl-8.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'hsl(2.0943951024rad, 100.0%, 50.0%)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.png
new file mode 100644
index 00000000000..2733836c998
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-8.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.html
new file mode 100644
index 00000000000..9da548f3e72
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-hsl-9</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-hsl-9</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-hsl-9.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'hsl(0.3333333333turn, 100.0%, 50.0%)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.png
new file mode 100644
index 00000000000..2733836c998
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsl-9.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.html
new file mode 100644
index 00000000000..65881eeb15f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-hsla-1</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-hsla-1</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-hsla-1.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'hsl(120 100.0% 50.0%)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.png
new file mode 100644
index 00000000000..2733836c998
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-1.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.html
new file mode 100644
index 00000000000..91f5e345959
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-hsla-2</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-hsla-2</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-hsla-2.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'hsl(120 100.0% 50.0% / 0.2)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.png
new file mode 100644
index 00000000000..c5661de82b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-2.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.html
new file mode 100644
index 00000000000..eb6c69526e9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-hsla-3</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-hsla-3</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-hsla-3.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'hsl(120.0, 100.0%, 50.0%, 0.2)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.png
new file mode 100644
index 00000000000..c5661de82b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-3.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.html
new file mode 100644
index 00000000000..ce5bdef7ac3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-hsla-4</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-hsla-4</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-hsla-4.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'hsl(120.0, 100.0%, 50.0%, 20%)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.png
new file mode 100644
index 00000000000..c5661de82b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-4.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.html
new file mode 100644
index 00000000000..47b426daf54
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-hsla-5</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-hsla-5</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-hsla-5.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'hsl(120deg, 100.0%, 50.0%, 0.2)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.png
new file mode 100644
index 00000000000..c5661de82b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-5.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.html
new file mode 100644
index 00000000000..6dc5e7aef3f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-hsla-6</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-hsla-6</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-hsla-6.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'hsl(120deg, 100.0%, 50.0%)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.png
new file mode 100644
index 00000000000..2733836c998
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-6.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.html
new file mode 100644
index 00000000000..a1069fea9fe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-hsla-7</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-hsla-7</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-hsla-7.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'hsl(133.33333333grad, 100.0%, 50.0%)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.png
new file mode 100644
index 00000000000..2733836c998
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-7.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.html
new file mode 100644
index 00000000000..7d04b1ca552
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-hsla-8</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-hsla-8</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-hsla-8.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'hsl(2.0943951024rad, 100.0%, 50.0%)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.png
new file mode 100644
index 00000000000..2733836c998
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-8.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.html
new file mode 100644
index 00000000000..0a10c6e61c5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-hsla-9</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-hsla-9</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-hsla-9.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'hsl(0.3333333333turn, 100.0%, 50.0%)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.png
new file mode 100644
index 00000000000..2733836c998
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-hsla-9.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.html
new file mode 100644
index 00000000000..fd6376e1a2a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-rgb-1</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-rgb-1</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-rgb-1.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'rgb(0, 255.0, 0)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.png
new file mode 100644
index 00000000000..2733836c998
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-1.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.html
new file mode 100644
index 00000000000..ec0f62344f0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-rgb-2</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-rgb-2</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-rgb-2.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'rgb(0, 255, 0, 0.2)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.png
new file mode 100644
index 00000000000..c5661de82b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-2.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.html
new file mode 100644
index 00000000000..980abef36c4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-rgb-3</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-rgb-3</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-rgb-3.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'rgb(0, 255, 0, 20%)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.png
new file mode 100644
index 00000000000..c5661de82b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-3.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.html
new file mode 100644
index 00000000000..a2543b566ab
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-rgb-4</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-rgb-4</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-rgb-4.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'rgb(0 255 0)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.png
new file mode 100644
index 00000000000..2733836c998
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-4.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.html
new file mode 100644
index 00000000000..6b310d763ba
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-rgb-5</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-rgb-5</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-rgb-5.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'rgb(0 255 0 / 0.2)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.png
new file mode 100644
index 00000000000..c5661de82b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-5.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.html
new file mode 100644
index 00000000000..d38f7e0ac0e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-rgb-6</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-rgb-6</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-rgb-6.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'rgb(0 255 0 / 20%)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.png
new file mode 100644
index 00000000000..c5661de82b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgb-6.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.html
new file mode 100644
index 00000000000..83dfb2f86af
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-rgba-1</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-rgba-1</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-rgba-1.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'rgba(0, 255.0, 0)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.png
new file mode 100644
index 00000000000..2733836c998
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-1.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-2.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-2.html
new file mode 100644
index 00000000000..390d0bd0fab
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-2.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-rgba-2</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-rgba-2</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-rgba-2.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'rgba(0, 255, 0, 0.2)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-2.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-2.png
new file mode 100644
index 00000000000..c5661de82b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-2.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.html
new file mode 100644
index 00000000000..f0fd88ee6c3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-rgba-3</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-rgba-3</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-rgba-3.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'rgba(0, 255, 0, 20%)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.png
new file mode 100644
index 00000000000..c5661de82b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-3.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.html
new file mode 100644
index 00000000000..bd3e8edb2f8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-rgba-4</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-rgba-4</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-rgba-4.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'rgba(0 255 0)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.png
new file mode 100644
index 00000000000..2733836c998
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-4.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.html
new file mode 100644
index 00000000000..0287ef693cd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-rgba-5</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-rgba-5</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-rgba-5.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'rgba(0 255 0 / 0.2)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.png
new file mode 100644
index 00000000000..c5661de82b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-5.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.html
new file mode 100644
index 00000000000..09042c8778e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.css-color-4-rgba-6</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.css-color-4-rgba-6</h1>
+<p class="desc"></p>
+
+<p class="notes">
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="2d.fillStyle.parse.css-color-4-rgba-6.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#f00';
+ctx.fillStyle = 'rgba(0 255 0 / 20%)';
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,51, "50,25", "0,255,0,51");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.png b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.png
new file mode 100644
index 00000000000..c5661de82b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.css-color-4-rgba-6.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-1.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-1.html
new file mode 100644
index 00000000000..25bab97b05d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-1.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.invalid.css-color-4-hsl-1</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.invalid.css-color-4-hsl-1</h1>
+<p class="desc"></p>
+
+
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="/images/green-100x50.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#0f0';
+try { ctx.fillStyle = 'hsl(0, 100%, 50% / 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-2.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-2.html
new file mode 100644
index 00000000000..f4a47f5d8aa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-2.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.invalid.css-color-4-hsl-2</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.invalid.css-color-4-hsl-2</h1>
+<p class="desc"></p>
+
+
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="/images/green-100x50.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#0f0';
+try { ctx.fillStyle = 'hsl(0 100% 50%, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-7.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-3.html
index 06580f64816..490c66f362e 100644
--- a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-7.html
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-3.html
@@ -1,13 +1,13 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
-<title>Canvas test: 2d.fillStyle.parse.invalid.rgba-7</title>
+<title>Canvas test: 2d.fillStyle.parse.invalid.css-color-4-hsl-3</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/canvas-tests.js"></script>
<link rel="stylesheet" href="/common/canvas-tests.css">
<body class="show_output">
-<h1>2d.fillStyle.parse.invalid.rgba-7</h1>
+<h1>2d.fillStyle.parse.invalid.css-color-4-hsl-3</h1>
<p class="desc"></p>
@@ -21,7 +21,7 @@ _addTest(function(canvas, ctx) {
ctx.fillStyle = '#0f0';
-try { ctx.fillStyle = 'rgba(255, 0, 0, '; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+try { ctx.fillStyle = 'hsl(0, 100% 50%)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
ctx.fillRect(0, 0, 100, 50);
_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-7.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-4.html
index bc0bb5ef6f6..a3ab91c16a8 100644
--- a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-7.html
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-4.html
@@ -1,13 +1,13 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
-<title>Canvas test: 2d.fillStyle.parse.invalid.rgb-7</title>
+<title>Canvas test: 2d.fillStyle.parse.invalid.css-color-4-hsl-4</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/canvas-tests.js"></script>
<link rel="stylesheet" href="/common/canvas-tests.css">
<body class="show_output">
-<h1>2d.fillStyle.parse.invalid.rgb-7</h1>
+<h1>2d.fillStyle.parse.invalid.css-color-4-hsl-4</h1>
<p class="desc"></p>
@@ -21,7 +21,7 @@ _addTest(function(canvas, ctx) {
ctx.fillStyle = '#0f0';
-try { ctx.fillStyle = 'rgb(255, 0, 0, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+try { ctx.fillStyle = 'hsl(0 100% 50% /)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
ctx.fillRect(0, 0, 100, 50);
_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-5.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-5.html
new file mode 100644
index 00000000000..a437cd99cc7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsl-5.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.invalid.css-color-4-hsl-5</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.invalid.css-color-4-hsl-5</h1>
+<p class="desc"></p>
+
+
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="/images/green-100x50.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#0f0';
+try { ctx.fillStyle = 'hsl(0, 100%, 50% /)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-1.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-1.html
new file mode 100644
index 00000000000..5f71de33098
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-1.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.invalid.css-color-4-hsla-1</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.invalid.css-color-4-hsla-1</h1>
+<p class="desc"></p>
+
+
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="/images/green-100x50.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#0f0';
+try { ctx.fillStyle = 'hsla(0, 100%, 50% / 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-2.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-2.html
new file mode 100644
index 00000000000..36c9fd1a6e4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-2.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.invalid.css-color-4-hsla-2</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.invalid.css-color-4-hsla-2</h1>
+<p class="desc"></p>
+
+
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="/images/green-100x50.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#0f0';
+try { ctx.fillStyle = 'hsla(0 100% 50%, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-3.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-3.html
new file mode 100644
index 00000000000..049ad397e00
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-hsla-3.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.invalid.css-color-4-hsla-3</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.invalid.css-color-4-hsla-3</h1>
+<p class="desc"></p>
+
+
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="/images/green-100x50.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#0f0';
+try { ctx.fillStyle = 'hsla(0, 100% 50%)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-1.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-1.html
new file mode 100644
index 00000000000..7a2534ceb29
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-1.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.invalid.css-color-4-rgb-1</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.invalid.css-color-4-rgb-1</h1>
+<p class="desc"></p>
+
+
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="/images/green-100x50.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#0f0';
+try { ctx.fillStyle = 'rgb(255, 0, 0 / 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-4.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-2.html
index e4d78b20e14..ca5a591ef64 100644
--- a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-4.html
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-2.html
@@ -1,13 +1,13 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
-<title>Canvas test: 2d.fillStyle.parse.invalid.rgb-4</title>
+<title>Canvas test: 2d.fillStyle.parse.invalid.css-color-4-rgb-2</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/canvas-tests.js"></script>
<link rel="stylesheet" href="/common/canvas-tests.css">
<body class="show_output">
-<h1>2d.fillStyle.parse.invalid.rgb-4</h1>
+<h1>2d.fillStyle.parse.invalid.css-color-4-rgb-2</h1>
<p class="desc"></p>
@@ -21,7 +21,7 @@ _addTest(function(canvas, ctx) {
ctx.fillStyle = '#0f0';
-try { ctx.fillStyle = 'rgb(100%, 0, 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+try { ctx.fillStyle = 'rgb(255 0 0, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
ctx.fillRect(0, 0, 100, 50);
_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-3.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-3.html
new file mode 100644
index 00000000000..e34ddfdf9af
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-3.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.invalid.css-color-4-rgb-3</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.invalid.css-color-4-rgb-3</h1>
+<p class="desc"></p>
+
+
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="/images/green-100x50.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#0f0';
+try { ctx.fillStyle = 'rgb(255, 0 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-5.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-4.html
index 92f933db799..682da31d2db 100644
--- a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-5.html
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-4.html
@@ -1,13 +1,13 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
-<title>Canvas test: 2d.fillStyle.parse.invalid.rgb-5</title>
+<title>Canvas test: 2d.fillStyle.parse.invalid.css-color-4-rgb-4</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/canvas-tests.js"></script>
<link rel="stylesheet" href="/common/canvas-tests.css">
<body class="show_output">
-<h1>2d.fillStyle.parse.invalid.rgb-5</h1>
+<h1>2d.fillStyle.parse.invalid.css-color-4-rgb-4</h1>
<p class="desc"></p>
@@ -21,7 +21,7 @@ _addTest(function(canvas, ctx) {
ctx.fillStyle = '#0f0';
-try { ctx.fillStyle = 'rgb(255 0 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+try { ctx.fillStyle = 'rgb(0 0 0 /)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
ctx.fillRect(0, 0, 100, 50);
_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-5.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-5.html
new file mode 100644
index 00000000000..75a11dc199f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgb-5.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.invalid.css-color-4-rgb-5</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.invalid.css-color-4-rgb-5</h1>
+<p class="desc"></p>
+
+
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="/images/green-100x50.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#0f0';
+try { ctx.fillStyle = 'rgb(0, 0, 0 /)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-1.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-1.html
new file mode 100644
index 00000000000..778fa479ce9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-1.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.invalid.css-color-4-rgba-1</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.invalid.css-color-4-rgba-1</h1>
+<p class="desc"></p>
+
+
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="/images/green-100x50.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#0f0';
+try { ctx.fillStyle = 'rgba(255, 0, 0 / 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-6.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-2.html
index e3de9df5387..14c83a56912 100644
--- a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-6.html
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-2.html
@@ -1,13 +1,13 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
-<title>Canvas test: 2d.fillStyle.parse.invalid.rgb-6</title>
+<title>Canvas test: 2d.fillStyle.parse.invalid.css-color-4-rgba-2</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/canvas-tests.js"></script>
<link rel="stylesheet" href="/common/canvas-tests.css">
<body class="show_output">
-<h1>2d.fillStyle.parse.invalid.rgb-6</h1>
+<h1>2d.fillStyle.parse.invalid.css-color-4-rgba-2</h1>
<p class="desc"></p>
@@ -21,7 +21,7 @@ _addTest(function(canvas, ctx) {
ctx.fillStyle = '#0f0';
-try { ctx.fillStyle = 'rgb(255, - 1, 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+try { ctx.fillStyle = 'rgba(255 0 0, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
ctx.fillRect(0, 0, 100, 50);
_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-3.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-3.html
new file mode 100644
index 00000000000..9647877b2a0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.css-color-4-rgba-3.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.fillStyle.parse.invalid.css-color-4-rgba-3</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.fillStyle.parse.invalid.css-color-4-rgba-3</h1>
+<p class="desc"></p>
+
+
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="/images/green-100x50.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+
+ctx.fillStyle = '#0f0';
+try { ctx.fillStyle = 'rgba(255, 0 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+ctx.fillRect(0, 0, 100, 50);
+_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-5.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-5.html
index 87b6a5731ce..0e3f8514847 100644
--- a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-5.html
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-5.html
@@ -21,7 +21,7 @@ _addTest(function(canvas, ctx) {
ctx.fillStyle = '#0f0';
-try { ctx.fillStyle = 'hsl(0, 100%, 100%, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+try { ctx.fillStyle = 'hsl(0, 100.%, 50%)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
ctx.fillRect(0, 0, 100, 50);
_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-6.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-6.html
index 008e278b558..6343ab12525 100644
--- a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-6.html
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsl-6.html
@@ -21,7 +21,7 @@ _addTest(function(canvas, ctx) {
ctx.fillStyle = '#0f0';
-try { ctx.fillStyle = 'hsl(0, 100.%, 50%)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+try { ctx.fillStyle = 'hsl(0, 100%, 50%,)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
ctx.fillRect(0, 0, 100, 50);
_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-6.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-3.html
index 3e7f06ad436..698a6cb9abc 100644
--- a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-6.html
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.hsla-3.html
@@ -1,13 +1,13 @@
<!DOCTYPE html>
<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
-<title>Canvas test: 2d.fillStyle.parse.invalid.rgba-6</title>
+<title>Canvas test: 2d.fillStyle.parse.invalid.hsla-3</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/canvas-tests.js"></script>
<link rel="stylesheet" href="/common/canvas-tests.css">
<body class="show_output">
-<h1>2d.fillStyle.parse.invalid.rgba-6</h1>
+<h1>2d.fillStyle.parse.invalid.hsla-3</h1>
<p class="desc"></p>
@@ -21,7 +21,7 @@ _addTest(function(canvas, ctx) {
ctx.fillStyle = '#0f0';
-try { ctx.fillStyle = 'rgba(255, 0, 0, 1.)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+try { ctx.fillStyle = 'hsla(0, 0, 50%, 1,)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
ctx.fillRect(0, 0, 100, 50);
_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-1.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-1.html
index fc0433eae59..66fb8e13d28 100644
--- a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-1.html
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-1.html
@@ -21,7 +21,7 @@ _addTest(function(canvas, ctx) {
ctx.fillStyle = '#0f0';
-try { ctx.fillStyle = 'rgb(255.0, 0, 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+try { ctx.fillStyle = 'rgb(255.0, 0, 0,)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
ctx.fillRect(0, 0, 100, 50);
_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-2.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-2.html
index 68c06e5ebec..7f9457c8220 100644
--- a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-2.html
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-2.html
@@ -21,7 +21,7 @@ _addTest(function(canvas, ctx) {
ctx.fillStyle = '#0f0';
-try { ctx.fillStyle = 'rgb(255, 0.0, 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+try { ctx.fillStyle = 'rgb(100%, 0, 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
ctx.fillRect(0, 0, 100, 50);
_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-3.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-3.html
index f864c9f2bc4..2530569c28d 100644
--- a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-3.html
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgb-3.html
@@ -21,7 +21,7 @@ _addTest(function(canvas, ctx) {
ctx.fillStyle = '#0f0';
-try { ctx.fillStyle = 'rgb(255.0, 0, 0,)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+try { ctx.fillStyle = 'rgb(255, - 1, 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
ctx.fillRect(0, 0, 100, 50);
_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-1.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-1.html
index 774aed13d51..1dc343ad188 100644
--- a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-1.html
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-1.html
@@ -21,7 +21,7 @@ _addTest(function(canvas, ctx) {
ctx.fillStyle = '#0f0';
-try { ctx.fillStyle = 'rgba(255, 0, 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+try { ctx.fillStyle = 'rgba(100%, 0, 0, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
ctx.fillRect(0, 0, 100, 50);
_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-2.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-2.html
index 14065e63426..5f5bb7941ae 100644
--- a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-2.html
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-2.html
@@ -21,7 +21,7 @@ _addTest(function(canvas, ctx) {
ctx.fillStyle = '#0f0';
-try { ctx.fillStyle = 'rgba(255.0, 0, 0, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+try { ctx.fillStyle = 'rgba(255, 0, 0, 1. 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
ctx.fillRect(0, 0, 100, 50);
_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-3.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-3.html
index 5947169fe55..67ed7f2a226 100644
--- a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-3.html
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-3.html
@@ -21,7 +21,7 @@ _addTest(function(canvas, ctx) {
ctx.fillStyle = '#0f0';
-try { ctx.fillStyle = 'rgba(100%, 0, 0, 1)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+try { ctx.fillStyle = 'rgba(255, 0, 0, 1.)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
ctx.fillRect(0, 0, 100, 50);
_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-4.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-4.html
index 9870b14f9d1..aea9725a2dc 100644
--- a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-4.html
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-4.html
@@ -21,7 +21,7 @@ _addTest(function(canvas, ctx) {
ctx.fillStyle = '#0f0';
-try { ctx.fillStyle = 'rgba(255, 0, 0, 100%)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+try { ctx.fillStyle = 'rgba(255, 0, 0, '; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
ctx.fillRect(0, 0, 100, 50);
_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
diff --git a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-5.html b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-5.html
index 4274996cae3..a149ed343a3 100644
--- a/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-5.html
+++ b/tests/wpt/web-platform-tests/2dcontext/fill-and-stroke-styles/2d.fillStyle.parse.invalid.rgba-5.html
@@ -21,7 +21,7 @@ _addTest(function(canvas, ctx) {
ctx.fillStyle = '#0f0';
-try { ctx.fillStyle = 'rgba(255, 0, 0, 1. 0)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
+try { ctx.fillStyle = 'rgba(255, 0, 0, 1,)'; } catch (e) { } // this shouldn't throw, but it shouldn't matter here if it does
ctx.fillRect(0, 0, 100, 50);
_assertPixel(canvas, 50,25, 0,255,0,255, "50,25", "0,255,0,255");
diff --git a/tests/wpt/web-platform-tests/2dcontext/line-styles/setLineDash.html b/tests/wpt/web-platform-tests/2dcontext/line-styles/setLineDash.html
new file mode 100644
index 00000000000..06fcada768f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/line-styles/setLineDash.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>setLineDash</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<canvas id="canvas"></canvas>
+<script>
+test(function() {
+ var canvas = document.getElementById('canvas');
+ var ctx = canvas.getContext('2d');
+
+ var initial = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
+
+ ctx.setLineDash(initial);
+ assert_array_equals(ctx.getLineDash(), initial, "line dash sanity");
+
+ ctx.setLineDash([Infinity]);
+ assert_array_equals(ctx.getLineDash(), initial, "Inf doesn't reset line dash");
+
+ ctx.setLineDash([NaN]);
+ assert_array_equals(ctx.getLineDash(), initial, "NaN doesn't reset line dash");
+
+ ctx.setLineDash([-1]);
+ assert_array_equals(ctx.getLineDash(), initial, "Negative doesn't reset line dash");
+}, "Invalid arguments to setLineDash()");
+
+test(function() {
+ var canvas = document.getElementById('canvas');
+ var ctx = canvas.getContext('2d');
+ assert_equals(ctx.lineDashOffset, 0);
+
+ ctx.setLineDash([15, 10]);
+ ctx.lineDashOffset = 5;
+ ctx.strokeRect(10,10,100,100);
+
+ var lineDash = ctx.getLineDash();
+ assert_array_equals(lineDash, [15, 10]);
+ assert_equals(ctx.lineDashOffset, 5);
+
+ ctx.setLineDash([5, 10, 15]);
+ ctx.strokeRect(20, 20, 120, 120);
+ lineDash = ctx.getLineDash();
+ assert_array_equals(lineDash, [5, 10, 15, 5, 10, 15]);
+
+ ctx.setLineDash(["1", 2]);
+ lineDash = ctx.getLineDash();
+ assert_array_equals(lineDash, [1, 2]);
+
+ ctx.clearRect(0, 0, 700, 700);
+ assert_equals(ctx.lineDashOffset, 5);
+
+ ctx.setLineDash([20, 10]);
+ ctx.lineDashOffset = 0;
+ // Make the test immune to plaform anti-aliasing discrepancies.
+ ctx.lineWidth = 4;
+ ctx.strokeStyle = '#00FF00';
+ ctx.strokeRect(10.5, 10.5, 30, 30);
+
+ _assertPixel(canvas, 25, 10, 0, 255, 0, 255, 0);
+ _assertPixel(canvas, 35, 10, 0, 0, 0, 0, 0);
+ _assertPixel(canvas, 40, 25, 0, 255, 0, 255, 0);
+ _assertPixel(canvas, 40, 35, 0, 0, 0, 0, 0);
+ _assertPixel(canvas, 25, 40, 0, 255, 0, 255, 0);
+ _assertPixel(canvas, 15, 40, 0, 0, 0, 0, 0);
+ _assertPixel(canvas, 10, 25, 0, 255, 0, 255, 0);
+ _assertPixel(canvas, 10, 15, 0, 0, 0, 0, 0);
+
+ // Verify that lineDashOffset works as expected.
+ ctx.lineDashOffset = 20;
+ ctx.strokeRect(50.5, 10.5, 30, 30);
+ _assertPixel(canvas, 55, 10, 0, 0, 0, 0, 0);
+ _assertPixel(canvas, 65, 10, 0, 255, 0, 255, 0);
+ _assertPixel(canvas, 80, 15, 0, 0, 0, 0, 0);
+ _assertPixel(canvas, 80, 25, 0, 255, 0, 255, 0);
+ _assertPixel(canvas, 75, 40, 0, 0, 0, 0, 0);
+ _assertPixel(canvas, 65, 40, 0, 255, 0, 255, 0);
+ _assertPixel(canvas, 50, 35, 0, 0, 0, 0, 0);
+ _assertPixel(canvas, 50, 25, 0, 255, 0, 255, 0);
+
+ // Verify negative lineDashOffset.
+ ctx.lineDashOffset = -10;
+ ctx.strokeRect(90.5, 10.5, 30, 30);
+ _assertPixel(canvas, 95, 10, 0, 0, 0, 0, 0);
+ _assertPixel(canvas, 105, 10, 0, 255, 0, 255, 0);
+ _assertPixel(canvas, 120, 15, 0, 0, 0, 0, 0);
+ _assertPixel(canvas, 120, 25, 0, 255, 0, 255, 0);
+ _assertPixel(canvas, 115, 40, 0, 0, 0, 0, 0);
+ _assertPixel(canvas, 105, 40, 0, 255, 0, 255, 0);
+ _assertPixel(canvas, 90, 35, 0, 0, 0, 0, 0);
+ _assertPixel(canvas, 90, 25, 0, 255, 0, 255, 0);
+
+ // Ensure that all zeros or negative pattern does not cause error state in
+ // context.
+ ctx.setLineDash([0, 0]);
+ ctx.strokeRect(130.5, 10.5, 10, 10);
+ ctx.setLineDash([-1]);
+ ctx.strokeRect(130.5, 10.5, 10, 10);
+ _assertPixel(canvas, 135, 15, 0, 0, 0, 0, 0);
+ ctx.fillStyle = '#00FF00';
+ ctx.fillRect(130, 10, 10, 10);
+ _assertPixel(canvas, 135, 15, 0, 255, 0, 255, 0);
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/path-objects/2d.path.lineTo.nonfinite.details.html b/tests/wpt/web-platform-tests/2dcontext/path-objects/2d.path.lineTo.nonfinite.details.html
new file mode 100644
index 00000000000..88886ebe245
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/path-objects/2d.path.lineTo.nonfinite.details.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.path.lineTo.nonfinite.details</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/canvas-tests.js"></script>
+<link rel="stylesheet" href="/common/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.path.lineTo.nonfinite.details</h1>
+<p class="desc">lineTo() with Infinity/NaN for first arg still converts the second arg</p>
+
+
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+<p class="output expectedtext">Expected output:<p><img src="/images/clear-100x50.png" class="output expected" id="expected" alt="">
+<ul id="d"></ul>
+<script>
+var t = async_test("lineTo() with Infinity/NaN for first arg still converts the second arg");
+_addTest(function(canvas, ctx) {
+
+for (var arg1 of [Infinity, -Infinity, NaN]) {
+ var converted = false;
+ ctx.lineTo(arg1, { valueOf: function() { converted = true; return 0; } });
+ _assert(converted, "converted");
+}
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/tools/tests2d.yaml b/tests/wpt/web-platform-tests/2dcontext/tools/tests2d.yaml
index 546e994fbe9..20a77dbd1f5 100644
--- a/tests/wpt/web-platform-tests/2dcontext/tools/tests2d.yaml
+++ b/tests/wpt/web-platform-tests/2dcontext/tools/tests2d.yaml
@@ -1005,6 +1005,26 @@
@assert pixel 50,25 ==~ 2,253,0,255;
expected: green
+- name: 2d.composite.globalAlpha.canvascopy
+ testing:
+ - 2d.composite.globalAlpha.image
+ code: |
+ var canvas2 = document.createElement('canvas');
+ canvas2.width = 100;
+ canvas2.height = 50;
+ var ctx2 = canvas2.getContext('2d');
+ ctx2.fillStyle = '#0f0';
+ ctx2.fillRect(0, 0, 100, 50);
+
+ ctx.fillStyle = '#f00';
+ ctx.fillRect(0, 0, 100, 50);
+
+ ctx.globalCompositeOperation = 'copy'
+ ctx.globalAlpha = 0.51;
+ ctx.drawImage(canvas2, 0, 0);
+ @assert pixel 50,25 ==~ 0,255,0,130;
+ expected: green
+
- meta: |
# Composite operation tests
@@ -1372,6 +1392,40 @@
('hsla-clamp-6', 'hsla(120, 100%, 0%, -2)', 0,0,0,0, ""),
('svg-1', 'gray', 128,128,128,255, ""),
('svg-2', 'grey', 128,128,128,255, ""),
+ # css-color-4 rgb() color function
+ # https://drafts.csswg.org/css-color/#numeric-rgb
+ ('css-color-4-rgb-1', 'rgb(0, 255.0, 0)', 0,255,0,255, ""),
+ ('css-color-4-rgb-2', 'rgb(0, 255, 0, 0.2)', 0,255,0,51, ""),
+ ('css-color-4-rgb-3', 'rgb(0, 255, 0, 20%)', 0,255,0,51, ""),
+ ('css-color-4-rgb-4', 'rgb(0 255 0)', 0,255,0,255, ""),
+ ('css-color-4-rgb-5', 'rgb(0 255 0 / 0.2)', 0,255,0,51, ""),
+ ('css-color-4-rgb-6', 'rgb(0 255 0 / 20%)', 0,255,0,51, ""),
+ ('css-color-4-rgba-1', 'rgba(0, 255.0, 0)', 0,255,0,255, ""),
+ ('css-color-4-rgba-2', 'rgba(0, 255, 0, 0.2)', 0,255,0,51, ""),
+ ('css-color-4-rgba-3', 'rgba(0, 255, 0, 20%)', 0,255,0,51, ""),
+ ('css-color-4-rgba-4', 'rgba(0 255 0)', 0,255,0,255, ""),
+ ('css-color-4-rgba-5', 'rgba(0 255 0 / 0.2)', 0,255,0,51, ""),
+ ('css-color-4-rgba-6', 'rgba(0 255 0 / 20%)', 0,255,0,51, ""),
+ # css-color-4 hsl() color function
+ # https://drafts.csswg.org/css-color/#the-hsl-notation
+ ('css-color-4-hsl-1', 'hsl(120 100.0% 50.0%)', 0,255,0,255, ""),
+ ('css-color-4-hsl-2', 'hsl(120 100.0% 50.0% / 0.2)', 0,255,0,51, ""),
+ ('css-color-4-hsl-3', 'hsl(120.0, 100.0%, 50.0%, 0.2)', 0,255,0,51, ""),
+ ('css-color-4-hsl-4', 'hsl(120.0, 100.0%, 50.0%, 20%)', 0,255,0,51, ""),
+ ('css-color-4-hsl-5', 'hsl(120deg, 100.0%, 50.0%, 0.2)', 0,255,0,51, ""),
+ ('css-color-4-hsl-6', 'hsl(120deg, 100.0%, 50.0%)', 0,255,0,255, ""),
+ ('css-color-4-hsl-7', 'hsl(133.33333333grad, 100.0%, 50.0%)', 0,255,0,255, ""),
+ ('css-color-4-hsl-8', 'hsl(2.0943951024rad, 100.0%, 50.0%)', 0,255,0,255, ""),
+ ('css-color-4-hsl-9', 'hsl(0.3333333333turn, 100.0%, 50.0%)', 0,255,0,255, ""),
+ ('css-color-4-hsla-1', 'hsl(120 100.0% 50.0%)', 0,255,0,255, ""),
+ ('css-color-4-hsla-2', 'hsl(120 100.0% 50.0% / 0.2)', 0,255,0,51, ""),
+ ('css-color-4-hsla-3', 'hsl(120.0, 100.0%, 50.0%, 0.2)', 0,255,0,51, ""),
+ ('css-color-4-hsla-4', 'hsl(120.0, 100.0%, 50.0%, 20%)', 0,255,0,51, ""),
+ ('css-color-4-hsla-5', 'hsl(120deg, 100.0%, 50.0%, 0.2)', 0,255,0,51, ""),
+ ('css-color-4-hsla-6', 'hsl(120deg, 100.0%, 50.0%)', 0,255,0,255, ""),
+ ('css-color-4-hsla-7', 'hsl(133.33333333grad, 100.0%, 50.0%)', 0,255,0,255, ""),
+ ('css-color-4-hsla-8', 'hsl(2.0943951024rad, 100.0%, 50.0%)', 0,255,0,255, ""),
+ ('css-color-4-hsla-9', 'hsl(0.3333333333turn, 100.0%, 50.0%)', 0,255,0,255, ""),
# currentColor is handled later
]:
# TODO: test by retrieving fillStyle, instead of actually drawing?
@@ -1404,33 +1458,47 @@
('hex6', '#fg0000'),
('hex7', '#ff0000f'),
('hex8', '#fg0000ff'),
- ('rgb-1', 'rgb(255.0, 0, 0)'),
- ('rgb-2', 'rgb(255, 0.0, 0)'),
- ('rgb-3', 'rgb(255.0, 0, 0,)'),
- ('rgb-4', 'rgb(100%, 0, 0)'),
- ('rgb-5', 'rgb(255 0 0)'),
- ('rgb-6', 'rgb(255, - 1, 0)'),
- ('rgb-7', 'rgb(255, 0, 0, 1)'),
- ('rgba-1', 'rgba(255, 0, 0)'),
- ('rgba-2', 'rgba(255.0, 0, 0, 1)'),
- ('rgba-3', 'rgba(100%, 0, 0, 1)'),
- ('rgba-4', 'rgba(255, 0, 0, 100%)'),
- ('rgba-5', 'rgba(255, 0, 0, 1. 0)'),
- ('rgba-6', 'rgba(255, 0, 0, 1.)'),
- ('rgba-7', 'rgba(255, 0, 0, '),
+ ('rgb-1', 'rgb(255.0, 0, 0,)'),
+ ('rgb-2', 'rgb(100%, 0, 0)'),
+ ('rgb-3', 'rgb(255, - 1, 0)'),
+ ('rgba-1', 'rgba(100%, 0, 0, 1)'),
+ ('rgba-2', 'rgba(255, 0, 0, 1. 0)'),
+ ('rgba-3', 'rgba(255, 0, 0, 1.)'),
+ ('rgba-4', 'rgba(255, 0, 0, '),
+ ('rgba-5', 'rgba(255, 0, 0, 1,)'),
('hsl-1', 'hsl(0%, 100%, 50%)'),
('hsl-2', 'hsl(z, 100%, 50%)'),
('hsl-3', 'hsl(0, 0, 50%)'),
('hsl-4', 'hsl(0, 100%, 0)'),
- ('hsl-5', 'hsl(0, 100%, 100%, 1)'),
- ('hsl-6', 'hsl(0, 100.%, 50%)'),
+ ('hsl-5', 'hsl(0, 100.%, 50%)'),
+ ('hsl-6', 'hsl(0, 100%, 50%,)'),
('hsla-1', 'hsla(0%, 100%, 50%, 1)'),
('hsla-2', 'hsla(0, 0, 50%, 1)'),
+ ('hsla-3', 'hsla(0, 0, 50%, 1,)'),
('name-1', 'darkbrown'),
('name-2', 'firebrick1'),
('name-3', 'red blue'),
('name-4', '"red"'),
('name-5', '"red'),
+ # css-color-4 color function
+ # comma and comma-less expressions should not mix together.
+ ('css-color-4-rgb-1', 'rgb(255, 0, 0 / 1)'),
+ ('css-color-4-rgb-2', 'rgb(255 0 0, 1)'),
+ ('css-color-4-rgb-3', 'rgb(255, 0 0)'),
+ ('css-color-4-rgba-1', 'rgba(255, 0, 0 / 1)'),
+ ('css-color-4-rgba-2', 'rgba(255 0 0, 1)'),
+ ('css-color-4-rgba-3', 'rgba(255, 0 0)'),
+ ('css-color-4-hsl-1', 'hsl(0, 100%, 50% / 1)'),
+ ('css-color-4-hsl-2', 'hsl(0 100% 50%, 1)'),
+ ('css-color-4-hsl-3', 'hsl(0, 100% 50%)'),
+ ('css-color-4-hsla-1', 'hsla(0, 100%, 50% / 1)'),
+ ('css-color-4-hsla-2', 'hsla(0 100% 50%, 1)'),
+ ('css-color-4-hsla-3', 'hsla(0, 100% 50%)'),
+ # trailing slash
+ ('css-color-4-rgb-4', 'rgb(0 0 0 /)'),
+ ('css-color-4-rgb-5', 'rgb(0, 0, 0 /)'),
+ ('css-color-4-hsl-4', 'hsl(0 100% 50% /)'),
+ ('css-color-4-hsl-5', 'hsl(0, 100%, 50% /)'),
]:
test = {
'name': '2d.fillStyle.parse.invalid.%s' % name,
@@ -6197,6 +6265,18 @@
@assert pixel 90,45 == 0,255,0,255;
expected: green
+- name: 2d.path.lineTo.nonfinite.details
+ desc: lineTo() with Infinity/NaN for first arg still converts the second arg
+ testing:
+ - 2d.nonfinite
+ code: |
+ for (var arg1 of [Infinity, -Infinity, NaN]) {
+ var converted = false;
+ ctx.lineTo(arg1, { valueOf: function() { converted = true; return 0; } });
+ @assert converted;
+ }
+ expected: clear
+
- name: 2d.path.quadraticCurveTo.ensuresubpath.1
desc: If there is no subpath, the first control point is added (and nothing is drawn up to it)
testing:
diff --git a/tests/wpt/web-platform-tests/IndexedDB/idbcursor-continuePrimaryKey-exception-order.htm b/tests/wpt/web-platform-tests/IndexedDB/idbcursor-continuePrimaryKey-exception-order.htm
new file mode 100644
index 00000000000..0d35218b9e0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/IndexedDB/idbcursor-continuePrimaryKey-exception-order.htm
@@ -0,0 +1,382 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<meta name="timeout" content="long">
+<title>IDBCursor.continuePrimaryKey() - Exception Orders </title>
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="http://w3c.github.io/IndexedDB/#dom-idbcursor-continueprimarykey">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support.js"></script>
+
+<script>
+function setup_test_store(db) {
+ var records = [ { iKey: "A", pKey: 1 },
+ { iKey: "A", pKey: 2 },
+ { iKey: "A", pKey: 3 },
+ { iKey: "A", pKey: 4 },
+ { iKey: "B", pKey: 5 },
+ { iKey: "B", pKey: 6 },
+ { iKey: "B", pKey: 7 },
+ { iKey: "C", pKey: 8 },
+ { iKey: "C", pKey: 9 },
+ { iKey: "D", pKey: 10 } ];
+
+ var store = db.createObjectStore("test", { keyPath: "pKey" });
+ var index = store.createIndex("idx", "iKey");
+
+ for(var i = 0; i < records.length; i++) {
+ store.add(records[i]);
+ }
+
+ return store;
+}
+
+indexeddb_test(
+ function(t, db, txn) {
+ var store = setup_test_store(db);
+ var index = store.index("idx");
+ var cursor_rq = index.openCursor();
+ var cursor;
+
+ cursor_rq.onerror = t.unreached_func('openCursor should succeed');
+ cursor_rq.onsuccess = t.step_func(function(e) {
+ cursor = e.target.result;
+ assert_true(!!cursor, "acquire cursor");
+
+ store.deleteIndex("idx");
+ });
+ txn.oncomplete = function() {
+ assert_throws("TransactionInactiveError", function() {
+ cursor.continuePrimaryKey("A", 4);
+ }, "transaction-state check should precede deletion check");
+ t.done();
+ };
+ },
+ null,
+ "TransactionInactiveError v.s. InvalidStateError(deleted index)"
+);
+
+indexeddb_test(
+ function(t, db, txn) {
+ var store = setup_test_store(db);
+ var cursor_rq = store.openCursor();
+ var cursor;
+
+ cursor_rq.onerror = t.unreached_func('openCursor should succeed');
+ cursor_rq.onsuccess = t.step_func(function(e) {
+ cursor = e.target.result;
+ assert_true(!!cursor, "acquire cursor");
+
+ db.deleteObjectStore("test");
+
+ assert_throws("InvalidStateError", function() {
+ cursor.continuePrimaryKey("A", 4);
+ }, "deletion check should precede index source check");
+ t.done();
+ });
+ },
+ null,
+ "InvalidStateError(deleted source) v.s. InvalidAccessError(incorrect source)"
+);
+
+indexeddb_test(
+ function(t, db, txn) {
+ var store = setup_test_store(db);
+ var index = store.index("idx");
+ var cursor_rq = index.openCursor(null, "nextunique");
+ var cursor;
+
+ cursor_rq.onerror = t.unreached_func('openCursor should succeed');
+ cursor_rq.onsuccess = t.step_func(function(e) {
+ cursor = e.target.result;
+ assert_true(!!cursor, "acquire cursor");
+
+ store.deleteIndex("idx");
+
+ assert_throws("InvalidStateError", function() {
+ cursor.continuePrimaryKey("A", 4);
+ }, "deletion check should precede cursor direction check");
+ t.done();
+ });
+ },
+ null,
+ "InvalidStateError(deleted source) v.s. InvalidAccessError(incorrect direction)"
+);
+
+indexeddb_test(
+ function(t, db, txn) {
+ var store = db.createObjectStore("test", {keyPath:"pKey"});
+ var index = store.createIndex("idx", "iKey");
+
+ store.add({ iKey: "A", pKey: 1 });
+
+ var cursor_rq = index.openCursor(null, "nextunique");
+ var cursor;
+
+ cursor_rq.onerror = t.unreached_func('openCursor should succeed');
+ cursor_rq.onsuccess = t.step_func(function(e) {
+ if (e.target.result) {
+ cursor = e.target.result;
+ cursor.continue();
+ return;
+ }
+
+ assert_throws("InvalidAccessError", function() {
+ cursor.continuePrimaryKey("A", 4);
+ }, "direction check should precede got_value_flag check");
+ t.done();
+ });
+ },
+ null,
+ "InvalidAccessError(incorrect direction) v.s. InvalidStateError(iteration complete)"
+);
+
+indexeddb_test(
+ function(t, db, txn) {
+ var store = db.createObjectStore("test", {keyPath:"pKey"});
+ var index = store.createIndex("idx", "iKey");
+
+ store.add({ iKey: "A", pKey: 1 });
+
+ var cursor_rq = index.openCursor(null, "nextunique");
+ var cursor;
+
+ cursor_rq.onerror = t.unreached_func('openCursor should succeed');
+ cursor_rq.onsuccess = t.step_func(function(e) {
+ if (!cursor) {
+ cursor = e.target.result;
+ assert_true(!!cursor, "acquire cursor");
+
+ cursor.continue();
+
+ assert_throws("InvalidAccessError", function() {
+ cursor.continuePrimaryKey("A", 4);
+ }, "direction check should precede iteration ongoing check");
+ t.done();
+ }
+ });
+ },
+ null,
+ "InvalidAccessError(incorrect direction) v.s. InvalidStateError(iteration ongoing)"
+);
+
+indexeddb_test(
+ function(t, db, txn) {
+ var store = setup_test_store(db);
+ var cursor_rq = store.openCursor();
+ var cursor;
+
+ cursor_rq.onerror = t.unreached_func('openCursor should succeed');
+ cursor_rq.onsuccess = t.step_func(function(e) {
+ if (!cursor) {
+ cursor = e.target.result;
+ assert_true(!!cursor, "acquire cursor");
+
+ cursor.continue();
+
+ assert_throws("InvalidAccessError", function() {
+ cursor.continuePrimaryKey("A", 4);
+ }, "index source check should precede iteration ongoing check");
+ t.done();
+ }
+ });
+ },
+ null,
+ "InvalidAccessError(incorrect source) v.s. InvalidStateError(iteration ongoing)"
+);
+
+indexeddb_test(
+ function(t, db, txn) {
+ var store = db.createObjectStore("test", {keyPath:"pKey"});
+
+ store.add({ iKey: "A", pKey: 1 });
+
+ var cursor_rq = store.openCursor();
+ var cursor;
+
+ cursor_rq.onerror = t.unreached_func('openCursor should succeed');
+ cursor_rq.onsuccess = t.step_func(function(e) {
+ if (e.target.result) {
+ cursor = e.target.result;
+ cursor.continue();
+ return;
+ }
+
+ assert_throws("InvalidAccessError", function() {
+ cursor.continuePrimaryKey("A", 4);
+ }, "index source check should precede got_value_flag check");
+ t.done();
+ });
+ },
+ null,
+ "InvalidAccessError(incorrect source) v.s. InvalidStateError(iteration complete)"
+);
+
+indexeddb_test(
+ function(t, db, txn) {
+ var store = setup_test_store(db);
+ var index = store.index("idx");
+ var cursor_rq = index.openCursor();
+ var cursor;
+
+ cursor_rq.onerror = t.unreached_func('openCursor should succeed');
+ cursor_rq.onsuccess = t.step_func(function(e) {
+ if (!cursor) {
+ cursor = e.target.result;
+ assert_true(!!cursor, "acquire cursor");
+
+ cursor.continue();
+
+ assert_throws("InvalidStateError", function() {
+ cursor.continuePrimaryKey(null, 4);
+ }, "iteration ongoing check should precede unset key check");
+ t.done();
+ }
+ });
+ },
+ null,
+ "InvalidStateError(iteration ongoing) v.s. DataError(unset key)"
+);
+
+indexeddb_test(
+ function(t, db, txn) {
+ var store = db.createObjectStore("test", {keyPath:"pKey"});
+ var index = store.createIndex("idx", "iKey");
+
+ store.add({ iKey: "A", pKey: 1 });
+
+ var cursor_rq = index.openCursor();
+ var cursor;
+
+ cursor_rq.onerror = t.unreached_func('openCursor should succeed');
+ cursor_rq.onsuccess = t.step_func(function(e) {
+ if (e.target.result) {
+ cursor = e.target.result;
+ cursor.continue();
+ return;
+ }
+
+ assert_throws("InvalidStateError", function() {
+ cursor.continuePrimaryKey(null, 4);
+ }, "got_value_flag check should precede unset key check");
+ t.done();
+ });
+ },
+ null,
+ "InvalidStateError(iteration complete) v.s. DataError(unset key)"
+);
+
+indexeddb_test(
+ function(t, db, txn) {
+ var store = setup_test_store(db);
+ var index = store.index("idx");
+ var cursor_rq = index.openCursor();
+ var cursor;
+
+ cursor_rq.onerror = t.unreached_func('openCursor should succeed');
+ cursor_rq.onsuccess = t.step_func(function(e) {
+ cursor = e.target.result;
+ assert_true(!!cursor, "acquire cursor");
+
+ assert_throws("DataError", function() {
+ cursor.continuePrimaryKey(null, 4);
+ }, "DataError is expected if key is unset.");
+ t.done();
+ });
+ },
+ null,
+ "DataError(unset key)"
+);
+
+indexeddb_test(
+ function(t, db, txn) {
+ var store = setup_test_store(db);
+ var index = store.index("idx");
+ var cursor_rq = index.openCursor();
+ var cursor;
+
+ cursor_rq.onerror = t.unreached_func('openCursor should succeed');
+ cursor_rq.onsuccess = t.step_func(function(e) {
+ cursor = e.target.result;
+ assert_true(!!cursor, "acquire cursor");
+
+ assert_throws("DataError", function() {
+ cursor.continuePrimaryKey("A", null);
+ }, "DataError is expected if primary key is unset.");
+ t.done();
+ });
+ },
+ null,
+ "DataError(unset primary key)"
+);
+
+indexeddb_test(
+ function(t, db, txn) {
+ var store = setup_test_store(db);
+ var index = store.index("idx");
+ var cursor_rq = index.openCursor(IDBKeyRange.lowerBound("B"));
+ var cursor;
+
+ cursor_rq.onerror = t.unreached_func('openCursor should succeed');
+ cursor_rq.onsuccess = t.step_func(function(e) {
+ cursor = e.target.result;
+ assert_true(!!cursor, "acquire cursor");
+
+ assert_equals(cursor.key, "B", "expected key");
+ assert_equals(cursor.primaryKey, 5, "expected primary key");
+
+ assert_throws("DataError", function() {
+ cursor.continuePrimaryKey("A", 6);
+ }, "DataError is expected if key is lower then current one.");
+
+ assert_throws("DataError", function() {
+ cursor.continuePrimaryKey("B", 5);
+ }, "DataError is expected if primary key is equal to current one.");
+
+ assert_throws("DataError", function() {
+ cursor.continuePrimaryKey("B", 4);
+ }, "DataError is expected if primary key is lower than current one.");
+
+ t.done();
+ });
+ },
+ null,
+ "DataError(keys are lower then current one) in 'next' direction"
+);
+
+indexeddb_test(
+ function(t, db, txn) {
+ var store = setup_test_store(db);
+ var index = store.index("idx");
+ var cursor_rq = index.openCursor(IDBKeyRange.upperBound("B"), "prev");
+ var cursor;
+
+ cursor_rq.onerror = t.unreached_func('openCursor should succeed');
+ cursor_rq.onsuccess = t.step_func(function(e) {
+ cursor = e.target.result;
+ assert_true(!!cursor, "acquire cursor");
+
+ assert_equals(cursor.key, "B", "expected key");
+ assert_equals(cursor.primaryKey, 7, "expected primary key");
+
+ assert_throws("DataError", function() {
+ cursor.continuePrimaryKey("C", 6);
+ }, "DataError is expected if key is larger then current one.");
+
+ assert_throws("DataError", function() {
+ cursor.continuePrimaryKey("B", 7);
+ }, "DataError is expected if primary key is equal to current one.");
+
+ assert_throws("DataError", function() {
+ cursor.continuePrimaryKey("B", 8);
+ }, "DataError is expected if primary key is larger than current one.");
+
+ t.done();
+ });
+ },
+ null,
+ "DataError(keys are larger then current one) in 'prev' direction"
+);
+</script>
+
+<div id="log"></div>
diff --git a/tests/wpt/web-platform-tests/IndexedDB/idbindex-rename-abort.html b/tests/wpt/web-platform-tests/IndexedDB/idbindex-rename-abort.html
new file mode 100644
index 00000000000..f8dca52020e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/IndexedDB/idbindex-rename-abort.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html>
+<title>IndexedDB: index renaming support in aborted transactions</title>
+<link rel="help"
+ href="https://w3c.github.io/IndexedDB/#dom-idbindex-name">
+<link rel="author" href="pwnall@chromium.org" title="Victor Costan">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support-promises.js"></script>
+<script>
+
+promise_test(testCase => {
+ const dbName = databaseName(testCase);
+ let authorIndex = null, authorIndex2 = null;
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ const store = transaction.objectStore('books');
+ authorIndex = store.index('by_author');
+ authorIndex.name = 'renamed_by_author';
+
+ transaction.abort();
+
+ assert_equals(
+ authorIndex.name, 'by_author',
+ 'IDBIndex.name should not reflect the rename any more ' +
+ 'immediately after transaction.abort() returns');
+ assert_array_equals(
+ store.indexNames, ['by_author', 'by_title'],
+ 'IDBObjectStore.indexNames should not reflect the rename any ' +
+ 'more immediately after transaction.abort() returns');
+ })).then(event => {
+ assert_equals(
+ authorIndex.name, 'by_author',
+ 'IDBIndex.name should not reflect the rename any more after the ' +
+ 'versionchange transaction is aborted');
+
+ const request = indexedDB.open(dbName, 1);
+ return requestWatcher(testCase, request).wait_for('success');
+ }).then(event => {
+ const database = event.target.result;
+ const transaction = database.transaction('books', 'readonly');
+ const store = transaction.objectStore('books');
+ assert_array_equals(
+ store.indexNames, ['by_author', 'by_title'],
+ 'IDBDatabase.objectStoreNames should not reflect the rename ' +
+ 'after the versionchange transaction is aborted');
+
+ authorIndex2 = store.index('by_author');
+ return checkAuthorIndexContents(
+ testCase, authorIndex2,
+ 'Aborting an index rename transaction should not change the ' +
+ "index's records").then(() => database.close());
+ }).then(() => {
+ assert_equals(
+ authorIndex.name, 'by_author',
+ 'IDBIndex used in aborted rename transaction should not reflect ' +
+ 'the rename after the transaction is aborted');
+ assert_equals(authorIndex2.name, 'by_author',
+ 'IDBIndex obtained after an aborted rename transaction should ' +
+ 'not reflect the rename');
+ });
+}, 'IndexedDB index rename in aborted transaction');
+
+promise_test(testCase => {
+ const dbName = databaseName(testCase);
+ let authorIndex = null;
+ return createDatabase(testCase, (database, transaction) => {
+ createNotBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ const store = transaction.objectStore('not_books');
+ authorIndex = store.createIndex('by_author', 'author');
+ authorIndex.name = 'by_author_renamed';
+ authorIndex.name = 'by_author_renamed_again';
+
+ transaction.abort();
+
+ assert_equals(
+ authorIndex.name, 'by_author_renamed_again',
+ 'IDBIndex.name should reflect the last rename immediately after ' +
+ 'transaction.abort() returns');
+ assert_array_equals(
+ store.indexNames, ['not_by_author', 'not_by_title'],
+ 'IDBObjectStore.indexNames should not reflect the creation or ' +
+ 'the rename immediately after transaction.abort() returns');
+ })).then(event => {
+ assert_equals(
+ authorIndex.name, 'by_author_renamed_again',
+ 'IDBIndex.name should reflect the last rename after the ' +
+ 'versionchange transaction is aborted');
+
+ const request = indexedDB.open(dbName, 1);
+ return requestWatcher(testCase, request).wait_for('success');
+ }).then(event => {
+ const database = event.target.result;
+ const transaction = database.transaction('not_books', 'readonly');
+ const store = transaction.objectStore('not_books');
+ assert_array_equals(
+ store.indexNames, ['not_by_author', 'not_by_title'],
+ 'IDBDatabase.objectStoreNames should not reflect the creation or ' +
+ 'the rename after the versionchange transaction is aborted');
+
+ database.close();
+ });
+}, 'IndexedDB index creation and rename in an aborted transaction');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/IndexedDB/idbindex-rename-errors.html b/tests/wpt/web-platform-tests/IndexedDB/idbindex-rename-errors.html
new file mode 100644
index 00000000000..1f50f36c64f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/IndexedDB/idbindex-rename-errors.html
@@ -0,0 +1,130 @@
+<!DOCTYPE html>
+<title>IndexedDB: index renaming error handling</title>
+<link rel="help"
+ href="https://w3c.github.io/IndexedDB/#dom-idbindex-name">
+<link rel="author" href="pwnall@chromium.org" title="Victor Costan">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support-promises.js"></script>
+<script>
+
+promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ const store = transaction.objectStore('books');
+ const index = store.index('by_author');
+ store.deleteIndex('by_author');
+ assert_throws(
+ 'InvalidStateError', () => index.name = 'renamed_by_author');
+ })).then(database => database.close());
+}, 'IndexedDB deleted index rename throws');
+
+promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ const transaction = database.transaction('books', 'readonly');
+ const store = transaction.objectStore('books');
+ const index = store.index('by_author');
+
+ assert_throws(
+ 'InvalidStateError', () => index.name = 'renamed_by_author');
+ database.close();
+ });
+}, 'IndexedDB index rename throws in a readonly transaction');
+
+promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ const transaction = database.transaction('books', 'readwrite');
+ const store = transaction.objectStore('books');
+ const index = store.index('by_author');
+
+ assert_throws(
+ 'InvalidStateError', () => index.name = 'renamed_by_author');
+ database.close();
+ });
+}, 'IndexedDB index rename throws in a readwrite transaction');
+
+promise_test(testCase => {
+ let authorIndex = null;
+ return createDatabase(testCase, (database, transaction) => {
+ const store = createBooksStore(testCase, database);
+ authorIndex = store.index('by_author');
+ }).then(database => {
+ assert_throws(
+ 'TransactionInactiveError',
+ () => authorIndex.name = 'renamed_by_author');
+ database.close();
+ });
+}, 'IndexedDB index rename throws in an inactive transaction');
+
+promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ const store = transaction.objectStore('books');
+ const index = store.index('by_author');
+
+ assert_throws('ConstraintError', () => index.name = 'by_title');
+ assert_array_equals(
+ store.indexNames, ['by_author', 'by_title'],
+ 'An index rename that throws an exception should not change the ' +
+ "index's IDBObjectStore.indexNames");
+ })).then(database => {
+ const transaction = database.transaction('books', 'readonly');
+ const store = transaction.objectStore('books');
+ assert_array_equals(
+ store.indexNames, ['by_author', 'by_title'],
+ 'Committing a transaction with a failed store rename attempt ' +
+ "should not change the index's IDBObjectStore.indexNames");
+ const index = store.index('by_author');
+ return checkAuthorIndexContents(
+ testCase, index,
+ 'Committing a transaction with a failed rename attempt should ' +
+ "not change the index's contents").then(() => database.close());
+ });
+}, 'IndexedDB index rename to the name of another index throws');
+
+promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ const store = transaction.objectStore('books');
+ const index = store.index('by_author');
+
+ assert_throws(
+ { name: 'Custom stringifying error' },
+ () => {
+ index.name = {
+ toString: () => { throw { name: 'Custom stringifying error'}; }
+ };
+ }, 'IDBObjectStore rename should re-raise toString() exception');
+ assert_array_equals(
+ store.indexNames, ['by_author', 'by_title'],
+ 'An index rename that throws an exception should not change the ' +
+ "index's IDBObjectStore.indexNames");
+ })).then(database => {
+ const transaction = database.transaction('books', 'readonly');
+ const store = transaction.objectStore('books');
+ assert_array_equals(
+ store.indexNames, ['by_author', 'by_title'],
+ 'Committing a transaction with a failed store rename attempt ' +
+ "should not change the index's IDBObjectStore.indexNames");
+ const index = store.index('by_author');
+ return checkAuthorIndexContents(
+ testCase, index,
+ 'Committing a transaction with a failed rename attempt should ' +
+ "not change the index's contents").then(() => database.close());
+ });
+}, 'IndexedDB index rename handles exceptions when stringifying names');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/IndexedDB/idbindex-rename.html b/tests/wpt/web-platform-tests/IndexedDB/idbindex-rename.html
new file mode 100644
index 00000000000..2ef26d295e9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/IndexedDB/idbindex-rename.html
@@ -0,0 +1,298 @@
+<!DOCTYPE html>
+<title>IndexedDB: index renaming support</title>
+<link rel="help"
+ href="https://w3c.github.io/IndexedDB/#dom-idbindex-name">
+<link rel="author" href="pwnall@chromium.org" title="Victor Costan">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support-promises.js"></script>
+<script>
+
+promise_test(testCase => {
+ let authorIndex = null, authorIndex2 = null;
+ let renamedAuthorIndex = null, renamedAuthorIndex2 = null;
+ return createDatabase(testCase, (database, transaction) => {
+ const store = createBooksStore(testCase, database);
+ authorIndex = store.index('by_author');
+ }).then(database => {
+ const transaction = database.transaction('books', 'readonly');
+ const store = transaction.objectStore('books');
+ assert_array_equals(
+ store.indexNames, ['by_author', 'by_title'],
+ 'Test setup should have created two indexes');
+ authorIndex2 = store.index('by_author');
+ return checkAuthorIndexContents(
+ testCase, authorIndex2,
+ 'The index should have the expected contents before any renaming').
+ then(() => database.close());
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ const store = transaction.objectStore('books');
+ renamedAuthorIndex = store.index('by_author');
+ renamedAuthorIndex.name = 'renamed_by_author';
+
+ assert_equals(
+ renamedAuthorIndex.name, 'renamed_by_author',
+ 'IDBIndex name should change immediately after a rename');
+ assert_array_equals(
+ store.indexNames, ['by_title', 'renamed_by_author'],
+ 'IDBObjectStore.indexNames should immediately reflect the rename');
+ assert_equals(
+ store.index('renamed_by_author'), renamedAuthorIndex,
+ 'IDBObjectStore.index should return the renamed index store when ' +
+ 'queried using the new name immediately after the rename');
+ assert_throws(
+ 'NotFoundError', () => store.index('by_author'),
+ 'IDBObjectStore.index should throw when queried using the ' +
+ "renamed index's old name immediately after the rename");
+ })).then(database => {
+ const transaction = database.transaction('books', 'readonly');
+ const store = transaction.objectStore('books');
+ assert_array_equals(
+ store.indexNames, ['by_title', 'renamed_by_author'],
+ 'IDBObjectStore.indexNames should still reflect the rename after ' +
+ 'the versionchange transaction commits');
+ renamedAuthorIndex2 = store.index('renamed_by_author');
+ return checkAuthorIndexContents(
+ testCase, renamedAuthorIndex2,
+ 'Renaming an index should not change its contents').then(
+ () => database.close());
+ }).then(() => {
+ assert_equals(
+ authorIndex.name, 'by_author',
+ 'IDBIndex obtained before the rename transaction should not ' +
+ 'reflect the rename');
+ assert_equals(
+ authorIndex2.name, 'by_author',
+ 'IDBIndex obtained before the rename transaction should not ' +
+ 'reflect the rename');
+ assert_equals(
+ renamedAuthorIndex.name, 'renamed_by_author',
+ 'IDBIndex used in the rename transaction should keep reflecting ' +
+ 'the new name after the transaction is committed');
+ assert_equals(
+ renamedAuthorIndex2.name, 'renamed_by_author',
+ 'IDBIndex obtained after the rename transaction should reflect ' +
+ 'the new name');
+ });
+}, 'IndexedDB index rename in new transaction');
+
+promise_test(testCase => {
+ let renamedAuthorIndex = null, renamedAuthorIndex2 = null;
+ return createDatabase(testCase, (database, transaction) => {
+ const store = createBooksStore(testCase, database);
+ renamedAuthorIndex = store.index('by_author');
+ renamedAuthorIndex.name = 'renamed_by_author';
+
+ assert_equals(
+ renamedAuthorIndex.name, 'renamed_by_author',
+ 'IDBIndex name should change immediately after a rename');
+ assert_array_equals(
+ store.indexNames, ['by_title', 'renamed_by_author'],
+ 'IDBObjectStore.indexNames should immediately reflect the rename');
+ assert_equals(
+ store.index('renamed_by_author'), renamedAuthorIndex,
+ 'IDBObjectStore.index should return the renamed index store when ' +
+ 'queried using the new name immediately after the rename');
+ assert_throws(
+ 'NotFoundError', () => store.index('by_author'),
+ 'IDBObjectStore.index should throw when queried using the ' +
+ "renamed index's old name immediately after the rename");
+ }).then(database => {
+ const transaction = database.transaction('books', 'readonly');
+ const store = transaction.objectStore('books');
+ assert_array_equals(
+ store.indexNames, ['by_title', 'renamed_by_author'],
+ 'IDBObjectStore.indexNames should still reflect the rename after ' +
+ 'the versionchange transaction commits');
+ renamedAuthorIndex2 = store.index('renamed_by_author');
+ return checkAuthorIndexContents(
+ testCase, renamedAuthorIndex2,
+ 'Renaming an index should not change its contents').then(
+ () => database.close());
+ }).then(() => {
+ assert_equals(
+ renamedAuthorIndex.name, 'renamed_by_author',
+ 'IDBIndex used in the rename transaction should keep reflecting ' +
+ 'the new name after the transaction is committed');
+ assert_equals(
+ renamedAuthorIndex2.name, 'renamed_by_author',
+ 'IDBIndex obtained after the rename transaction should reflect ' +
+ 'the new name');
+ });
+}, 'IndexedDB index rename in the transaction where it is created');
+
+promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ const store = transaction.objectStore('books');
+ const index = store.index('by_author');
+ index.name = 'by_author';
+ assert_array_equals(
+ store.indexNames, ['by_author', 'by_title'],
+ 'Renaming an index to the same name should not change the ' +
+ "index's IDBObjectStore.indexNames");
+ })).then(database => {
+ const transaction = database.transaction('books', 'readonly');
+ const store = transaction.objectStore('books');
+ assert_array_equals(
+ store.indexNames, ['by_author', 'by_title'],
+ 'Committing a transaction that renames a store to the same name ' +
+ "should not change the index's IDBObjectStore.indexNames");
+ const index = store.index('by_author');
+ return checkAuthorIndexContents(
+ testCase, index,
+ 'Committing a transaction that renames an index to the same name ' +
+ "should not change the index's contents").then(
+ () => database.close());
+ });
+}, 'IndexedDB index rename to the same name succeeds');
+
+promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ const store = transaction.objectStore('books');
+ const index = store.index('by_author');
+ store.deleteIndex('by_title');
+ index.name = 'by_title';
+ assert_array_equals(
+ store.indexNames, ['by_title'],
+ 'IDBObjectStore.indexNames should immediately reflect the rename');
+ })).then(database => {
+ const transaction = database.transaction('books', 'readonly');
+ const store = transaction.objectStore('books');
+ assert_array_equals(
+ store.indexNames, ['by_title'],
+ 'IDBObjectStore.indexNames should still reflect the rename after ' +
+ 'the versionchange transaction commits');
+ const index = store.index('by_title');
+ return checkAuthorIndexContents(
+ testCase, index,
+ 'Renaming an index should not change its contents').then(
+ () => database.close());
+ });
+}, 'IndexedDB index rename to the name of a deleted index succeeds');
+
+promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ const store = transaction.objectStore('books');
+ store.index('by_author').name = 'tmp';
+ store.index('by_title').name = 'by_author';
+ store.index('tmp').name = 'by_title';
+ assert_array_equals(
+ store.indexNames, ['by_author', 'by_title'],
+ 'IDBObjectStore.indexNames should reflect the swap immediately ' +
+ 'after the renames');
+ return checkTitleIndexContents(
+ testCase, store.index('by_author'),
+ 'Renaming an index should not change its contents');
+ })).then(database => {
+ const transaction = database.transaction('books', 'readonly');
+ const store = transaction.objectStore('books');
+ assert_array_equals(
+ store.indexNames, ['by_author', 'by_title'],
+ 'IDBObjectStore.indexNames should still reflect the swap after ' +
+ 'the versionchange transaction commits');
+ const index = store.index('by_title');
+ return checkAuthorIndexContents(
+ testCase, index,
+ 'Renaming an index should not change its contents').then(
+ () => database.close());
+ });
+}, 'IndexedDB index swapping via renames succeeds');
+
+promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ const store = transaction.objectStore('books');
+ const index = store.index('by_author');
+
+ index.name = 42;
+ assert_equals(index.name, '42',
+ 'IDBIndex name should change immediately after a rename to a ' +
+ 'number');
+ assert_array_equals(
+ store.indexNames, ['42', 'by_title'],
+ 'IDBObjectStore.indexNames should immediately reflect the ' +
+ 'stringifying rename');
+
+ index.name = true;
+ assert_equals(index.name, 'true',
+ 'IDBIndex name should change immediately after a rename to a ' +
+ 'boolean');
+
+ index.name = {};
+ assert_equals(index.name, '[object Object]',
+ 'IDBIndex name should change immediately after a rename to an ' +
+ 'object');
+
+ index.name = () => null;
+ assert_equals(index.name, '() => null',
+ 'IDBIndex name should change immediately after a rename to a ' +
+ 'function');
+
+ index.name = undefined;
+ assert_equals(index.name, 'undefined',
+ 'IDBIndex name should change immediately after a rename to ' +
+ 'undefined');
+ })).then(database => {
+ const transaction = database.transaction('books', 'readonly');
+ const store = transaction.objectStore('books');
+ assert_array_equals(
+ store.indexNames, ['by_title', 'undefined'],
+ 'IDBObjectStore.indexNames should reflect the last rename ' +
+ 'after the versionchange transaction commits');
+ const index = store.index('undefined');
+ return checkAuthorIndexContents(
+ testCase, index,
+ 'Renaming an index should not change its contents').then(
+ () => database.close());
+ });
+}, 'IndexedDB index rename stringifies non-string names');
+
+for (let escapedName of ['', '\\u0000', '\\uDC00\\uD800']) ((escapedName) => {
+ const name = JSON.parse('"' + escapedName + '"');
+ promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ const store = transaction.objectStore('books');
+ const index = store.index('by_author');
+
+ index.name = name;
+ assert_equals(index.name, name,
+ 'IDBIndex name should change immediately after the rename');
+ assert_array_equals(
+ store.indexNames, [name, 'by_title'].sort(),
+ 'IDBObjectStore.indexNames should immediately reflect the rename');
+ })).then(database => {
+ const transaction = database.transaction('books', 'readonly');
+ const store = transaction.objectStore('books');
+ assert_array_equals(
+ store.indexNames, [name, 'by_title'].sort(),
+ 'IDBObjectStore.indexNames should reflect the rename ' +
+ 'after the versionchange transaction commits');
+ const index = store.index(name);
+ return checkAuthorIndexContents(
+ testCase, index,
+ 'Renaming an index should not change its contents').then(
+ () => database.close());
+ });
+ }, 'IndexedDB index can be renamed to "' + escapedName + '"');
+})(escapedName);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/IndexedDB/idbobjectstore-rename-abort.html b/tests/wpt/web-platform-tests/IndexedDB/idbobjectstore-rename-abort.html
new file mode 100644
index 00000000000..b59117a8084
--- /dev/null
+++ b/tests/wpt/web-platform-tests/IndexedDB/idbobjectstore-rename-abort.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html>
+<title>IndexedDB: object store renaming support in aborted transactions</title>
+<link rel="help"
+ href="https://w3c.github.io/IndexedDB/#dom-idbobjectstore-name">
+<link rel="author" href="pwnall@chromium.org" title="Victor Costan">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support-promises.js"></script>
+<script>
+
+promise_test(testCase => {
+ const dbName = databaseName(testCase);
+ let bookStore = null, bookStore2 = null;
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ bookStore = transaction.objectStore('books');
+ bookStore.name = 'renamed_books';
+
+ transaction.abort();
+
+ assert_equals(
+ bookStore.name, 'books',
+ 'IDBObjectStore.name should not reflect the rename any more ' +
+ 'immediately after transaction.abort() returns');
+ assert_array_equals(
+ database.objectStoreNames, ['books'],
+ 'IDBDatabase.objectStoreNames should not reflect the rename ' +
+ 'any more immediately after transaction.abort() returns');
+ assert_array_equals(
+ transaction.objectStoreNames, ['books'],
+ 'IDBTransaction.objectStoreNames should not reflect the ' +
+ 'rename any more immediately after transaction.abort() returns');
+ })).then(event => {
+ assert_equals(bookStore.name, 'books',
+ 'IDBObjectStore.name should not reflect the rename any more ' +
+ 'after the versionchange transaction is aborted');
+ const request = indexedDB.open(dbName, 1);
+ return requestWatcher(testCase, request).wait_for('success');
+ }).then(event => {
+ const database = event.target.result;
+ assert_array_equals(
+ database.objectStoreNames, ['books'],
+ 'IDBDatabase.objectStoreNames should not reflect the rename ' +
+ 'after the versionchange transaction is aborted');
+
+ const transaction = database.transaction('books', 'readonly');
+ bookStore2 = transaction.objectStore('books');
+ return checkStoreContents(
+ testCase, bookStore2,
+ 'Aborting an object store rename transaction should not change ' +
+ "the store's records").then(() => database.close());
+ }).then(() => {
+ assert_equals(
+ bookStore.name, 'books',
+ 'IDBObjectStore used in aborted rename transaction should not ' +
+ 'reflect the rename after the transaction is aborted');
+ assert_equals(
+ bookStore2.name, 'books',
+ 'IDBObjectStore obtained after an aborted rename transaction ' +
+ 'should not reflect the rename');
+ });
+}, 'IndexedDB object store rename in aborted transaction');
+
+promise_test(testCase => {
+ const dbName = databaseName(testCase);
+ let notBookStore = null;
+ return createDatabase(testCase, (database, transaction) => {
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ notBookStore = createNotBooksStore(testCase, database);
+ notBookStore.name = 'not_books_renamed';
+ notBookStore.name = 'not_books_renamed_again';
+
+ transaction.abort();
+
+ assert_equals(
+ notBookStore.name, 'not_books_renamed_again',
+ 'IDBObjectStore.name should reflect the last rename ' +
+ 'immediately after transaction.abort() returns');
+ assert_array_equals(
+ database.objectStoreNames, [],
+ 'IDBDatabase.objectStoreNames should not reflect the creation ' +
+ 'or the rename any more immediately after transaction.abort() ' +
+ 'returns');
+ assert_array_equals(
+ transaction.objectStoreNames, [],
+ 'IDBTransaction.objectStoreNames should not reflect the ' +
+ 'creation or the rename any more immediately after ' +
+ 'transaction.abort() returns');
+ assert_array_equals(notBookStore.indexNames, [],
+ 'IDBObjectStore.indexNames for the newly created store ' +
+ 'should be empty immediately after transaction.abort() ' +
+ 'returns');
+ })).then(event => {
+ assert_equals(
+ notBookStore.name, 'not_books_renamed_again',
+ 'IDBObjectStore.name should reflect the last rename after the ' +
+ 'versionchange transaction is aborted');
+ assert_array_equals(notBookStore.indexNames, [],
+ 'IDBObjectStore.indexNames for the newly created store ' +
+ 'should be empty after the versionchange transaction is aborted ' +
+ 'returns');
+ const request = indexedDB.open(dbName, 1);
+ return requestWatcher(testCase, request).wait_for('success');
+ }).then(event => {
+ const database = event.target.result;
+ assert_array_equals(
+ database.objectStoreNames, [],
+ 'IDBDatabase.objectStoreNames should not reflect the creation or ' +
+ 'the rename after the versionchange transaction is aborted');
+
+ database.close();
+ });
+}, 'IndexedDB object store creation and rename in an aborted transaction');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/IndexedDB/idbobjectstore-rename-errors.html b/tests/wpt/web-platform-tests/IndexedDB/idbobjectstore-rename-errors.html
new file mode 100644
index 00000000000..8e603baeccd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/IndexedDB/idbobjectstore-rename-errors.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html>
+<title>IndexedDB: object store renaming error handling</title>
+<link rel="help"
+ href="https://w3c.github.io/IndexedDB/#dom-idbobjectstore-name">
+<link rel="author" href="pwnall@chromium.org" title="Victor Costan">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support-promises.js"></script>
+<script>
+
+promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ const store = transaction.objectStore('books');
+ database.deleteObjectStore('books');
+ assert_throws('InvalidStateError', () => store.name = 'renamed_books');
+ })).then(database => {
+ database.close();
+ });
+}, 'IndexedDB deleted object store rename throws');
+
+promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ const transaction = database.transaction('books', 'readonly');
+ const store = transaction.objectStore('books');
+ assert_throws('InvalidStateError', () => store.name = 'renamed_books');
+ database.close();
+ });
+}, 'IndexedDB object store rename throws in a readonly transaction');
+
+promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ const transaction = database.transaction('books', 'readwrite');
+ const store = transaction.objectStore('books');
+
+ assert_throws('InvalidStateError', () => store.name = 'renamed_books');
+ database.close();
+ });
+}, 'IndexedDB object store rename throws in a readwrite transaction');
+
+promise_test(testCase => {
+ let bookStore = null;
+ return createDatabase(testCase, (database, transaction) => {
+ bookStore = createBooksStore(testCase, database);
+ }).then(database => {
+ assert_throws('TransactionInactiveError',
+ () => { bookStore.name = 'renamed_books'; });
+ database.close();
+ });
+}, 'IndexedDB object store rename throws in an inactive transaction');
+
+promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ createNotBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ const store = transaction.objectStore('books');
+ assert_throws('ConstraintError', () => store.name = 'not_books');
+ assert_array_equals(
+ database.objectStoreNames, ['books', 'not_books'],
+ 'A store rename that throws an exception should not change the ' +
+ "store's IDBDatabase.objectStoreNames");
+ })).then(database => {
+ assert_array_equals(
+ database.objectStoreNames, ['books', 'not_books'],
+ 'Committing a transaction with a failed store rename attempt ' +
+ "should not change the store's IDBDatabase.objectStoreNames");
+ const transaction = database.transaction('books', 'readonly');
+ const store = transaction.objectStore('books');
+ return checkStoreContents(
+ testCase, store,
+ 'Committing a transaction with a failed rename attempt should ' +
+ "not change the store's contents").then(() => database.close());
+ });
+}, 'IndexedDB object store rename to the name of another store throws');
+
+promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ const store = transaction.objectStore('books');
+ assert_throws(
+ { name: 'Custom stringifying error' },
+ () => {
+ store.name = {
+ toString: () => { throw { name: 'Custom stringifying error'}; }
+ };
+ }, 'IDBObjectStore rename should re-raise toString() exception');
+ assert_array_equals(
+ database.objectStoreNames, ['books'],
+ 'A store rename that throws an exception should not change the ' +
+ "store's IDBDatabase.objectStoreNames");
+ })).then(database => {
+ assert_array_equals(
+ database.objectStoreNames, ['books'],
+ 'Committing a transaction with a failed store rename attempt ' +
+ "should not change the store's IDBDatabase.objectStoreNames");
+ const transaction = database.transaction('books', 'readonly');
+ const store = transaction.objectStore('books');
+ return checkStoreContents(
+ testCase, store,
+ 'Committing a transaction with a failed rename attempt should ' +
+ "not change the store's contents").then(() => database.close());
+ });
+}, 'IndexedDB object store rename handles exceptions when stringifying names');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/IndexedDB/idbobjectstore-rename-store.html b/tests/wpt/web-platform-tests/IndexedDB/idbobjectstore-rename-store.html
new file mode 100644
index 00000000000..47860b59014
--- /dev/null
+++ b/tests/wpt/web-platform-tests/IndexedDB/idbobjectstore-rename-store.html
@@ -0,0 +1,366 @@
+<!DOCTYPE html>
+<title>IndexedDB: object store renaming support</title>
+<link rel="help"
+ href="https://w3c.github.io/IndexedDB/#dom-idbobjectstore-name">
+<link rel="author" href="pwnall@chromium.org" title="Victor Costan">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support-promises.js"></script>
+<script>
+
+// Renames the 'books' store to 'renamed_books'.
+//
+// Returns a promise that resolves to an IndexedDB database. The caller must
+// close the database.
+const renameBooksStore = (testCase) => {
+ return migrateDatabase(testCase, 2, (database, transaction) => {
+ const store = transaction.objectStore('books');
+ store.name = 'renamed_books';
+ });
+};
+
+promise_test(testCase => {
+ let bookStore = null, bookStore2 = null;
+ let renamedBookStore = null, renamedBookStore2 = null;
+ return createDatabase(testCase, (database, transaction) => {
+ bookStore = createBooksStore(testCase, database);
+ }).then(database => {
+ assert_array_equals(
+ database.objectStoreNames, ['books'],
+ 'Test setup should have created a "books" object store');
+ const transaction = database.transaction('books', 'readonly');
+ bookStore2 = transaction.objectStore('books');
+ return checkStoreContents(
+ testCase, bookStore2,
+ 'The store should have the expected contents before any renaming').
+ then(() => database.close());
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ renamedBookStore = transaction.objectStore('books');
+ renamedBookStore.name = 'renamed_books';
+
+ assert_equals(
+ renamedBookStore.name, 'renamed_books',
+ 'IDBObjectStore name should change immediately after a rename');
+ assert_array_equals(
+ database.objectStoreNames, ['renamed_books'],
+ 'IDBDatabase.objectStoreNames should immediately reflect the ' +
+ 'rename');
+ assert_array_equals(
+ transaction.objectStoreNames, ['renamed_books'],
+ 'IDBTransaction.objectStoreNames should immediately reflect the ' +
+ 'rename');
+ assert_equals(
+ transaction.objectStore('renamed_books'), renamedBookStore,
+ 'IDBTransaction.objectStore should return the renamed object ' +
+ 'store when queried using the new name immediately after the ' +
+ 'rename');
+ assert_throws(
+ 'NotFoundError', () => transaction.objectStore('books'),
+ 'IDBTransaction.objectStore should throw when queried using the ' +
+ "renamed object store's old name immediately after the rename");
+ })).then(database => {
+ assert_array_equals(
+ database.objectStoreNames, ['renamed_books'],
+ 'IDBDatabase.objectStoreNames should still reflect the rename ' +
+ 'after the versionchange transaction commits');
+ const transaction = database.transaction('renamed_books', 'readonly');
+ renamedBookStore2 = transaction.objectStore('renamed_books');
+ return checkStoreContents(
+ testCase, renamedBookStore2,
+ 'Renaming an object store should not change its records').then(
+ () => database.close());
+ }).then(() => {
+ assert_equals(
+ bookStore.name, 'books',
+ 'IDBObjectStore obtained before the rename transaction should ' +
+ 'not reflect the rename');
+ assert_equals(
+ bookStore2.name, 'books',
+ 'IDBObjectStore obtained before the rename transaction should ' +
+ 'not reflect the rename');
+ assert_equals(
+ renamedBookStore.name, 'renamed_books',
+ 'IDBObjectStore used in the rename transaction should keep ' +
+ 'reflecting the new name after the transaction is committed');
+ assert_equals(
+ renamedBookStore2.name, 'renamed_books',
+ 'IDBObjectStore obtained after the rename transaction should ' +
+ 'reflect the new name');
+ });
+}, 'IndexedDB object store rename in new transaction');
+
+promise_test(testCase => {
+ let renamedBookStore = null, renamedBookStore2 = null;
+ return createDatabase(testCase, (database, transaction) => {
+ renamedBookStore = createBooksStore(testCase, database);
+ renamedBookStore.name = 'renamed_books';
+
+ assert_equals(
+ renamedBookStore.name, 'renamed_books',
+ 'IDBObjectStore name should change immediately after a rename');
+ assert_array_equals(
+ database.objectStoreNames, ['renamed_books'],
+ 'IDBDatabase.objectStoreNames should immediately reflect the ' +
+ 'rename');
+ assert_array_equals(
+ transaction.objectStoreNames, ['renamed_books'],
+ 'IDBTransaction.objectStoreNames should immediately reflect the ' +
+ 'rename');
+ assert_equals(
+ transaction.objectStore('renamed_books'), renamedBookStore,
+ 'IDBTransaction.objectStore should return the renamed object ' +
+ 'store when queried using the new name immediately after the ' +
+ 'rename');
+ assert_throws(
+ 'NotFoundError', () => transaction.objectStore('books'),
+ 'IDBTransaction.objectStore should throw when queried using the ' +
+ "renamed object store's old name immediately after the rename");
+ }).then(database => {
+ assert_array_equals(
+ database.objectStoreNames, ['renamed_books'],
+ 'IDBDatabase.objectStoreNames should still reflect the rename ' +
+ 'after the versionchange transaction commits');
+ const transaction = database.transaction('renamed_books', 'readonly');
+ renamedBookStore2 = transaction.objectStore('renamed_books');
+ return checkStoreContents(
+ testCase, renamedBookStore2,
+ 'Renaming an object store should not change its records').then(
+ () => database.close());
+ }).then(() => {
+ assert_equals(
+ renamedBookStore.name, 'renamed_books',
+ 'IDBObjectStore used in the rename transaction should keep ' +
+ 'reflecting the new name after the transaction is committed');
+ assert_equals(
+ renamedBookStore2.name, 'renamed_books',
+ 'IDBObjectStore obtained after the rename transaction should ' +
+ 'reflect the new name');
+ });
+}, 'IndexedDB object store rename in the transaction where it is created');
+
+promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ const transaction = database.transaction('books', 'readonly');
+ const store = transaction.objectStore('books');
+ return checkStoreIndexes(
+ testCase, store,
+ 'The object store index should have the expected contens before ' +
+ 'any renaming').then(
+ () => database.close());
+ }).then(() => renameBooksStore(testCase)
+ ).then(database => {
+ const transaction = database.transaction('renamed_books', 'readonly');
+ const store = transaction.objectStore('renamed_books');
+ return checkStoreIndexes(
+ testCase, store,
+ 'Renaming an object store should not change its indexes').then(
+ () => database.close());
+ });
+}, 'IndexedDB object store rename covers index');
+
+promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ const transaction = database.transaction('books', 'readwrite');
+ const store = transaction.objectStore('books');
+ return checkStoreGenerator(
+ testCase, store, 345679,
+ 'The object store key generator should have the expected state ' +
+ 'before any renaming').then(() => database.close());
+ }).then(() => renameBooksStore(testCase)
+ ).then(database => {
+ const transaction = database.transaction('renamed_books', 'readwrite');
+ const store = transaction.objectStore('renamed_books');
+ return checkStoreGenerator(
+ testCase, store, 345680,
+ 'Renaming an object store should not change the state of its key ' +
+ 'generator').then(() => database.close());
+ });
+}, 'IndexedDB object store rename covers key generator');
+
+promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ const store = transaction.objectStore('books');
+ store.name = 'books';
+ assert_array_equals(
+ database.objectStoreNames, ['books'],
+ 'Renaming a store to the same name should not change ' +
+ "the store's IDBDatabase.objectStoreNames");
+ })).then(database => {
+ assert_array_equals(
+ database.objectStoreNames, ['books'],
+ 'Committing a transaction that renames a store to the same name ' +
+ "should not change the store's IDBDatabase.objectStoreNames");
+ const transaction = database.transaction('books', 'readonly');
+ const store = transaction.objectStore('books');
+ return checkStoreContents(
+ testCase, store,
+ 'Committing a transaction that renames a store to the same name ' +
+ "should not change the store's contents").then(
+ () => database.close());
+ });
+}, 'IndexedDB object store rename to the same name succeeds');
+
+promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ createNotBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ const store = transaction.objectStore('books');
+ database.deleteObjectStore('not_books');
+ store.name = 'not_books';
+ assert_array_equals(
+ database.objectStoreNames, ['not_books'],
+ 'IDBDatabase.objectStoreNames should immediately reflect the ' +
+ 'rename');
+ })).then(database => {
+ assert_array_equals(
+ database.objectStoreNames, ['not_books'],
+ 'IDBDatabase.objectStoreNames should still reflect the rename ' +
+ 'after the versionchange transaction commits');
+ const transaction = database.transaction('not_books', 'readonly');
+ const store = transaction.objectStore('not_books');
+ return checkStoreContents(
+ testCase, store,
+ 'Renaming an object store should not change its records').then(
+ () => database.close());
+ });
+}, 'IndexedDB object store rename to the name of a deleted store succeeds');
+
+promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ createNotBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ const bookStore = transaction.objectStore('books');
+ const notBookStore = transaction.objectStore('not_books');
+
+ transaction.objectStore('books').name = 'tmp';
+ transaction.objectStore('not_books').name = 'books';
+ transaction.objectStore('tmp').name = 'not_books';
+
+ assert_array_equals(
+ database.objectStoreNames, ['books', 'not_books'],
+ 'IDBDatabase.objectStoreNames should immediately reflect the swap');
+
+ assert_equals(
+ transaction.objectStore('books'), notBookStore,
+ 'IDBTransaction.objectStore should return the original "books" ' +
+ 'store when queried with "not_books" after the swap');
+ assert_equals(
+ transaction.objectStore('not_books'), bookStore,
+ 'IDBTransaction.objectStore should return the original ' +
+ '"not_books" store when queried with "books" after the swap');
+ })).then(database => {
+ assert_array_equals(
+ database.objectStoreNames, ['books', 'not_books'],
+ 'IDBDatabase.objectStoreNames should still reflect the swap ' +
+ 'after the versionchange transaction commits');
+ const transaction = database.transaction('not_books', 'readonly');
+ const store = transaction.objectStore('not_books');
+ assert_array_equals(
+ store.indexNames, ['by_author', 'by_title'],
+ '"not_books" index names should still reflect the swap after the ' +
+ 'versionchange transaction commits');
+ return checkStoreContents(
+ testCase, store,
+ 'Swapping two object stores should not change their records').then(
+ () => database.close());
+ });
+}, 'IndexedDB object store swapping via renames succeeds');
+
+promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ const store = transaction.objectStore('books');
+
+ store.name = 42;
+ assert_equals(store.name, '42',
+ 'IDBObjectStore name should change immediately after a ' +
+ 'rename to a number');
+ assert_array_equals(
+ database.objectStoreNames, ['42'],
+ 'IDBDatabase.objectStoreNames should immediately reflect the ' +
+ 'stringifying rename');
+
+ store.name = true;
+ assert_equals(store.name, 'true',
+ 'IDBObjectStore name should change immediately after a ' +
+ 'rename to a boolean');
+
+ store.name = {};
+ assert_equals(store.name, '[object Object]',
+ 'IDBObjectStore name should change immediately after a ' +
+ 'rename to an object');
+
+ store.name = () => null;
+ assert_equals(store.name, '() => null',
+ 'IDBObjectStore name should change immediately after a ' +
+ 'rename to a function');
+
+ store.name = undefined;
+ assert_equals(store.name, 'undefined',
+ 'IDBObjectStore name should change immediately after a ' +
+ 'rename to undefined');
+ })).then(database => {
+ assert_array_equals(
+ database.objectStoreNames, ['undefined'],
+ 'IDBDatabase.objectStoreNames should reflect the last rename ' +
+ 'after the versionchange transaction commits');
+ const transaction = database.transaction('undefined', 'readonly');
+ const store = transaction.objectStore('undefined');
+ return checkStoreContents(
+ testCase, store,
+ 'Renaming an object store should not change its records').then(
+ () => database.close());
+ });
+}, 'IndexedDB object store rename stringifies non-string names');
+
+for (let escapedName of ['', '\\u0000', '\\uDC00\\uD800']) ((escapedName) => {
+ const name = JSON.parse('"' + escapedName + '"');
+ promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ const store = transaction.objectStore('books');
+
+ store.name = name;
+ assert_equals(store.name, name,
+ 'IDBObjectStore name should change immediately after the ' +
+ 'rename');
+ assert_array_equals(
+ database.objectStoreNames, [name],
+ 'IDBDatabase.objectStoreNames should immediately reflect the ' +
+ 'rename');
+ })).then(database => {
+ assert_array_equals(
+ database.objectStoreNames, [name],
+ 'IDBDatabase.objectStoreNames should reflect the rename ' +
+ 'after the versionchange transaction commits');
+ const transaction = database.transaction(name, 'readonly');
+ const store = transaction.objectStore(name);
+ return checkStoreContents(
+ testCase, store,
+ 'Renaming an object store should not change its records').then(
+ () => database.close());
+ });
+ }, 'IndexedDB object store can be renamed to "' + escapedName + '"');
+})(escapedName);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/IndexedDB/interfaces.html b/tests/wpt/web-platform-tests/IndexedDB/interfaces.html
index cc4e7f20392..55e752f2630 100644
--- a/tests/wpt/web-platform-tests/IndexedDB/interfaces.html
+++ b/tests/wpt/web-platform-tests/IndexedDB/interfaces.html
@@ -21,8 +21,8 @@ setup(function() {
var idls = request.responseText;
idlArray.add_untested_idls("[PrimaryGlobal] interface Window { };");
- idlArray.add_untested_idls("interface Event { };");
- idlArray.add_untested_idls("interface EventTarget { };");
+ idlArray.add_untested_idls("[Exposed=(Window,Worker)] interface Event { };");
+ idlArray.add_untested_idls("[Exposed=(Window,Worker)] interface EventTarget { };");
// From Indexed DB:
idlArray.add_idls(idls);
diff --git a/tests/wpt/web-platform-tests/IndexedDB/interfaces.idl b/tests/wpt/web-platform-tests/IndexedDB/interfaces.idl
index 353864de259..de196bf2d3a 100644
--- a/tests/wpt/web-platform-tests/IndexedDB/interfaces.idl
+++ b/tests/wpt/web-platform-tests/IndexedDB/interfaces.idl
@@ -9,6 +9,7 @@ enum IDBRequestReadyState {
"done"
};
+[Exposed=(Window,Worker)]
interface IDBKeyRange {
readonly attribute any lower;
readonly attribute any upper;
@@ -42,6 +43,7 @@ dictionary IDBVersionChangeEventInit : EventInit {
unsigned long long? newVersion = null;
};
+[Exposed=(Window,Worker)]
interface IDBRequest : EventTarget {
readonly attribute any result;
readonly attribute DOMError error;
@@ -52,12 +54,14 @@ interface IDBRequest : EventTarget {
attribute EventHandler onerror;
};
+[Exposed=(Window,Worker)]
interface IDBOpenDBRequest : IDBRequest {
attribute EventHandler onblocked;
attribute EventHandler onupgradeneeded;
};
-[Constructor(DOMString type, optional IDBVersionChangeEventInit eventInitDict)]
+[Exposed=(Window,Worker),
+ Constructor(DOMString type, optional IDBVersionChangeEventInit eventInitDict)]
interface IDBVersionChangeEvent : Event {
readonly attribute unsigned long long oldVersion;
readonly attribute unsigned long long? newVersion;
@@ -68,12 +72,14 @@ interface IDBEnvironment {
readonly attribute IDBFactory indexedDB;
};
+[Exposed=(Window,Worker)]
interface IDBFactory {
IDBOpenDBRequest open (DOMString name, [EnforceRange] optional unsigned long long version);
IDBOpenDBRequest deleteDatabase (DOMString name);
short cmp (any first, any second);
};
+[Exposed=(Window,Worker)]
interface IDBDatabase : EventTarget {
readonly attribute DOMString name;
readonly attribute unsigned long long version;
@@ -88,6 +94,7 @@ interface IDBDatabase : EventTarget {
attribute EventHandler onversionchange;
};
+[Exposed=(Window,Worker)]
interface IDBObjectStore {
attribute DOMString name;
readonly attribute any keyPath;
@@ -106,6 +113,7 @@ interface IDBObjectStore {
IDBRequest count (optional any key);
};
+[Exposed=(Window,Worker)]
interface IDBIndex {
attribute DOMString name;
readonly attribute IDBObjectStore objectStore;
@@ -119,6 +127,7 @@ interface IDBIndex {
IDBRequest count (optional any key);
};
+[Exposed=(Window,Worker)]
interface IDBCursor {
readonly attribute (IDBObjectStore or IDBIndex) source;
readonly attribute IDBCursorDirection direction;
@@ -130,10 +139,12 @@ interface IDBCursor {
IDBRequest delete ();
};
+[Exposed=(Window,Worker)]
interface IDBCursorWithValue : IDBCursor {
readonly attribute any value;
};
+[Exposed=(Window,Worker)]
interface IDBTransaction : EventTarget {
readonly attribute IDBTransactionMode mode;
readonly attribute IDBDatabase db;
diff --git a/tests/wpt/web-platform-tests/IndexedDB/interfaces.worker.js b/tests/wpt/web-platform-tests/IndexedDB/interfaces.worker.js
index 161acca34da..87e33805087 100644
--- a/tests/wpt/web-platform-tests/IndexedDB/interfaces.worker.js
+++ b/tests/wpt/web-platform-tests/IndexedDB/interfaces.worker.js
@@ -10,9 +10,9 @@ request.onload = function() {
var idlArray = new IdlArray();
var idls = request.responseText;
- idlArray.add_untested_idls("interface WorkerGlobalScope {};");
- idlArray.add_untested_idls("interface Event { };");
- idlArray.add_untested_idls("interface EventTarget { };");
+ idlArray.add_untested_idls("[Exposed=Worker] interface WorkerGlobalScope {};");
+ idlArray.add_untested_idls("[Exposed=(Window,Worker)] interface Event { };");
+ idlArray.add_untested_idls("[Exposed=(Window,Worker)] interface EventTarget { };");
// From Indexed DB:
idlArray.add_idls("WorkerGlobalScope implements IDBEnvironment;");
diff --git a/tests/wpt/web-platform-tests/IndexedDB/support-promises.js b/tests/wpt/web-platform-tests/IndexedDB/support-promises.js
new file mode 100644
index 00000000000..c24a9fb92bd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/IndexedDB/support-promises.js
@@ -0,0 +1,200 @@
+// Returns an IndexedDB database name likely to be unique to the test case.
+const databaseName = (testCase) => {
+ return 'db' + self.location.pathname + '-' + testCase.name;
+};
+
+// Creates an EventWatcher covering all the events that can be issued by
+// IndexedDB requests and transactions.
+const requestWatcher = (testCase, request) => {
+ return new EventWatcher(testCase, request,
+ ['error', 'success', 'upgradeneeded']);
+};
+
+// Migrates an IndexedDB database whose name is unique for the test case.
+//
+// newVersion must be greater than the database's current version.
+//
+// migrationCallback will be called during a versionchange transaction and will
+// be given the created database and the versionchange transaction.
+//
+// Returns a promise. If the versionchange transaction goes through, the promise
+// resolves to an IndexedDB database that must be closed by the caller. If the
+// versionchange transaction is aborted, the promise resolves to an error.
+const migrateDatabase = (testCase, newVersion, migrationCallback) => {
+ // We cannot use eventWatcher.wait_for('upgradeneeded') here, because
+ // the versionchange transaction auto-commits before the Promise's then
+ // callback gets called.
+ return new Promise((resolve, reject) => {
+ const request = indexedDB.open(databaseName(testCase), newVersion);
+ request.onupgradeneeded = testCase.step_func(event => {
+ const database = event.target.result;
+ const transaction = event.target.transaction;
+ let abortCalled = false;
+
+ // We wrap IDBTransaction.abort so we can set up the correct event
+ // listeners and expectations if the test chooses to abort the
+ // versionchange transaction.
+ const transactionAbort = transaction.abort.bind(transaction);
+ transaction.abort = () => {
+ request.onerror = event => {
+ event.preventDefault();
+ resolve(event);
+ };
+ request.onsuccess = () => reject(new Error(
+ 'indexedDB.open should not succeed after the ' +
+ 'versionchange transaction is aborted'));
+ transactionAbort();
+ abortCalled = true;
+ }
+
+ migrationCallback(database, transaction);
+ if (!abortCalled) {
+ request.onsuccess = null;
+ resolve(requestWatcher(testCase, request).wait_for('success'));
+ }
+ });
+ request.onerror = event => reject(event.target.error);
+ request.onsuccess = () => reject(new Error(
+ 'indexedDB.open should not succeed without creating a ' +
+ 'versionchange transaction'));
+ }).then(event => event.target.result || event.target.error);
+};
+
+// Creates an IndexedDB database whose name is unique for the test case.
+//
+// setupCallback will be called during a versionchange transaction, and will be
+// given the created database and the versionchange transaction.
+//
+// Returns a promise that resolves to an IndexedDB database. The caller must
+// close the database.
+const createDatabase = (testCase, setupCallback) => {
+ const request = indexedDB.deleteDatabase(databaseName(testCase));
+ const eventWatcher = requestWatcher(testCase, request);
+
+ return eventWatcher.wait_for('success').then(event =>
+ migrateDatabase(testCase, 1, setupCallback));
+};
+
+// Opens an IndexedDB database without performing schema changes.
+//
+// The given version number must match the database's current version.
+//
+// Returns a promise that resolves to an IndexedDB database. The caller must
+// close the database.
+const openDatabase = (testCase, version) => {
+ const request = indexedDB.open(databaseName(testCase), version);
+ const eventWatcher = requestWatcher(testCase, request);
+ return eventWatcher.wait_for('success').then(
+ event => event.target.result);
+}
+
+// The data in the 'books' object store records in the first example of the
+// IndexedDB specification.
+const BOOKS_RECORD_DATA = [
+ { title: 'Quarry Memories', author: 'Fred', isbn: 123456 },
+ { title: 'Water Buffaloes', author: 'Fred', isbn: 234567 },
+ { title: 'Bedrock Nights', author: 'Barney', isbn: 345678 },
+];
+
+// Creates a 'books' object store whose contents closely resembles the first
+// example in the IndexedDB specification.
+const createBooksStore = (testCase, database) => {
+ const store = database.createObjectStore('books',
+ { keyPath: 'isbn', autoIncrement: true });
+ store.createIndex('by_author', 'author');
+ store.createIndex('by_title', 'title', { unique: true });
+ for (let record of BOOKS_RECORD_DATA)
+ store.put(record);
+ return store;
+};
+
+// Creates a 'not_books' object store used to test renaming into existing or
+// deleted store names.
+const createNotBooksStore = (testCase, database) => {
+ const store = database.createObjectStore('not_books');
+ store.createIndex('not_by_author', 'author');
+ store.createIndex('not_by_title', 'title', { unique: true });
+ return store;
+};
+
+// Verifies that an object store's indexes match the indexes used to create the
+// books store in the test database's version 1.
+//
+// The errorMessage is used if the assertions fail. It can state that the
+// IndexedDB implementation being tested is incorrect, or that the testing code
+// is using it incorrectly.
+const checkStoreIndexes = (testCase, store, errorMessage) => {
+ assert_array_equals(
+ store.indexNames, ['by_author', 'by_title'], errorMessage);
+ const authorIndex = store.index('by_author');
+ const titleIndex = store.index('by_title');
+ return Promise.all([
+ checkAuthorIndexContents(testCase, authorIndex, errorMessage),
+ checkTitleIndexContents(testCase, titleIndex, errorMessage),
+ ]);
+};
+
+// Verifies that an object store's key generator is in the same state as the
+// key generator created for the books store in the test database's version 1.
+//
+// The errorMessage is used if the assertions fail. It can state that the
+// IndexedDB implementation being tested is incorrect, or that the testing code
+// is using it incorrectly.
+const checkStoreGenerator = (testCase, store, expectedKey, errorMessage) => {
+ const request = store.put(
+ { title: 'Bedrock Nights ' + expectedKey, author: 'Barney' });
+ const eventWatcher = requestWatcher(testCase, request);
+ return eventWatcher.wait_for('success').then(() => {
+ const result = request.result;
+ assert_equals(result, expectedKey, errorMessage);
+ });
+};
+
+// Verifies that an object store's contents matches the contents used to create
+// the books store in the test database's version 1.
+//
+// The errorMessage is used if the assertions fail. It can state that the
+// IndexedDB implementation being tested is incorrect, or that the testing code
+// is using it incorrectly.
+const checkStoreContents = (testCase, store, errorMessage) => {
+ const request = store.get(123456);
+ const eventWatcher = requestWatcher(testCase, request);
+ return eventWatcher.wait_for('success').then(() => {
+ const result = request.result;
+ assert_equals(result.isbn, BOOKS_RECORD_DATA[0].isbn, errorMessage);
+ assert_equals(result.author, BOOKS_RECORD_DATA[0].author, errorMessage);
+ assert_equals(result.title, BOOKS_RECORD_DATA[0].title, errorMessage);
+ });
+};
+
+// Verifies that index matches the 'by_author' index used to create the
+// by_author books store in the test database's version 1.
+//
+// The errorMessage is used if the assertions fail. It can state that the
+// IndexedDB implementation being tested is incorrect, or that the testing code
+// is using it incorrectly.
+const checkAuthorIndexContents = (testCase, index, errorMessage) => {
+ const request = index.get(BOOKS_RECORD_DATA[2].author);
+ const eventWatcher = requestWatcher(testCase, request);
+ return eventWatcher.wait_for('success').then(() => {
+ const result = request.result;
+ assert_equals(result.isbn, BOOKS_RECORD_DATA[2].isbn, errorMessage);
+ assert_equals(result.title, BOOKS_RECORD_DATA[2].title, errorMessage);
+ });
+};
+
+// Verifies that an index matches the 'by_title' index used to create the books
+// store in the test database's version 1.
+//
+// The errorMessage is used if the assertions fail. It can state that the
+// IndexedDB implementation being tested is incorrect, or that the testing code
+// is using it incorrectly.
+const checkTitleIndexContents = (testCase, index, errorMessage) => {
+ const request = index.get(BOOKS_RECORD_DATA[2].title);
+ const eventWatcher = requestWatcher(testCase, request);
+ return eventWatcher.wait_for('success').then(() => {
+ const result = request.result;
+ assert_equals(result.isbn, BOOKS_RECORD_DATA[2].isbn, errorMessage);
+ assert_equals(result.author, BOOKS_RECORD_DATA[2].author, errorMessage);
+ });
+};
diff --git a/tests/wpt/web-platform-tests/IndexedDB/transaction-abort-generator-revert.html b/tests/wpt/web-platform-tests/IndexedDB/transaction-abort-generator-revert.html
new file mode 100644
index 00000000000..770d623f7b4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/IndexedDB/transaction-abort-generator-revert.html
@@ -0,0 +1,108 @@
+<!DOCTYPE html>
+<title>IndexedDB: aborting transactions reverts an object store's key generator state</title>
+<link rel="help" href="https://w3c.github.io/IndexedDB/#abort-transaction">
+<link rel="author" href="pwnall@chromium.org" title="Victor Costan">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support-promises.js"></script>
+<script>
+
+promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => {
+ return new Promise((resolve, reject) => {
+ const request = indexedDB.open(databaseName(testCase), 2);
+ request.onupgradeneeded = testCase.step_func(event => {
+ const database = event.target.result;
+ const transaction = event.target.transaction;
+ const store = transaction.objectStore('books');
+ const request2 = store.put(
+ { title: 'Bedrock Nights II', author: 'Barney' });
+ request2.onerror = testCase.unreached_func(
+ 'IDBObjectStore.put() should not receive an error request');
+ request2.onsuccess = testCase.step_func(event => {
+ assert_equals(
+ event.target.result, 345679,
+ "The key generator's current number should be set by " +
+ 'the last put operation in the database creation ' +
+ 'transaction');
+
+ request.onerror = event => {
+ event.preventDefault();
+ resolve(event);
+ };
+ request.onsuccess = () => reject(new Error(
+ 'indexedDB.open should not succeed after the ' +
+ 'versionchange transaction is aborted'));
+
+ transaction.abort();
+ });
+ });
+ request.onerror = event => reject(event.target.error);
+ request.onsuccess = () => reject(new Error(
+ 'indexedDB.open should not succeed without creating a ' +
+ 'versionchange transaction'));
+ });
+ }).then(() => {
+ return openDatabase(testCase, 1);
+ }).then(database => {
+ const transaction = database.transaction(['books'], 'readwrite');
+ const store = transaction.objectStore('books');
+
+ return checkStoreGenerator(
+ testCase, store, 345679,
+ "The key generator's current number should be reverted after the " +
+ 'transaction modifying it is aborted').then(() => database.close());
+ });
+}, 'The current number of a key generator is reverted when a versionchange ' +
+ 'transaction aborts');
+
+promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ return new Promise((resolve, reject) => {
+ const transaction = database.transaction(['books'], 'readwrite');
+ const store = transaction.objectStore('books');
+ const request = store.put(
+ { title: 'Bedrock Nights II', author: 'Barney' });
+ request.onerror = testCase.unreached_func(
+ 'IDBObjectStore.put() should not receive an error request');
+ request.onsuccess = testCase.step_func(event => {
+ assert_equals(
+ event.target.result, 345679,
+ "The key generator's current number should be set by the " +
+ 'last put operation in the database creation transaction');
+
+ transaction.onabort = event => {
+ event.preventDefault();
+ resolve(event);
+ }
+ transaction.abort();
+ });
+ transaction.onabort = () => reject(new Error(
+ 'The aborted readwrite transaction should not receive an ' +
+ 'abort event before IDBTransaction.abort() is called'));
+ transaction.oncomplete = () => reject(new Error(
+ 'The aborted readwrite transaction should not receive a ' +
+ 'completed event'));
+ transaction.onerror = () => reject(new Error(
+ 'The aborted readwrite transaction should not receive an ' +
+ 'error event'));
+ }).then(() => database);
+ }).then(database => {
+ const transaction = database.transaction(['books'], 'readwrite');
+ const store = transaction.objectStore('books');
+
+ return checkStoreGenerator(
+ testCase, store, 345679,
+ "The key generator's current number should be reverted after the " +
+ 'transaction modifying it is aborted').then(() => database.close());
+ });
+}, 'The current number of a key generator is reverted when a readwrite ' +
+ 'transaction aborts');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/IndexedDB/transaction-abort-index-metadata-revert.html b/tests/wpt/web-platform-tests/IndexedDB/transaction-abort-index-metadata-revert.html
new file mode 100644
index 00000000000..88ea28e22fa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/IndexedDB/transaction-abort-index-metadata-revert.html
@@ -0,0 +1,276 @@
+<!DOCTYPE html>
+<title>IndexedDB: aborting transactions reverts index metadata</title>
+<link rel="help" href="https://w3c.github.io/IndexedDB/#abort-transaction">
+<link rel="author" href="pwnall@chromium.org" title="Victor Costan">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support-promises.js"></script>
+<script>
+
+promise_test(testCase => {
+ let store = null, index = null;
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ store = createNotBooksStore(testCase, database);
+ index = store.index('not_by_author');
+ assert_array_equals(
+ store.indexNames, ['not_by_author', 'not_by_title'],
+ 'IDBObjectStore.indexNames should include newly created indexes ' +
+ 'before the transaction is aborted');
+
+ transaction.abort();
+ assert_throws(
+ 'InvalidStateError', () => index.get('query'),
+ 'IDBIndex.get should throw InvalidStateError, indicating that ' +
+ 'the index is marked for deletion, immediately after ' +
+ 'IDBTransaction.abort() returns');
+ assert_array_equals(
+ store.indexNames, [],
+ 'IDBObjectStore.indexNames should stop including the newly ' +
+ 'created indexes immediately after IDBTransaction.abort() returns');
+ })).then(() => {
+ assert_throws(
+ 'InvalidStateError', () => index.get('query'),
+ 'IDBIndex.get should throw InvalidStateError, indicating that ' +
+ 'the index is marked for deletion, after the transaction is ' +
+ 'aborted');
+ assert_array_equals(
+ store.indexNames, [],
+ 'IDBObjectStore.indexNames should stop including the newly ' +
+ 'created indexes after the transaction is aborted');
+ });
+}, 'Created stores get their indexes marked as deleted after the transaction ' +
+ 'that created them aborts');
+
+promise_test(testCase => {
+ let store = null, index = null;
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ createNotBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ store = transaction.objectStore('not_books');
+ index = store.index('not_by_author');
+
+ database.deleteObjectStore('not_books');
+ assert_throws(
+ 'InvalidStateError', () => index.get('query'),
+ 'IDBIndex.get should throw InvalidStateError, indicating that ' +
+ 'the index is marked for deletion, immediately after ' +
+ 'IDBDatabase.deleteObjectStore() returns');
+ assert_array_equals(
+ store.indexNames, [],
+ 'IDBObjectStore.indexNames should be empty immediately after ' +
+ 'IDBDatabase.deleteObjectStore() returns');
+
+ transaction.abort();
+ assert_throws(
+ 'TransactionInactiveError', () => index.get('query'),
+ 'IDBIndex.get should throw TransactionInactiveError, indicating ' +
+ 'that the index is no longer marked for deletion, immediately ' +
+ 'after IDBTransaction.abort() returns');
+ assert_array_equals(
+ store.indexNames, ['not_by_author', 'not_by_title'],
+ 'IDBObjectStore.indexNames should include the deleted indexes ' +
+ 'immediately after IDBTransaction.abort() returns');
+ })).then(() => {
+ assert_throws(
+ 'TransactionInactiveError', () => index.get('query'),
+ 'IDBIndex.get should throw TransactionInactiveError, indicating ' +
+ 'that the index is no longer marked for deletion, after the ' +
+ 'transaction is aborted');
+ assert_array_equals(
+ store.indexNames, ['not_by_author', 'not_by_title'],
+ 'IDBObjectStore.indexNames should include the deleted indexes ' +
+ 'after the transaction is aborted');
+ });
+}, 'Deleted stores get their indexes marked as not-deleted after the ' +
+ 'transaction that deleted them aborts');
+
+promise_test(testCase => {
+ let store = null, index = null;
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ store = createNotBooksStore(testCase, database);
+ index = store.index('not_by_author');
+ assert_array_equals(
+ store.indexNames, ['not_by_author', 'not_by_title'],
+ 'IDBObjectStore.indexNames should include newly created indexes ' +
+ 'before the transaction is aborted');
+
+ database.deleteObjectStore('not_books');
+ assert_throws(
+ 'InvalidStateError', () => index.get('query'),
+ 'IDBIndex.get should throw InvalidStateError, indicating that ' +
+ 'the index is marked for deletion, immediately after ' +
+ 'IDBDatabase.deleteObjectStore() returns');
+ assert_array_equals(
+ store.indexNames, [],
+ 'IDBObjectStore.indexNames should be empty immediately after ' +
+ 'IDBDatabase.deleteObjectStore() returns');
+
+ transaction.abort();
+ assert_throws(
+ 'InvalidStateError', () => index.get('query'),
+ 'IDBIndex.get should throw InvalidStateError, indicating that ' +
+ 'the index is still marked for deletion, immediately after ' +
+ 'IDBTransaction.abort() returns');
+ assert_array_equals(
+ store.indexNames, [],
+ 'IDBObjectStore.indexNames should not include the newly ' +
+ 'created indexes immediately after IDBTransaction.abort() returns');
+ })).then(() => {
+ assert_throws(
+ 'InvalidStateError', () => index.get('query'),
+ 'IDBIndex.get should throw InvalidStateError, indicating that ' +
+ 'the index is still marked for deletion, after the transaction ' +
+ 'is aborted');
+ assert_array_equals(
+ store.indexNames, [],
+ 'IDBObjectStore.indexNames should not include the newly ' +
+ 'created indexes after the transaction is aborted');
+ });
+}, 'Created+deleted stores still have their indexes marked as deleted after ' +
+ 'the transaction aborts');
+
+promise_test(testCase => {
+ let store = null, index = null;
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ createNotBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ store = transaction.objectStore('not_books');
+ index = store.createIndex('not_by_isbn', 'isbn');
+ assert_array_equals(
+ store.indexNames, ['not_by_author', 'not_by_isbn', 'not_by_title'],
+ 'IDBObjectStore.indexNames should include newly created indexes ' +
+ 'before the transaction is aborted');
+
+ transaction.abort();
+ assert_throws(
+ 'InvalidStateError', () => index.get('query'),
+ 'IDBIndex.get should throw InvalidStateError, indicating that ' +
+ 'the index is marked for deletion, immediately after ' +
+ 'IDBTransaction.abort() returns');
+ assert_array_equals(
+ store.indexNames, ['not_by_author', 'not_by_title'],
+ 'IDBObjectStore.indexNames should stop including the newly ' +
+ 'created index immediately after IDBTransaction.abort() returns');
+ })).then(() => {
+ assert_throws(
+ 'InvalidStateError', () => index.get('query'),
+ 'IDBIndex.get should throw InvalidStateError, indicating that ' +
+ 'the index is marked for deletion, after the transaction is ' +
+ 'aborted');
+ assert_array_equals(
+ store.indexNames, ['not_by_author', 'not_by_title'],
+ 'IDBObjectStore.indexNames should stop including the newly ' +
+ 'created index after the transaction is aborted');
+ });
+}, 'Created indexes get marked as deleted after their transaction aborts');
+
+promise_test(testCase => {
+ let store = null, index = null;
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ createNotBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ store = transaction.objectStore('not_books');
+ index = store.index('not_by_author');
+
+ store.deleteIndex('not_by_author');
+ assert_throws(
+ 'InvalidStateError', () => index.get('query'),
+ 'IDBIndex.get should throw InvalidStateError, indicating that ' +
+ 'the index is marked for deletion, immediately after ' +
+ 'IDBObjectStore.deleteIndex() returns');
+ assert_array_equals(
+ store.indexNames, ['not_by_title'],
+ 'IDBObjectStore.indexNames should not include the deleted index ' +
+ 'immediately after IDBObjectStore.deleteIndex() returns');
+
+ transaction.abort();
+ assert_throws(
+ 'TransactionInactiveError', () => index.get('query'),
+ 'IDBIndex.get should throw TransactionInactiveError, indicating ' +
+ 'that the index is no longer marked for deletion, immediately ' +
+ 'after IDBTransaction.abort() returns');
+ assert_array_equals(
+ store.indexNames, ['not_by_author', 'not_by_title'],
+ 'IDBObjectStore.indexNames should include the deleted indexes ' +
+ 'immediately after IDBTransaction.abort() returns');
+ })).then(() => {
+ assert_throws(
+ 'TransactionInactiveError', () => index.get('query'),
+ 'IDBIndex.get should throw TransactionInactiveError, indicating ' +
+ 'that the index is no longer marked for deletion, after the ' +
+ 'transaction is aborted');
+ assert_array_equals(
+ store.indexNames, ['not_by_author', 'not_by_title'],
+ 'IDBObjectStore.indexNames should include the deleted indexes ' +
+ 'after the transaction is aborted');
+ });
+}, 'Deleted indexes get marked as not-deleted after the transaction aborts');
+
+promise_test(testCase => {
+ let store = null, index = null;
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ createNotBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ store = transaction.objectStore('not_books');
+ index = store.createIndex('not_by_isbn', 'isbn');
+ assert_array_equals(
+ store.indexNames, ['not_by_author', 'not_by_isbn', 'not_by_title'],
+ 'IDBObjectStore.indexNames should include newly created indexes ' +
+ 'before the transaction is aborted');
+
+ store.deleteIndex('not_by_isbn');
+ assert_throws(
+ 'InvalidStateError', () => index.get('query'),
+ 'IDBIndex.get should throw InvalidStateError, indicating that ' +
+ 'the index is marked for deletion, immediately after ' +
+ 'IDBObjectStore.deleteIndex() returns');
+ assert_array_equals(
+ store.indexNames, ['not_by_author', 'not_by_title'],
+ 'IDBObjectStore.indexNames should not include the deleted index ' +
+ 'immediately after IDBObjectStore.deleteIndex() returns');
+
+ transaction.abort();
+ assert_throws(
+ 'InvalidStateError', () => index.get('query'),
+ 'IDBIndex.get should throw InvalidStateError, indicating that ' +
+ 'the index is still marked for deletion, immediately after ' +
+ 'IDBTransaction.abort() returns');
+ assert_array_equals(
+ store.indexNames, ['not_by_author', 'not_by_title'],
+ 'IDBObjectStore.indexNames should stop including the newly ' +
+ 'created index immediately after IDBTransaction.abort() returns');
+ })).then(() => {
+ assert_throws(
+ 'InvalidStateError', () => index.get('query'),
+ 'IDBIndex.get should throw InvalidStateError, indicating that ' +
+ 'the index is marked for deletion, after the transaction is ' +
+ 'aborted');
+ assert_array_equals(
+ store.indexNames, ['not_by_author', 'not_by_title'],
+ 'IDBObjectStore.indexNames should stop including the newly ' +
+ 'created index after the transaction is aborted');
+ });
+}, 'Created+deleted indexes are still marked as deleted after their ' +
+ 'transaction aborts');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/IndexedDB/transaction-abort-multiple-metadata-revert.html b/tests/wpt/web-platform-tests/IndexedDB/transaction-abort-multiple-metadata-revert.html
new file mode 100644
index 00000000000..4a00d4113ad
--- /dev/null
+++ b/tests/wpt/web-platform-tests/IndexedDB/transaction-abort-multiple-metadata-revert.html
@@ -0,0 +1,291 @@
+<!DOCTYPE html>
+<title>IndexedDB: aborting transactions reverts multiple operations on the same metadata</title>
+<link rel="help" href="https://w3c.github.io/IndexedDB/#abort-transaction">
+<link rel="author" href="pwnall@chromium.org" title="Victor Costan">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support-promises.js"></script>
+<script>
+
+promise_test(testCase => {
+ let store = null, index = null;
+ let migrationTransaction = null, migrationDatabase = null;
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ store = createNotBooksStore(testCase, database);
+ migrationDatabase = database;
+ migrationTransaction = transaction;
+ assert_array_equals(
+ database.objectStoreNames, ['books', 'not_books'],
+ 'IDBDatabase.objectStoreNames should include a newly created ' +
+ 'store before the transaction is aborted');
+ assert_array_equals(
+ transaction.objectStoreNames, ['books', 'not_books'],
+ 'IDBTransaction.objectStoreNames should include a newly created ' +
+ 'store before the transaction is aborted');
+
+ index = store.index('not_by_author');
+ store.deleteIndex('not_by_author');
+ assert_throws(
+ 'InvalidStateError', () => index.get('query'),
+ 'IDBIndex.get should throw InvalidStateError, indicating that ' +
+ 'the index is marked for deletion, immediately after ' +
+ 'IDBObjectStore.deleteIndex() returns');
+ assert_array_equals(
+ store.indexNames, ['not_by_title'],
+ 'IDBObjectStore.indexNames should not include the deleted index ' +
+ 'immediately after IDBObjectStore.deleteIndex() returns');
+
+ transaction.abort();
+ assert_throws(
+ 'InvalidStateError', () => store.get('query'),
+ 'IDBObjectStore.get should throw InvalidStateError, indicating ' +
+ 'that the store is marked for deletion, immediately after ' +
+ 'IDBTransaction.abort() returns');
+ assert_throws(
+ 'InvalidStateError', () => index.get('query'),
+ 'IDBIndex.get should throw InvalidStateError, indicating that ' +
+ 'the index is still marked for deletion, immediately after ' +
+ 'IDBTransaction.abort() returns');
+ assert_array_equals(
+ transaction.objectStoreNames, ['books'],
+ 'IDBTransaction.objectStoreNames should stop including the newly ' +
+ 'created store immediately after IDBTransaction.abort() returns');
+ assert_array_equals(
+ database.objectStoreNames, ['books'],
+ 'IDBDatabase.objectStoreNames should stop including the newly ' +
+ 'created store immediately after IDBTransaction.abort() returns');
+ assert_array_equals(
+ store.indexNames, [],
+ 'IDBObjectStore.indexNames for the newly created store should be ' +
+ 'empty immediately after IDBTransaction.abort() returns');
+ })).then(() => {
+ assert_throws(
+ 'InvalidStateError', () => store.get('query'),
+ 'IDBObjectStore.get should throw InvalidStateError, indicating ' +
+ 'that the store is marked for deletion, after the transaction is ' +
+ 'aborted');
+ assert_throws(
+ 'InvalidStateError', () => index.get('query'),
+ 'IDBIndex.get should throw InvalidStateError, indicating that ' +
+ 'the index is still marked for deletion, after the transaction ' +
+ 'is aborted');
+ assert_array_equals(
+ migrationDatabase.objectStoreNames, ['books'],
+ 'IDBDatabase.objectStoreNames should stop including the newly ' +
+ 'created store after the transaction is aborted');
+ assert_array_equals(
+ migrationTransaction.objectStoreNames, ['books'],
+ 'IDBTransaction.objectStoreNames should stop including the newly ' +
+ 'created store after the transaction is aborted');
+ assert_array_equals(
+ store.indexNames, [],
+ 'IDBObjectStore.indexNames for the newly created store should be ' +
+ 'empty after the transaction is aborted');
+ });
+}, 'Deleted indexes in newly created stores are still marked as deleted ' +
+ 'after the transaction aborts');
+
+promise_test(testCase => {
+ let store = null, index = null;
+ let migrationTransaction = null, migrationDatabase = null;
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ createNotBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ migrationDatabase = database;
+ migrationTransaction = transaction;
+ store = transaction.objectStore('not_books');
+ index = store.index('not_by_author');
+ store.deleteIndex('not_by_author');
+ assert_throws(
+ 'InvalidStateError', () => index.get('query'),
+ 'IDBIndex.get should throw InvalidStateError, indicating that ' +
+ 'the index is marked for deletion, immediately after ' +
+ 'IDBObjectStore.deleteIndex() returns');
+ assert_array_equals(
+ store.indexNames, ['not_by_title'],
+ 'IDBObjectStore.indexNames should not include the deleted index ' +
+ 'immediately after IDBObjectStore.deleteIndex() returns');
+
+ database.deleteObjectStore('not_books');
+ assert_throws(
+ 'InvalidStateError', () => store.get('query'),
+ 'IDBObjectStore.get should throw InvalidStateError, indicating ' +
+ 'that the store is marked for deletion, immediately after ' +
+ 'IDBDatabase.deleteObjectStore() returns');
+ assert_throws(
+ 'InvalidStateError', () => index.get('query'),
+ 'IDBIndex.get should throw InvalidStateError, indicating that ' +
+ 'the index is still marked for deletion, immediately after ' +
+ 'IDBObjectStore.deleteIndex() returns');
+ assert_array_equals(
+ transaction.objectStoreNames, ['books'],
+ 'IDBTransaction.objectStoreNames should stop including the ' +
+ 'deleted store immediately after IDBDatabase.deleteObjectStore() ' +
+ 'returns');
+ assert_array_equals(
+ database.objectStoreNames, ['books'],
+ 'IDBDatabase.objectStoreNames should stop including the newly ' +
+ 'created store immediately after IDBDatabase.deleteObjectStore() ' +
+ 'returns');
+ assert_array_equals(
+ store.indexNames, [],
+ 'IDBObjectStore.indexNames for the deleted store should be empty ' +
+ 'immediately after IDBDatabase.deleteObjectStore() returns');
+
+ transaction.abort();
+ assert_throws(
+ 'TransactionInactiveError', () => store.get('query'),
+ 'IDBObjectStore.get should throw TransactionInactiveError, ' +
+ 'indicating that the store is no longer marked for deletion, ' +
+ 'immediately after IDBTransaction.abort() returns');
+ assert_throws(
+ 'TransactionInactiveError', () => index.get('query'),
+ 'IDBIndex.get should throw TransactionInactiveError, indicating ' +
+ 'that the index is no longer marked for deletion, immediately ' +
+ 'after IDBObjectStore.deleteIndex() returns');
+ assert_array_equals(
+ database.objectStoreNames, ['books', 'not_books'],
+ 'IDBDatabase.objectStoreNames should include the deleted store ' +
+ 'store immediately after IDBTransaction.abort() returns');
+ assert_array_equals(
+ transaction.objectStoreNames, ['books', 'not_books'],
+ 'IDBTransaction.objectStoreNames should include the deleted ' +
+ 'store immediately after IDBTransaction.abort() returns');
+ assert_array_equals(
+ store.indexNames, ['not_by_author', 'not_by_title'],
+ 'IDBObjectStore.indexNames for the deleted store should not be ' +
+ 'empty any more immediately after IDBTransaction.abort() returns');
+ })).then(() => {
+ assert_throws(
+ 'TransactionInactiveError', () => store.get('query'),
+ 'IDBObjectStore.get should throw TransactionInactiveError, ' +
+ 'indicating that the store is no longer marked for deletion, ' +
+ 'after the transaction is aborted');
+ assert_throws(
+ 'TransactionInactiveError', () => index.get('query'),
+ 'IDBIndex.get should throw TransactionInactiveError, indicating ' +
+ 'that the index is no longer marked for deletion, after the ' +
+ 'transaction is aborted');
+ assert_array_equals(
+ migrationDatabase.objectStoreNames, ['books', 'not_books'],
+ 'IDBDatabase.objectStoreNames should include the previously ' +
+ 'deleted store after the transaction is aborted');
+ assert_array_equals(
+ migrationTransaction.objectStoreNames, ['books', 'not_books'],
+ 'IDBTransaction.objectStoreNames should include the previously ' +
+ 'deleted store after the transaction is aborted');
+ assert_array_equals(
+ store.indexNames, ['not_by_author', 'not_by_title'],
+ 'IDBObjectStore.indexNames for the deleted store should not be ' +
+ 'empty after the transaction is aborted');
+ });
+}, 'Deleted indexes in deleted stores are still marked as not-deleted after ' +
+ 'the transaction aborts');
+
+promise_test(testCase => {
+ let store = null, index = null;
+ let migrationTransaction = null, migrationDatabase = null;
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ store = createNotBooksStore(testCase, database);
+ migrationDatabase = database;
+ migrationTransaction = transaction;
+ index = store.index('not_by_author');
+ store.deleteIndex('not_by_author');
+ assert_throws(
+ 'InvalidStateError', () => index.get('query'),
+ 'IDBIndex.get should throw InvalidStateError, indicating that ' +
+ 'the index is marked for deletion, immediately after ' +
+ 'IDBObjectStore.deleteIndex() returns');
+ assert_array_equals(
+ store.indexNames, ['not_by_title'],
+ 'IDBObjectStore.indexNames should not include the deleted index ' +
+ 'immediately after IDBObjectStore.deleteIndex() returns');
+
+ database.deleteObjectStore('not_books');
+ assert_throws(
+ 'InvalidStateError', () => store.get('query'),
+ 'IDBObjectStore.get should throw InvalidStateError, indicating ' +
+ 'that the store is marked for deletion, immediately after ' +
+ 'IDBDatabase.deleteObjectStore() returns');
+ assert_throws(
+ 'InvalidStateError', () => index.get('query'),
+ 'IDBIndex.get should throw InvalidStateError, indicating that ' +
+ 'the index is still marked for deletion, immediately after ' +
+ 'IDBDatabase.deleteObjectStore() returns');
+ assert_array_equals(
+ transaction.objectStoreNames, ['books'],
+ 'IDBTransaction.objectStoreNames should stop including the ' +
+ 'deleted store immediately after IDBDatabase.deleteObjectStore() ' +
+ 'returns');
+ assert_array_equals(
+ database.objectStoreNames, ['books'],
+ 'IDBDatabase.objectStoreNames should stop including the newly ' +
+ 'created store immediately after IDBDatabase.deleteObjectStore() ' +
+ 'returns');
+ assert_array_equals(
+ store.indexNames, [],
+ 'IDBObjectStore.indexNames should be empty immediately after ' +
+ 'IDBDatabase.deleteObjectStore() returns');
+
+ transaction.abort();
+ assert_throws(
+ 'InvalidStateError', () => store.get('query'),
+ 'IDBObjectStore.get should throw InvalidStateError, indicating ' +
+ 'that the store is still marked for deletion, immediately after ' +
+ 'IDBTransaction.abort() returns');
+ assert_throws(
+ 'InvalidStateError', () => index.get('query'),
+ 'IDBIndex.get should throw InvalidStateError, indicating that ' +
+ 'the index is still marked for deletion, immediately after ' +
+ 'IDBTransaction.abort() returns');
+ assert_array_equals(
+ transaction.objectStoreNames, ['books'],
+ 'IDBTransaction.objectStoreNames should not include the newly ' +
+ 'created store immediately after IDBTransaction.abort() returns');
+ assert_array_equals(
+ database.objectStoreNames, ['books'],
+ 'IDBDatabase.objectStoreNames should not include the newly ' +
+ 'created store immediately after IDBTransaction.abort() returns');
+ assert_array_equals(
+ store.indexNames, [],
+ 'IDBObjectStore.indexNames should be empty immediately after ' +
+ 'IDBTransaction.abort() returns');
+ })).then(() => {
+ assert_throws(
+ 'InvalidStateError', () => store.get('query'),
+ 'IDBObjectStore.get should throw InvalidStateError, indicating ' +
+ 'that the store is still marked for deletion, after the ' +
+ 'transaction is aborted');
+ assert_throws(
+ 'InvalidStateError', () => index.get('query'),
+ 'IDBIndex.get should throw InvalidStateError, indicating that ' +
+ 'the index is still marked for deletion, after the transaction ' +
+ 'is aborted');
+ assert_array_equals(
+ migrationDatabase.objectStoreNames, ['books'],
+ 'IDBDatabase.objectStoreNames should not include the newly ' +
+ 'created store after the transaction is aborted');
+ assert_array_equals(
+ migrationTransaction.objectStoreNames, ['books'],
+ 'IDBTransaction.objectStoreNames should not include the newly ' +
+ 'created store after the transaction is aborted');
+ assert_array_equals(
+ store.indexNames, [],
+ 'IDBObjectStore.indexNames should be empty after the transaction ' +
+ 'is aborted');
+ });
+}, 'Deleted indexes in created+deleted stores are still marked as deleted ' +
+ 'after their transaction aborts');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/IndexedDB/transaction-abort-object-store-metadata-revert.html b/tests/wpt/web-platform-tests/IndexedDB/transaction-abort-object-store-metadata-revert.html
new file mode 100644
index 00000000000..1a109d06928
--- /dev/null
+++ b/tests/wpt/web-platform-tests/IndexedDB/transaction-abort-object-store-metadata-revert.html
@@ -0,0 +1,233 @@
+<!DOCTYPE html>
+<title>IndexedDB: aborting transactions reverts object store metadata</title>
+<link rel="help" href="https://w3c.github.io/IndexedDB/#abort-transaction">
+<link rel="author" href="pwnall@chromium.org" title="Victor Costan">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support-promises.js"></script>
+<script>
+
+promise_test(testCase => {
+ let store = null, migrationTransaction = null, migrationDatabase = null;
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ store = createNotBooksStore(testCase, database);
+ migrationDatabase = database;
+ migrationTransaction = transaction;
+ assert_array_equals(
+ database.objectStoreNames, ['books', 'not_books'],
+ 'IDBDatabase.objectStoreNames should include a newly created ' +
+ 'store before the transaction is aborted');
+ assert_array_equals(
+ transaction.objectStoreNames, ['books', 'not_books'],
+ 'IDBTransaction.objectStoreNames should include a newly created ' +
+ 'store before the transaction is aborted');
+
+ transaction.abort();
+ assert_throws(
+ 'InvalidStateError', () => store.get('query'),
+ 'IDBObjectStore.get should throw InvalidStateError, indicating ' +
+ 'that the store is marked for deletion, immediately after ' +
+ 'IDBTransaction.abort() returns');
+ assert_array_equals(
+ transaction.objectStoreNames, ['books'],
+ 'IDBTransaction.objectStoreNames should stop including the newly ' +
+ 'created store immediately after IDBTransaction.abort() returns');
+ assert_array_equals(
+ database.objectStoreNames, ['books'],
+ 'IDBDatabase.objectStoreNames should stop including the newly ' +
+ 'created store immediately after IDBTransaction.abort() returns');
+ })).then(() => {
+ assert_throws(
+ 'InvalidStateError', () => store.get('query'),
+ 'IDBObjectStore.get should throw InvalidStateError, indicating ' +
+ 'that the store is marked for deletion, after the transaction is ' +
+ 'aborted');
+ assert_array_equals(
+ migrationDatabase.objectStoreNames, ['books'],
+ 'IDBDatabase.objectStoreNames should stop including the newly ' +
+ 'created store after the transaction is aborted');
+ assert_array_equals(
+ migrationTransaction.objectStoreNames, ['books'],
+ 'IDBTransaction.objectStoreNames should stop including the newly ' +
+ 'created store after the transaction is aborted');
+ });
+}, 'Created stores get marked as deleted after their transaction aborts');
+
+promise_test(testCase => {
+ let store = null, migrationTransaction = null, migrationDatabase = null;
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ createNotBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ migrationDatabase = database;
+ migrationTransaction = transaction;
+ store = transaction.objectStore('not_books');
+
+ database.deleteObjectStore('not_books');
+ assert_throws(
+ 'InvalidStateError', () => store.get('query'),
+ 'IDBObjectStore.get should throw InvalidStateError, indicating ' +
+ 'that the store is marked for deletion, immediately after ' +
+ 'IDBDatabase.deleteObjectStore() returns');
+ assert_array_equals(
+ transaction.objectStoreNames, ['books'],
+ 'IDBTransaction.objectStoreNames should stop including the ' +
+ 'deleted store immediately after IDBDatabase.deleteObjectStore() ' +
+ 'returns');
+ assert_array_equals(
+ database.objectStoreNames, ['books'],
+ 'IDBDatabase.objectStoreNames should stop including the newly ' +
+ 'created store immediately after IDBDatabase.deleteObjectStore() ' +
+ 'returns');
+
+ transaction.abort();
+ assert_throws(
+ 'TransactionInactiveError', () => store.get('query'),
+ 'IDBObjectStore.get should throw TransactionInactiveError, ' +
+ 'indicating that the store is no longer marked for deletion, ' +
+ 'immediately after IDBTransaction.abort() returns');
+ assert_array_equals(
+ database.objectStoreNames, ['books', 'not_books'],
+ 'IDBDatabase.objectStoreNames should include the deleted store ' +
+ 'store immediately after IDBTransaction.abort() returns');
+ assert_array_equals(
+ transaction.objectStoreNames, ['books', 'not_books'],
+ 'IDBTransaction.objectStoreNames should include the deleted ' +
+ 'store immediately after IDBTransaction.abort() returns');
+ })).then(() => {
+ assert_throws(
+ 'TransactionInactiveError', () => store.get('query'),
+ 'IDBObjectStore.get should throw TransactionInactiveError, ' +
+ 'indicating that the store is no longer marked for deletion, ' +
+ 'after the transaction is aborted');
+ assert_array_equals(
+ migrationDatabase.objectStoreNames, ['books', 'not_books'],
+ 'IDBDatabase.objectStoreNames should include the previously ' +
+ 'deleted store after the transaction is aborted');
+ assert_array_equals(
+ migrationTransaction.objectStoreNames, ['books', 'not_books'],
+ 'IDBTransaction.objectStoreNames should include the previously ' +
+ 'deleted store after the transaction is aborted');
+ });
+}, 'Deleted stores get marked as not-deleted after the transaction aborts');
+
+promise_test(testCase => {
+ let store = null, migrationTransaction = null, migrationDatabase = null;
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ store = createNotBooksStore(testCase, database);
+ migrationDatabase = database;
+ migrationTransaction = transaction;
+ assert_array_equals(
+ database.objectStoreNames, ['books', 'not_books'],
+ 'IDBDatabase.objectStoreNames should include a newly created ' +
+ 'store before the transaction is aborted');
+ assert_array_equals(
+ transaction.objectStoreNames, ['books', 'not_books'],
+ 'IDBTransaction.objectStoreNames should include a newly created ' +
+ 'store before the transaction is aborted');
+
+ database.deleteObjectStore('not_books');
+ assert_throws(
+ 'InvalidStateError', () => store.get('query'),
+ 'IDBObjectStore.get should throw InvalidStateError, indicating ' +
+ 'that the store is marked for deletion, immediately after ' +
+ 'IDBDatabase.deleteObjectStore() returns');
+ assert_array_equals(
+ transaction.objectStoreNames, ['books'],
+ 'IDBTransaction.objectStoreNames should stop including the ' +
+ 'deleted store immediately after IDBDatabase.deleteObjectStore() ' +
+ 'returns');
+ assert_array_equals(
+ database.objectStoreNames, ['books'],
+ 'IDBDatabase.objectStoreNames should stop including the newly ' +
+ 'created store immediately after IDBDatabase.deleteObjectStore() ' +
+ 'returns');
+
+ transaction.abort();
+ assert_throws(
+ 'InvalidStateError', () => store.get('query'),
+ 'IDBObjectStore.get should throw InvalidStateError, indicating ' +
+ 'that the store is still marked for deletion, immediately after ' +
+ 'IDBTransaction.abort() returns');
+ assert_array_equals(
+ transaction.objectStoreNames, ['books'],
+ 'IDBTransaction.objectStoreNames should not include the newly ' +
+ 'created store immediately after IDBTransaction.abort() returns');
+ assert_array_equals(
+ database.objectStoreNames, ['books'],
+ 'IDBDatabase.objectStoreNames should not include the newly ' +
+ 'created store immediately after IDBTransaction.abort() returns');
+ })).then(() => {
+ assert_throws(
+ 'InvalidStateError', () => store.get('query'),
+ 'IDBObjectStore.get should throw InvalidStateError, indicating ' +
+ 'that the store is still marked for deletion, after the ' +
+ 'transaction is aborted');
+ assert_array_equals(
+ migrationDatabase.objectStoreNames, ['books'],
+ 'IDBDatabase.objectStoreNames should not include the newly ' +
+ 'created store after the transaction is aborted');
+ assert_array_equals(
+ migrationTransaction.objectStoreNames, ['books'],
+ 'IDBTransaction.objectStoreNames should not include the newly ' +
+ 'created store after the transaction is aborted');
+ });
+}, 'Created+deleted stores are still marked as deleted after their ' +
+ 'transaction aborts');
+
+promise_test(testCase => {
+ let migrationTransaction = null, migrationDatabase = null;
+ return createDatabase(testCase, (database, transaction) => {
+ createBooksStore(testCase, database);
+ createNotBooksStore(testCase, database);
+ }).then(database => {
+ database.close();
+ }).then(() => migrateDatabase(testCase, 2, (database, transaction) => {
+ migrationDatabase = database;
+ migrationTransaction = transaction;
+
+ database.deleteObjectStore('not_books');
+ assert_array_equals(
+ transaction.objectStoreNames, ['books'],
+ 'IDBTransaction.objectStoreNames should stop including the ' +
+ 'deleted store immediately after IDBDatabase.deleteObjectStore() ' +
+ 'returns');
+ assert_array_equals(
+ database.objectStoreNames, ['books'],
+ 'IDBDatabase.objectStoreNames should stop including the newly ' +
+ 'created store immediately after IDBDatabase.deleteObjectStore() ' +
+ 'returns');
+
+ transaction.abort();
+ assert_array_equals(
+ database.objectStoreNames, ['books', 'not_books'],
+ 'IDBDatabase.objectStoreNames should include the deleted store ' +
+ 'store immediately after IDBTransaction.abort() returns');
+ assert_array_equals(
+ transaction.objectStoreNames, ['books', 'not_books'],
+ 'IDBTransaction.objectStoreNames should include the deleted ' +
+ 'store immediately after IDBTransaction.abort() returns');
+ })).then(() => {
+ assert_array_equals(
+ migrationDatabase.objectStoreNames, ['books', 'not_books'],
+ 'IDBDatabase.objectStoreNames should include the previously ' +
+ 'deleted store after the transaction is aborted');
+ assert_array_equals(
+ migrationTransaction.objectStoreNames, ['books', 'not_books'],
+ 'IDBTransaction.objectStoreNames should include the previously ' +
+ 'deleted store after the transaction is aborted');
+ });
+}, 'Un-instantiated deleted stores get marked as not-deleted after the ' +
+ 'transaction aborts');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker.js b/tests/wpt/web-platform-tests/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker.js
index 7a36f366660..5d1c5486f3d 100644
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker.js
+++ b/tests/wpt/web-platform-tests/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.worker.js
@@ -1,3 +1,4 @@
+// <meta> timeout=long
importScripts("/resources/testharness.js");
importScripts("wrapKey_unwrapKey.js");
diff --git a/tests/wpt/web-platform-tests/WebIDL/current-realm.html b/tests/wpt/web-platform-tests/WebIDL/current-realm.html
new file mode 100644
index 00000000000..fd24709b3be
--- /dev/null
+++ b/tests/wpt/web-platform-tests/WebIDL/current-realm.html
@@ -0,0 +1,145 @@
+<!-- This tests the agreed upon outcome for https://www.w3.org/Bugs/Public/show_bug.cgi?id=24652
+ that has not been reflected in the IDL standard yet due to lack of editing resources.
+
+ TODO: https://github.com/w3c/webcrypto/issues/85 -->
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Current Realm</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<iframe srcdoc="<body test>"></iframe>
+<script>
+ setup({explicit_done:true})
+
+ function isObjectFromGlobal(object, global) {
+ return object instanceof global.Object;
+ }
+ function assert_global(obj) {
+ assert_false(isObjectFromGlobal(obj, self), obj + " should not be from top-level Realm")
+ assert_true(isObjectFromGlobal(obj, self[0]), obj + " should be from <iframe> Realm")
+ }
+
+ onload = function() {
+ [["querySelectorAll", "test"],
+ ["createElement", "x"],
+ ["createElementNS", null, "x"],
+ ["createDocumentFragment"],
+ ["createTextNode", "test"],
+ ["createComment", "test"],
+ ["createProcessingInstruction", "x", "x"],
+ ["createAttribute", "x"],
+ ["createAttributeNS", "x", "x"],
+ ["createEvent", "Event"],
+ ["createRange"],
+ ["createNodeIterator", document.head],
+ ["createTreeWalker", document.head]].forEach(function(val) {
+ test(function() {
+ var obj = self[0].document[val[0]](val[1], val[2])
+ assert_global(obj)
+
+ obj = Document.prototype[val[0]].call(self[0].document, val[1], val[2])
+ assert_global(obj)
+ }, val[0])
+ })
+
+ // Note: these are not [NewObject] and can be cached. But across globals?
+ ;[["getElementsByTagName", "x"],
+ ["getElementsByTagNameNS", null, "x"],
+ ["getElementsByClassName", "x"]].forEach(function(val) {
+ test(function() {
+ var obj = self[0].document[val[0]](val[1], val[2])
+ assert_global(obj)
+
+ var obj2 = Document.prototype[val[0]].call(self[0].document, val[1], val[2])
+ assert_global(obj)
+
+ assert_equals(obj, obj2) // XXX this might be controversial
+ }, val[0])
+ })
+
+ ;[["createDocumentType", "x", "", ""],
+ ["createDocument", null, "", null],
+ ["createHTMLDocument", "x"]].forEach(function(val) {
+ test(function() {
+ var obj = self[0].document.implementation[val[0]](val[1], val[2], val[3])
+ assert_global(obj)
+
+ obj = DOMImplementation.prototype[val[0]].call(self[0].document.implementation, val[1], val[2], val[3])
+ assert_global(obj)
+ }, val[0])
+ })
+
+ ;[["item", 0],
+ ["getNamedItem", "test"],
+ ["getNamedItemNS", null, "test"]].forEach(function(val) {
+ test(function() {
+ var obj = self[0].document.body.attributes[val[0]](val[1], val[2])
+ assert_global(obj)
+
+ var obj2 = NamedNodeMap.prototype[val[0]].call(self[0].document.body.attributes, val[1], val[2])
+ assert_global(obj)
+
+ assert_equals(obj, obj2)
+ }, "NamedNodeMap " + val[0])
+ })
+
+ test(function() {
+ var c = self[0].document.createTextNode(""),
+ obj = c.splitText(0)
+ assert_global(obj)
+
+ obj = Text.prototype.splitText.call(c, "")
+ assert_global(obj)
+ }, "splitText")
+
+ ;["extractContents",
+ "cloneContents",
+ "cloneRange"].forEach(function(val) {
+ test(function() {
+ var c = self[0].document.createRange(),
+ obj = c[val]()
+ assert_global(obj)
+
+ obj = Range.prototype[val].call(c)
+ assert_global(obj)
+ }, val)
+ })
+
+ ;["2d", "webgl"].forEach(function(val) {
+ test(function() {
+ var c = self[0].document.createElement("canvas"),
+ obj = c.getContext(val)
+ assert_global(obj)
+
+ obj = HTMLCanvasElement.prototype.getContext.call(c, val)
+ assert_global(obj)
+ }, "getContext " + val)
+ })
+
+ ;[["createImageData", 5, 5],
+ ["getImageData", 5, 5, 5, 5]].forEach(function(val) {
+ test(function() {
+ var c = self[0].document.createElement("canvas").getContext("2d"),
+ obj = c[val[0]](val[1], val[2], val[3], val[4]);
+ assert_global(obj)
+ assert_global(obj.data)
+
+ obj = CanvasRenderingContext2D.prototype[val[0]].call(c, val[1], val[2], val[3], val[4]);
+ assert_global(obj)
+ assert_global(obj.data)
+ }, val[0])
+ })
+
+ test(function() {
+ var c = new self[0].FontFace("test", "about:blank"),
+ obj = c.load()
+ assert_global(obj)
+
+ obj = FontFace.prototype.load.call(c)
+ assert_global(obj)
+ }, "FontFace's load()")
+
+ done()
+ }
+</script>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/abort-after-send.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/abort-after-send.htm
index c4885c9911b..523a0d616b6 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/abort-after-send.htm
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/abort-after-send.htm
@@ -4,6 +4,7 @@
<title>XMLHttpRequest: abort() after send()</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+ <script src="resources/xmlhttprequest-event-order.js"></script>
<link rel="help" href="https://xhr.spec.whatwg.org/#the-abort()-method" data-tested-assertations="following-sibling::ol/li[1] following-sibling::ol/li[3] following-sibling::ol/li[4] following-sibling::ol/li[4]/ol/li[1] following-sibling::ol/li[4]/ol/li[3] following-sibling::ol/li[4]/ol/li[4] following-sibling::ol/li[4]/ol/li[5] following-sibling::ol/li[4]/ol/li[6] following-sibling::ol/li[5]" />
<link rel="help" href="https://xhr.spec.whatwg.org/#the-responsetext-attribute" data-tested-assertations="following::ol/li[3]" />
<link rel="help" href="https://xhr.spec.whatwg.org/#the-responsexml-attribute" data-tested-assertations="following::ol/li[3]" />
@@ -19,36 +20,26 @@
var test = async_test()
test.step(function() {
var client = new XMLHttpRequest(),
- control_flag = false,
- result = [],
- expected = [1, 4, 'progress', 'abort', 'loadend'] // open() -> 1, abort() -> 4
- client.onreadystatechange = function() {
- test.step(function() {
- result.push(client.readyState)
- if(client.readyState == 4) {
- control_flag = true
- assert_equals(client.responseXML, null)
- assert_equals(client.responseText, "")
- assert_equals(client.status, 0)
- assert_equals(client.statusText, "")
- assert_equals(client.getAllResponseHeaders(), "")
- assert_equals(client.getResponseHeader('Content-Type'), null)
- }
- })
- }
+ control_flag = false;
+ prepare_xhr_for_event_order_test(client);
+ client.addEventListener("readystatechange", test.step_func(function() {
+ if(client.readyState == 4) {
+ control_flag = true
+ assert_equals(client.responseXML, null)
+ assert_equals(client.responseText, "")
+ assert_equals(client.status, 0)
+ assert_equals(client.statusText, "")
+ assert_equals(client.getAllResponseHeaders(), "")
+ assert_equals(client.getResponseHeader('Content-Type'), null)
+ }
+ }))
client.open("GET", "resources/well-formed.xml", true)
client.send(null)
- client.addEventListener('progress', logEvt)
- client.addEventListener('abort', logEvt)
- client.addEventListener('loadend', logEvt)
client.abort()
assert_true(control_flag)
assert_equals(client.readyState, 0)
- assert_array_equals(result, expected)
+ assert_xhr_event_order_matches([1, "loadstart(0,0,false)", 4, "abort(0,0,false)", "loadend(0,0,false)"])
test.done()
- function logEvt (e) {
- result.push(e.type)
- }
})
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/abort-during-open.js b/tests/wpt/web-platform-tests/XMLHttpRequest/abort-during-open.js
index 4ddb84fe8b7..381a0bff81e 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/abort-during-open.js
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/abort-during-open.js
@@ -7,8 +7,8 @@ test.step(function() {
assert_unreached()
})
}
+ assert_equals(client.readyState, 1, "before abort()")
client.abort()
- assert_equals(client.readyState, 0)
- assert_throws("InvalidStateError", function() { client.send("test") }, "calling send() after abort()")
+ assert_equals(client.readyState, 1, "after abort()")
})
test.done()
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/abort-during-upload.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/abort-during-upload.htm
index 766dcc4693d..9fbc8b9bbb4 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/abort-during-upload.htm
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/abort-during-upload.htm
@@ -18,7 +18,7 @@
client.open("POST", "resources/delay.py?ms=1000")
client.addEventListener("loadend", function(e) {
test.step(function() {
- assert_xhr_event_order_matches([1, "loadstart(0,0,false)", "upload.loadstart(0,9999,true)", 4, "upload.progress(0,0,false)", "upload.abort(0,0,false)", "upload.loadend(0,0,false)", "progress(0,0,false)", "abort(0,0,false)", "loadend(0,0,false)"]);
+ assert_xhr_event_order_matches([1, "loadstart(0,0,false)", "upload.loadstart(0,9999,true)", 4, "upload.abort(0,0,false)", "upload.loadend(0,0,false)", "abort(0,0,false)", "loadend(0,0,false)"]);
test.done()
})
});
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/abort-event-abort.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/abort-event-abort.htm
index 2382241cad3..eb2b2b743e6 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/abort-event-abort.htm
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/abort-event-abort.htm
@@ -4,7 +4,7 @@
<link rel="help" href="https://xhr.spec.whatwg.org/#the-abort()-method" data-tested-assertations="following-sibling::ol/li[4]/ol/li[5]" />
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
- <title>XMLHttpRequest: The abort() method: do not fire abort event in OPENED state when send() flag is unset. send() throws after abort().</title>
+ <title>XMLHttpRequest: The abort() method: do not fire abort event in OPENED state when send() flag is unset.</title>
</head>
<body>
@@ -24,6 +24,7 @@
if (xhr.readyState == 1)
{
xhr.abort();
+ assert_equals(xhr.readyState, 1, "abort() cannot change readyState when readyState is 1 and send() flag is unset")
}
});
};
@@ -37,7 +38,7 @@
};
xhr.open("GET", "./resources/content.py", true); // This should cause a readystatechange event that calls abort()
- assert_throws("InvalidStateError", function(){ xhr.send() })
+ xhr.send() // should not throw since abort() was a no-op
test.done()
});
</script>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/abort-event-order.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/abort-event-order.htm
index cb405a71acc..f05c20628c4 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/abort-event-order.htm
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/abort-event-order.htm
@@ -37,7 +37,7 @@
{
test.step(function()
{
- assert_xhr_event_order_matches([1, "loadstart(0,0,false)", 4, "upload.progress(0,0,false)", "upload.abort(0,0,false)", "upload.loadend(0,0,false)", "progress(0,0,false)", "abort(0,0,false)", "loadend(0,0,false)"]);
+ assert_xhr_event_order_matches([1, "loadstart(0,0,false)", 4, "upload.abort(0,0,false)", "upload.loadend(0,0,false)", "abort(0,0,false)", "loadend(0,0,false)"]);
assert_equals(xhr.readyState, 0, 'state should be UNSENT');
test.done();
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/event-timeout-order.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/event-timeout-order.htm
index 1d9ba31d6e0..7376ca2f8b1 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/event-timeout-order.htm
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/event-timeout-order.htm
@@ -20,7 +20,7 @@
prepare_xhr_for_event_order_test(xhr);
xhr.addEventListener("loadend", function() {
test.step(function() {
- assert_xhr_event_order_matches([1, "loadstart(0,0,false)", "upload.loadstart(0,12,true)", 4, "upload.progress(0,0,false)", "upload.timeout(0,0,false)", "upload.loadend(0,0,false)", "progress(0,0,false)", "timeout(0,0,false)", "loadend(0,0,false)"]);
+ assert_xhr_event_order_matches([1, "loadstart(0,0,false)", "upload.loadstart(0,12,true)", 4, "upload.timeout(0,0,false)", "upload.loadend(0,0,false)", "timeout(0,0,false)", "loadend(0,0,false)"]);
test.done();
});
});
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/event-upload-progress-crossorigin.sub.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/event-upload-progress-crossorigin.htm
index 66461689c52..66461689c52 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/event-upload-progress-crossorigin.sub.htm
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/event-upload-progress-crossorigin.htm
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/open-during-abort.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/open-during-abort.htm
index 1d01415d55b..d03ca7afa63 100755
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/open-during-abort.htm
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/open-during-abort.htm
@@ -26,6 +26,7 @@
abort_flag = true
client.abort()
assert_array_equals(result, expected)
+ assert_equals(client.readyState, 1) // abort() should only set state to UNSENT when DONE
})
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/progress-events-response-data-gzip.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/progress-events-response-data-gzip.htm
index dc166a2396a..058064636d4 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/progress-events-response-data-gzip.htm
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/progress-events-response-data-gzip.htm
@@ -36,17 +36,20 @@
* If lengthComputable is true:
* Event.total must match Content-length header
- * event.loaded should be a smaller number while resource is loading
- and match Content-length when loading is finished
- * Setting event.loaded to equal event.total for each progress event if the
- resource is not fully downloaded would be cheating
+ * event.loaded must only ever increase in progress events
+ (and may never repeat its value).
+ * event.loaded must never exceed the Content-length.
* If lengthComputable is false:
* event.total should be 0
+ * event.loaded must only ever increase in progress events
+ (and may never repeat its value).
* event.loaded should be the length of the decompressed content, i.e.
bigger than Content-length header value when finished loading
*/
+ var lastTotal;
+ var lastLoaded = -1;
client.addEventListener('loadend', test.step_func(function(e){
var len = parseInt(client.getResponseHeader('content-length'), 10)
if(e.lengthComputable){
@@ -59,14 +62,17 @@
test.done();
}), false)
client.addEventListener('progress', test.step_func(function(e){
- if(e.lengthComputable && e.total && e.loaded && e.target.readyState < 4){
- assert_not_equals(e.total, e.loaded, 'total should not equal loaded while download/decode is incomplete')
- // We should only do this assertation once
- // it's theoretically possible that all the data would get in
- // and a progress event fire before the readyState switches from 3 to 4 -
- // in this case we might report bogus and random failures. Better to remove the event listener again..
- client.removeEventListener('progress', arguments.callee, false);
+ if(lastTotal === undefined){
+ lastTotal = e.total;
}
+ if(e.lengthComputable && e.total && e.loaded){
+ assert_equals(e.total, lastTotal, 'event.total should remain invariant')
+ assert_less_than_equal(e.loaded, lastTotal, 'event.loaded should not exceed content-length')
+ }else{
+ assert_equals(e.total, 0, 'event.total should be 0')
+ }
+ assert_greater_than(e.loaded, lastLoaded, 'event.loaded should only ever increase')
+ lastLoaded = e.loaded;
}), false)
// image.gif is 165375 bytes compressed. Sending 45000 bytes at a time with 1 second delay will load it in 4 seconds
client.open("GET", "resources/image.gif?pipe=gzip|trickle(45000:d1:r2)", true)
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/send-after-setting-document-domain-window-1.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/send-after-setting-document-domain-window-1.htm
new file mode 100644
index 00000000000..4e4c3faff90
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/send-after-setting-document-domain-window-1.htm
@@ -0,0 +1,23 @@
+<!doctype html>
+<html>
+ <head>
+ <title>XMLHttpRequest: send() with document.domain set: loading documents from original origin after setting document.domain</title>
+ <script src="send-after-setting-document-domain-window-helper.js"></script>
+ <link rel="help" href="https://xhr.spec.whatwg.org/#the-open()-method" data-tested-assertations="following::ol[1]/li[2]/ol[1]/li[3]" />
+ </head>
+ <body>
+ <script>
+ run_test(function() {
+ document.domain = document.domain; // this is not a noop, it does actually change the security context
+ var client = new XMLHttpRequest();
+ client.open("GET", "status.py?content=hello", false);
+ client.send(null);
+ assert_equals(client.responseText, "hello");
+ document.domain = document.domain.replace(/^\w+\./, "");
+ client.open("GET", "status.py?content=hello2", false);
+ client.send(null);
+ assert_equals(client.responseText, "hello2");
+ }, "loading documents from original origin after setting document.domain");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/send-after-setting-document-domain-window-2.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/send-after-setting-document-domain-window-2.htm
new file mode 100644
index 00000000000..073268c21c7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/send-after-setting-document-domain-window-2.htm
@@ -0,0 +1,20 @@
+<!doctype html>
+<html>
+ <head>
+ <title>XMLHttpRequest: send() with document.domain set: loading documents from the origin document.domain was set to should throw</title>
+ <script src="send-after-setting-document-domain-window-helper.js"></script>
+ <link rel="help" href="https://xhr.spec.whatwg.org/#the-open()-method" data-tested-assertations="following::ol[1]/li[2]/ol[1]/li[3]" />
+ </head>
+ <body>
+ <script>
+ run_test(function() {
+ document.domain = document.domain.replace(/^\w+\./, "");
+ var client = new XMLHttpRequest();
+ client.open("GET", location.protocol + "//" + document.domain + location.pathname.replace(/[^\/]*$/, "") + "status.py?content=hello3", false);
+ assert_throws("NetworkError", function() {
+ client.send(null);
+ });
+ }, "loading documents from the origin document.domain was set to should throw");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/send-after-setting-document-domain-window-helper.js b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/send-after-setting-document-domain-window-helper.js
new file mode 100644
index 00000000000..f5c762b042b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/send-after-setting-document-domain-window-helper.js
@@ -0,0 +1,29 @@
+function assert_equals(value, expected) {
+ if (value != expected) {
+ throw "Got wrong value.\nExpected '" + expected + "',\ngot '" + value + "'";
+ }
+}
+
+function assert_throws(expected_exc, func) {
+ try {
+ func.call(this);
+ } catch(e) {
+ var actual = e.name || e.type;
+ if (actual != expected_exc) {
+ throw "Got wrong exception.\nExpected '" + expected_exc + "',\ngot '" + actual + "'.";
+ }
+ return;
+ }
+ throw "Expected exception, but none was thrown";
+}
+
+function run_test(test, name) {
+ var result = {passed: true, message: null, name: name};
+ try {
+ test();
+ } catch(e) {
+ result.passed = false;
+ result.message = e + "";
+ }
+ opener.postMessage(result, "*");
+}
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-event-order.js b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-event-order.js
index 820f9ee2214..77fc0e784ef 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-event-order.js
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/xmlhttprequest-event-order.js
@@ -21,13 +21,60 @@
}
}
+ function getNextEvent(arr) {
+ var eventStr = arr.shift();
+
+ // we can only handle strings, numbers (readystates) and undefined
+ if (eventStr === undefined) {
+ return event;
+ }
+ if (typeof eventStr !== "string") {
+ if (Number.isInteger(eventStr)) {
+ eventStr = "readystatechange(" + eventStr + ")";
+ } else {
+ throw "Test error: unexpected event type " + eventStr;
+ }
+ }
+
+ // parse out the general type, loaded and total values
+ var type = eventStr.type = eventStr.split("(")[0].split(".").pop();
+ eventStr.mayFollowOptionalProgressEvents = type == "progress" ||
+ type == "load" || type == "abort" || type == "error";
+ var loadedAndTotal = eventStr.match(/\((\d)+,(\d)+/);
+ if (loadedAndTotal) {
+ eventStr.loaded = parseInt(loadedAndTotal[0]);
+ eventStr.total = parseInt(loadedAndTotal[1]);
+ }
+
+ return eventStr;
+ }
+
global.assert_xhr_event_order_matches = function(expected) {
- try {
- assert_array_equals(recorded_xhr_events, expected);
- } catch(e) {
- e.message += "\nRecorded events were:" + recorded_xhr_events.join(", ");
- e.message += "\nExpected events were:" + expected.join(", ");
- throw e;
+ var recorded = recorded_xhr_events;
+ var lastRecordedLoaded = -1;
+
+ while(expected.length && recorded.length) {
+ var currentExpected = getNextEvent(expected),
+ currentRecorded = getNextEvent(recorded);
+
+ // skip to the last progress event if we've hit one
+ while (recorded.length && currentRecorded.type == "progress") {
+ assert_greater(currentRecorded.loaded, lastRecordedLoaded,
+ "progress event 'loaded' values must only increase");
+ lastRecordedLoaded = currentRecorded.loaded;
+ currentRecorded = getNextEvent(recorded);
+ }
+ if (currentRecorded.type == "loadstart") {
+ lastRecordedLoaded = -1;
+ }
+
+ assert_equals(currentRecorded, currentExpected);
+ }
+ if (recorded.length) {
+ throw "\nUnexpected extra events: " + recorded.join(", ");
+ }
+ if (expected.length) {
+ throw "\nExpected more events: " + expected.join(", ");
}
}
}(this));
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/responsexml-basic.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/responsexml-basic.htm
index cc4b8dc4838..a3ce7b5b544 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/responsexml-basic.htm
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/responsexml-basic.htm
@@ -19,7 +19,7 @@
assert_equals(client.responseXML.documentElement.localName, "html", 'localName is html')
assert_equals(client.responseXML.documentElement.childNodes.length, 5, 'childNodes is 5')
assert_equals(client.responseXML.getElementById("n1").localName, client.responseXML.documentElement.childNodes[1].localName)
- assert_equals(client.responseXML.getElementById("n2"), client.responseXML.documentElement.childrenNodes[3], 'getElementById("n2")')
+ assert_equals(client.responseXML.getElementById("n2"), client.responseXML.documentElement.childNodes[3], 'getElementById("n2")')
assert_equals(client.responseXML.getElementsByTagName("p")[1].namespaceURI, "namespacesarejuststrings", 'namespaceURI')
})
test(function() {
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/responsexml-document-properties.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/responsexml-document-properties.htm
index c12f21b260b..18e3fb2f2b7 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/responsexml-document-properties.htm
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/responsexml-document-properties.htm
@@ -10,7 +10,7 @@
<body>
<div id="log"></div>
<script>
- var timePreXHR = Math.floor(new Date().getTime() / 1000);
+ var timePreXHR = Math.floor(new Date().getTime(new Date().getTime() - 3000) / 1000); // three seconds ago, in case there's clock drift
var client = new XMLHttpRequest()
client.open("GET", "resources/well-formed.xml", false)
client.send(null)
@@ -45,7 +45,7 @@
test(function() {
var lastModified = Math.floor(new Date(client.responseXML.lastModified).getTime() / 1000);
- var now = Math.floor(new Date().getTime(new Date().getTime() + 2000) / 1000); // two seconds from now, in case there's clock drift
+ var now = Math.floor(new Date().getTime(new Date().getTime() + 3000) / 1000); // three seconds from now, in case there's clock drift
assert_greater_than_equal(lastModified, timePreXHR);
assert_less_than_equal(lastModified, now);
}, 'lastModified set to time of response if no HTTP header provided')
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/send-after-setting-document-domain.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/send-after-setting-document-domain.htm
index 943fb9495ee..30b6c713cc4 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/send-after-setting-document-domain.htm
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/send-after-setting-document-domain.htm
@@ -4,35 +4,36 @@
<title>XMLHttpRequest: send() with document.domain set</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
- <!-- The spec doesn't seem to explicitly cover this case (as of June 2013) -->
<link rel="help" href="https://xhr.spec.whatwg.org/#the-open()-method" data-tested-assertations="following::ol[1]/li[2]/ol[1]/li[3]" />
</head>
<body>
<div id="log"></div>
<script>
- // first make sure we actually run off a domain with at least three parts, in order to be able to shorten it..
- if (location.hostname.split(/\./).length < 3) {
- location.href = location.protocol+'//www2.'+location.host+location.pathname
- }
+ var test_base_url = location.protocol+'//www2.'+location.host+"/XMLHttpRequest/resources/",
+ test_windows = [
+ window.open(test_base_url + "send-after-setting-document-domain-window-1.htm"),
+ window.open(test_base_url + "send-after-setting-document-domain-window-2.htm"),
+ ],
+ num_tests_left = test_windows.length;
- test(function() {
- document.domain = document.domain // this is not a noop, it does actually change the security context
- var client = new XMLHttpRequest()
- client.open("GET", "resources/status.py?content=hello", false)
- client.send(null)
- assert_equals(client.responseText, "hello")
- document.domain = document.domain.replace(/^\w+\./, '')
- client.open("GET", "resources/status.py?content=hello2", false)
- client.send(null)
- assert_equals(client.responseText, "hello2")
- }, "loading documents from original origin after setting document.domain")
- // try to load a document from the origin document.domain was set to
- test(function () {
- var client = new XMLHttpRequest()
- client.open("GET", location.protocol + '//' + document.domain + location.pathname.replace(/[^\/]*$/, '') + "resources/status.py?content=hello3", false)
- // AFAIK this should throw
- assert_throws('NetworkError', function(){client.send(null)})
- }, "loading documents from the origin document.domain was set to should throw")
+ async_test(function(wrapper_test) {
+ window.addEventListener("message", function(evt) {
+ // run a shadow test that just forwards the results
+ async_test(function(test) {
+ assert_true(evt.data.passed, evt.data.message);
+ test.done();
+ }, evt.data.name);
+
+ // after last result comes in, close all test
+ // windows and complete the wrapper test.
+ if (--num_tests_left == 0) {
+ for (var i=0; i<test_windows.length; ++i) {
+ test_windows[i].close();
+ }
+ wrapper_test.done();
+ }
+ }, false);
+ }, "All tests ran");
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/send-blob-with-no-mime-type.html b/tests/wpt/web-platform-tests/XMLHttpRequest/send-blob-with-no-mime-type.html
index 98fef659238..e7ab989fdc6 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/send-blob-with-no-mime-type.html
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/send-blob-with-no-mime-type.html
@@ -20,17 +20,19 @@
["invalid mime type", new Blob(["data"], {type: "Invalid \r\n mime \r\n type"})]
];
- blobTests.forEach(function(item){
+ function doSyncTest(testItem, method) {
test(function() {
var xhr = new XMLHttpRequest();
- xhr.open("POST", "./resources/content.py", false);
- xhr.send(item[1]);
+ xhr.open(method, "./resources/content.py", false);
+ xhr.send(testItem[1]);
assert_equals(xhr.getResponseHeader("X-Request-Content-Length"), "4");
assert_equals(xhr.getResponseHeader("X-Request-Content-Type"), "NO");
- }, "Synchronous blob loading with " + item[0]);
+ }, "Synchronous blob loading with " + testItem[0] + " [" + method + "]");
+ }
- var atest = async_test("Asynchronous blob loading with " + item[0]);
+ function doAsyncTest(testItem, method) {
+ var atest = async_test("Asynchronous blob loading with " + testItem[0] + " [" + method + "]");
atest.step(function() {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
@@ -42,9 +44,17 @@
atest.done();
}
}
- xhr.open("POST", "./resources/content.py", true);
- xhr.send(item[1]);
+ xhr.open(method, "./resources/content.py", true);
+ xhr.send(testItem[1]);
});
+ }
+
+ blobTests.forEach(function(item){
+ doSyncTest(item, "POST");
+ doAsyncTest(item, "POST");
+
+ doSyncTest(item, "PUT");
+ doAsyncTest(item, "PUT");
});
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/send-data-unexpected-tostring.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/send-data-unexpected-tostring.htm
index 357a9cff9d9..b8a3b4ae690 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/send-data-unexpected-tostring.htm
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/send-data-unexpected-tostring.htm
@@ -17,9 +17,8 @@
client.abort();
}}
client.open('POST', 'resources/content.py')
- assert_throws("InvalidStateError", function(){
- client.send(objAbortsOnStringification)
- })
+ client.send(objAbortsOnStringification)
+ assert_equals(client.readyState, 1)
test1.done()
});
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/send-non-same-origin.sub.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/send-non-same-origin.htm
index 91c3845617f..91c3845617f 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/send-non-same-origin.sub.htm
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/send-non-same-origin.htm
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/send-response-event-order.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/send-response-event-order.htm
index 64dfaa670f8..041cb23c6ea 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/send-response-event-order.htm
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/send-response-event-order.htm
@@ -12,6 +12,7 @@
<link rel="help" href="https://xhr.spec.whatwg.org/#switch-done" data-tested-assertations="following::ol[1]/li[3] following::ol[1]/li[4] following::ol[1]/li[5] following::ol[1]/li[6] following::ol[1]/li[7]" />
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+ <script src="resources/xmlhttprequest-event-order.js"></script>
<title>XMLHttpRequest: The send() method: event order when synchronous flag is unset</title>
</head>
@@ -24,38 +25,12 @@
test.step(function()
{
var xhr = new XMLHttpRequest();
- var expect = ["loadstart", "upload.loadstart", "upload.progress", "upload.load", "upload.loadend", "progress", 4, "load", "loadend"];
- var actual = [];
+ prepare_xhr_for_event_order_test(xhr);
- xhr.onreadystatechange = function()
- {
- test.step(function()
- {
- if (xhr.readyState == 4)
- {
- actual.push(xhr.readyState);
- }
- });
- };
-
- xhr.onloadstart = function(e){ actual.push(e.type); };
- xhr.onload = function(e){ actual.push(e.type); };
- xhr.onloadend = function(e){ actual.push(e.type); VerifyResult()};
- xhr.onprogress = function(e){ actual.push(e.type);};
-
- xhr.upload.onloadstart = function(e){ actual.push("upload." + e.type); };
- xhr.upload.onload = function(e){ actual.push("upload." + e.type); };
- xhr.upload.onloadend = function(e){ actual.push("upload." + e.type);};
- xhr.upload.onprogress = function(e){ actual.push("upload." + e.type);};
-
- function VerifyResult()
- {
- test.step(function()
- {
- assert_array_equals(actual, expect);
- test.done();
- });
- };
+ xhr.addEventListener("loadend", test.step_func(function() {
+ assert_xhr_event_order_matches([1, "loadstart(0,0,false)", "upload.loadstart(0,12,true)", "upload.progress(12,12,true)", "upload.load(12,12,true)", "upload.loadend(12,12,true)", 2, 3, "progress(12,12,true)", 4, "load(12,12,true)", "loadend(12,12,true)"]);
+ test.done();
+ }));
xhr.open("POST", "./resources/content.py", true);
xhr.send("Test Message");
diff --git a/tests/wpt/web-platform-tests/annotation-model/CONTRIBUTING.md b/tests/wpt/web-platform-tests/annotation-model/CONTRIBUTING.md
index b71eaa5a9d9..f591d2a9702 100644
--- a/tests/wpt/web-platform-tests/annotation-model/CONTRIBUTING.md
+++ b/tests/wpt/web-platform-tests/annotation-model/CONTRIBUTING.md
@@ -53,6 +53,7 @@ Context](JSONtest-v1.jsonld). That context defines the following terms:
|description | string | A long self-describing paragraph that explains the purpose of the test and the expected input
|ref | URI | An optional reference to the portion of the specification to which the test relates
|testType | `automated`, `manual`, `ref` | The type of test - this informs [WPT](https://github.com/w3c/web-platform-tests) how the test should be controlled and presented
+|skipFailures | list of strings | An optional list of assertionType values that, if present, should have their test skipped if the result would be "unexpected". Defaults to the empty list.
|assertions | list of URI, List @@@ATRISK@@@, or AssertionObject | The ordered collection of tests the input should be run against. See [JSON Schema Usage](#jsonSchema) for the structure of the objects. URI is relative to the top level folder of the test collection if it has a slash; relative to the current directory if it does not. @@@@ATRISK@@@@ Lists can be nested to define groups of sub-tests. Assertions / groups can be conditionally skipped. See [Assertion Lists](#assertionLists) for more details.
|content | URI or object | An object containing content to be checked against the referenced assertions, or a URI from which to retrieve that content
@@ -71,9 +72,10 @@ Each test case has a suffix of `.test` and a shape like:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "Verify annotation has target",
- "type": "object",
+ "assertionType": "must",
"expectedResult": "valid",
"errorMessage": "The object was missing a required 'target' property",
+ "type": "object",
"properties": {
"target": {
"anyOf": [
diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/annotationMusts-manual.html b/tests/wpt/web-platform-tests/annotation-model/annotations/annotationMusts-manual.html
index d2435ed0991..adfcca89da8 100644
--- a/tests/wpt/web-platform-tests/annotation-model/annotations/annotationMusts-manual.html
+++ b/tests/wpt/web-platform-tests/annotation-model/annotations/annotationMusts-manual.html
@@ -12,12 +12,13 @@
setup({explicit_timeout: true, explicit_done: true });
var theDefinitions=[
- "definitions/specificResource.json",
"definitions/choiceSet.json",
+ "definitions/id.json",
"definitions/bodyTarget.json",
"definitions/annotations.json",
+ "definitions/specificResource.json",
"definitions/otherProperties.json",
- "definitions/id.json"
+ "definitions/collections.json"
];
var theTestFile="annotationMusts.test";
diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/annotationOptionals-manual.html b/tests/wpt/web-platform-tests/annotation-model/annotations/annotationOptionals-manual.html
index 2b9f4e74511..65be15a582c 100644
--- a/tests/wpt/web-platform-tests/annotation-model/annotations/annotationOptionals-manual.html
+++ b/tests/wpt/web-platform-tests/annotation-model/annotations/annotationOptionals-manual.html
@@ -12,12 +12,13 @@
setup({explicit_timeout: true, explicit_done: true });
var theDefinitions=[
- "definitions/specificResource.json",
"definitions/choiceSet.json",
+ "definitions/id.json",
"definitions/bodyTarget.json",
"definitions/annotations.json",
+ "definitions/specificResource.json",
"definitions/otherProperties.json",
- "definitions/id.json"
+ "definitions/collections.json"
];
var theTestFile="annotationOptionals.test";
diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/annotationOptionals.test b/tests/wpt/web-platform-tests/annotation-model/annotations/annotationOptionals.test
index 955ac39d41d..16def6b4474 100644
--- a/tests/wpt/web-platform-tests/annotation-model/annotations/annotationOptionals.test
+++ b/tests/wpt/web-platform-tests/annotation-model/annotations/annotationOptionals.test
@@ -3,6 +3,7 @@
"name": "Annotation implements optional keys and meets optional key value constraints",
"description": "Web Annotations: <ul> <li>Should include certain properties (keys)</li> <li>May include additional keys</li> <li>should have Annotation key values that conform to model recommended constraints</li> </ul> Note: failing an assertion indicates that a recommended or optional feature has not been implemented or has not been implemented correctly.",
"testType": "manual",
+ "skipFailures": [ "should", "may" ],
"ref": "https://www.w3.org/TR/annotation-model/#other-properties",
"assertions": [
"annotations/3.3.1-annotationSingleCreatorImplemented.json",
diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/annotationsAgentOptionals-manual.html b/tests/wpt/web-platform-tests/annotation-model/annotations/annotationsAgentOptionals-manual.html
index bb1590624cf..b187008dade 100644
--- a/tests/wpt/web-platform-tests/annotation-model/annotations/annotationsAgentOptionals-manual.html
+++ b/tests/wpt/web-platform-tests/annotation-model/annotations/annotationsAgentOptionals-manual.html
@@ -12,12 +12,13 @@
setup({explicit_timeout: true, explicit_done: true });
var theDefinitions=[
- "definitions/specificResource.json",
"definitions/choiceSet.json",
+ "definitions/id.json",
"definitions/bodyTarget.json",
"definitions/annotations.json",
+ "definitions/specificResource.json",
"definitions/otherProperties.json",
- "definitions/id.json"
+ "definitions/collections.json"
];
var theTestFile="annotationsAgentOptionals.test";
diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/annotationsAgentOptionals.test b/tests/wpt/web-platform-tests/annotation-model/annotations/annotationsAgentOptionals.test
index c5eb8713a6a..3b6616eed80 100644
--- a/tests/wpt/web-platform-tests/annotation-model/annotations/annotationsAgentOptionals.test
+++ b/tests/wpt/web-platform-tests/annotation-model/annotations/annotationsAgentOptionals.test
@@ -3,6 +3,7 @@
"name": "Annotation implements optional keys and meets optional key value constraints for Creator and Generator Agents",
"description": "Agents (Creators, Generators) involved in an Annotation: <ul> <li>Should include certain properties (keys)</li> <li>May include additional keys</li> <li>should have Agent key values that conform to model recommended constraints</li> </ul> Note: failing an assertion indicates that a recommended or optional feature has not been implemented or has not been implemented correctly.",
"testType": "manual",
+ "skipFailures": [ "should", "may" ],
"ref": "https://www.w3.org/TR/annotation-model/#other-properties",
"assertions":
[
diff --git a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.4-targNoTypeTextualBody.json b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.4-targNoTypeTextualBody.json
index 03c6ab210c7..8e875951b9e 100644
--- a/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.4-targNoTypeTextualBody.json
+++ b/tests/wpt/web-platform-tests/annotation-model/annotations/bodiesTargets/3.2.4-targNoTypeTextualBody.json
@@ -13,15 +13,15 @@
"target":
{
"allOf": [
- { "not": { "$ref": "bodyTarget.json#/definitions/embeddedTextTypeIncludesTextualBody" } },
- { "not": { "$ref": "bodyTarget.json#/definitions/itemEmbeddedTextTypeIncludesTextualBody" } },
+ { "not": { "$ref": "bodyTarget.json#/definitions/embeddedTextTypeInclTextualBodyWithoutId" } },
+ { "not": { "$ref": "bodyTarget.json#/definitions/itemEmbeddedTextTypeInclTextualBodyWithoutId" } },
{
"items":
{ "not":
{ "anyOf":
[
- { "$ref": "bodyTarget.json#/definitions/embeddedTextTypeIncludesTextualBody" },
- { "$ref": "bodyTarget.json#/definitions/itemEmbeddedTextTypeIncludesTextualBody" }
+ { "$ref": "bodyTarget.json#/definitions/embeddedTextTypeInclTextualBodyWithoutId" },
+ { "$ref": "bodyTarget.json#/definitions/itemEmbeddedTextTypeInclTextualBodyWithoutId" }
]
}
}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/3.3.1-collectionCreatedImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.1-collectionCreatedImplemented.json
new file mode 100644
index 00000000000..d57ecd1efef
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.1-collectionCreatedImplemented.json
@@ -0,0 +1,17 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.1-collectionCreatedImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Valid Annotation Collection-level created key not found. Annotation Collection may have exactly one created key value.",
+ "title": "Implements Annotation Collection-level **_created_ key** which has a **single value** that is a **string of format date-time** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)",
+ "description": "True when the Annotation Collection implements exactly one created key value (Sections 3.3.1 and 5.1)",
+ "allOf":
+ [
+ { "$ref": "otherProperties.json#/definitions/createdValidIfPresent"},
+ { "type": "object",
+ "required" : [ "created" ]
+ }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/3.3.1-collectionCreatedValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.1-collectionCreatedValidated.json
new file mode 100644
index 00000000000..09ff1aa9d08
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.1-collectionCreatedValidated.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.1-collectionCreatedValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation Collection has multiple created key values or a single created key value that is not of format date-time.",
+ "title": "If present the Annotation Collection-level **_created_ key** has a **single value** that is of **format date-time** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)",
+ "description": "True when no Annotation Collection created key present or when created key has a single value that is of format date-time (Section 3.3.1)",
+ "type": "object",
+ "allOf": [
+ { "$ref": "otherProperties.json#/definitions/createdValidIfPresent" }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/3.3.1-collectionCreatorImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.1-collectionCreatorImplemented.json
new file mode 100644
index 00000000000..1bd4d144255
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.1-collectionCreatorImplemented.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.1-collectionCreatorImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Annotation Collection creator key not found. Annotation Collection may have zero or more creators.",
+ "title": "Implements **Annotation Collection _creator_ key** which has one or more values, each of which is a **string of format uri** or an **object** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)",
+ "description": "True when the Annotation Collection implements creator key (Section 3.3.1)",
+ "allOf":
+ [
+ { "$ref": "otherProperties.json#/definitions/creatorValidIfPresent"},
+ { "type": "object",
+ "required": [ "creator" ] }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/3.3.1-collectionModifiedImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.1-collectionModifiedImplemented.json
new file mode 100644
index 00000000000..8deba356bd5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.1-collectionModifiedImplemented.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.1-collectionModifiedImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Valid Annotation Collection-level modified key not found. Annotation Collection may have zero or exactly one modified key value.",
+ "title": "Implements Annotation Collection-level **_modified_ key** which has a **single value** that is a **string of format date-time** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)",
+ "description": "True when the Annotation Collection implements exactly one modified key value (Section 3.3.1, 5.1)",
+ "allOf":
+ [
+ { "$ref": "otherProperties.json#/definitions/modifiedValidIfPresent"},
+ { "type": "object",
+ "required": [ "modified" ] }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/3.3.1-collectionModifiedValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.1-collectionModifiedValidated.json
new file mode 100644
index 00000000000..65a571e84ee
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.1-collectionModifiedValidated.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.1-collectionModifiedValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation Collection has multiple modified key values or a single modified key value that is not of format date-time.",
+ "title": "If present the Annotation Collection-level **_modified_ key** has a **single value** that is of **format date-time** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)",
+ "description": "True when no Annotation Collection modified key present or when modified key has a single value that is of format date-time (Section 3.3.1)",
+ "type": "object",
+ "allOf": [
+ { "$ref": "otherProperties.json#/definitions/modifiedValidIfPresent" }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentEmailImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentEmailImplemented.json
new file mode 100644
index 00000000000..34b5c560b98
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentEmailImplemented.json
@@ -0,0 +1,24 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.2-collectionCreatorAgentEmailImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Email for Annotation Collection Creator (Agent) not found. Agents may have one or more email values.",
+ "title": "Implements Annotation Collection-level creator (Agent) **_email_ key** with one or more values, each of which is a **mailto: uri** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)",
+ "description": "True when one or more email values for Annotation Collection Creator (Agent) is implemented (Section 3.3.2)",
+ "properties":
+ { "creator":
+ { "oneOf":
+ [
+ { "$ref": "otherProperties.json#/definitions/agentEmailFound" },
+ { "type": "array",
+ "minItems": 1,
+ "not":
+ { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentEmailFound" } } }
+ }
+ ]
+ }
+ },
+ "required": ["creator"]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentEmail_sha1Implemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentEmail_sha1Implemented.json
new file mode 100644
index 00000000000..6e8ef750755
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentEmail_sha1Implemented.json
@@ -0,0 +1,24 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.2-collectionCreatorAgentEmail_sha1Implemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Email_sha1 for Annotation Collection Creator (Agent) not found. Agents may have one or more email_sha1 values.",
+ "title": "Implements Annotation Collection-level creator (Agent) **email_sha1 key** with one or more values - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)",
+ "description": "True when one or more email_sha1 values for Annotation Collection Creator (Agent) is implemented (Section 3.3.2)",
+ "properties":
+ { "creator":
+ { "oneOf":
+ [
+ { "$ref": "otherProperties.json#/definitions/agentEmail_sha1Found" },
+ { "type": "array",
+ "minItems": 1,
+ "not":
+ { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentEmail_sha1Found" } } }
+ }
+ ]
+ }
+ },
+ "required": ["creator"]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentHomepageImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentHomepageImplemented.json
new file mode 100644
index 00000000000..c3ed8d3b0c4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentHomepageImplemented.json
@@ -0,0 +1,24 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.2-collectionCreatorAgentHomepageImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Homepage for Annotation Collection Creator (Agent) not found. Agents may have one or more homepage values.",
+ "title": "Implements Annotation Collection-level creator (Agent) **_homepage_ key** with one or more values, each of which is a **string of format uri** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)",
+ "description": "True when one or more homepage values for Annotation Collection Creator (Agent) is implemented (Section 3.3.2)",
+ "properties":
+ { "creator":
+ { "oneOf":
+ [
+ { "$ref": "otherProperties.json#/definitions/agentHomepageFound" },
+ { "type": "array",
+ "minItems": 1,
+ "not":
+ { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentHomepageFound" } } }
+ }
+ ]
+ }
+ },
+ "required": ["creator"]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentIdImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentIdImplemented.json
new file mode 100644
index 00000000000..3f7241d0553
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentIdImplemented.json
@@ -0,0 +1,24 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.2-collectionCreatorAgentIdImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Id for Annotation Collection Creator (Agent) not found or more than 1 found. Agents should have exactly one id of format uri.",
+ "title": "Implements Annotation Collection-level creator (Agent) **_id_ key** with **single value** that is a **string of format uri** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)",
+ "description": "True when type for Annotation Collection Creator (Agent) has exactly one id (Section 3.3.2)",
+ "properties":
+ { "creator":
+ { "oneOf":
+ [
+ { "$ref": "id.json#/definitions/idValueFound" },
+ { "type": "array",
+ "minItems": 1,
+ "not":
+ { "items": { "not": { "$ref": "id.json#/definitions/idValueFound" } } }
+ }
+ ]
+ }
+ },
+ "required": ["creator"]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentNameImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentNameImplemented.json
new file mode 100644
index 00000000000..5f1a07b0f0a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentNameImplemented.json
@@ -0,0 +1,24 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.2-collectionCreatorAgentNameImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Name for Annotation Collection Creator (Agent) not found. Agents may have one or more name values.",
+ "title": "Implements Annotation Collection-level creator (Agent) **_name_ key** with one or more values - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)",
+ "description": "True when one or more name values for Annotation Collection Creator (Agent) is implemented (Section 3.3.2)",
+ "properties":
+ { "creator":
+ { "oneOf":
+ [
+ { "$ref": "otherProperties.json#/definitions/agentNameFound" },
+ { "type": "array",
+ "minItems": 1,
+ "not":
+ { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentNameFound" } } }
+ }
+ ]
+ }
+ },
+ "required": ["creator"]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentNicknameImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentNicknameImplemented.json
new file mode 100644
index 00000000000..9da32ff09f9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentNicknameImplemented.json
@@ -0,0 +1,24 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.2-collectionCreatorAgentNicknameImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Nickname for Annotation Collection Creator (Agent) not found. Agents should have exactly one nickname value.",
+ "title": "Implements Annotation Collection-level creator (Agent) **_nickname_ key** with a **single value** that is a string - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)",
+ "description": "True when exactly one nickname for Annotation Collection Creator (Agent) is implemented (Section 3.3.2)",
+ "properties":
+ { "creator":
+ { "oneOf":
+ [
+ { "$ref": "otherProperties.json#/definitions/agentSingularNicknameFound" },
+ { "type": "array",
+ "minItems": 1,
+ "not":
+ { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentSingularNicknameFound" } } }
+ }
+ ]
+ }
+ },
+ "required": ["creator"]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentTypeImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentTypeImplemented.json
new file mode 100644
index 00000000000..43f5fc32f40
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.2-collectionCreatorAgentTypeImplemented.json
@@ -0,0 +1,24 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.2-collectionCreatorAgentTypeImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Type (Person, Organization, Software) for Annotation Collection Creator (Agent) not found. Agents should have one or more type values.",
+ "title": "Implements Annotation Collection-level creator (Agent) **_type_ key** with one or more values from **model-recommended list (Person, Organization, Software)** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)",
+ "description": "True when type for Annotation Collection Creator (Agent) is implemented (Section 3.3.2)",
+ "properties":
+ { "creator":
+ { "oneOf":
+ [
+ { "$ref": "otherProperties.json#/definitions/agentTypeFound" },
+ { "type": "array",
+ "minItems": 1,
+ "not":
+ { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentTypeFound" } } }
+ }
+ ]
+ }
+ },
+ "required": ["creator"]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/3.3.6-collectionRightsImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.6-collectionRightsImplemented.json
new file mode 100644
index 00000000000..927f93eb3e3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.6-collectionRightsImplemented.json
@@ -0,0 +1,16 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.6-collectionRightsImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Annotation Collection-level rights key having string value(s) of format uri not found. Annotation Collection may have zero or more rights key values.",
+ "title": "Implements Annotation Collection-level **_rights_** key which has one or more values, each of which is a **string of format uri** - [model 3.3.6](https://www.w3.org/TR/annotation-model/#rights-information)",
+ "description": "True when the Annotation Collection implements rights key with with string(s) of format uri value(s) (Sections 5.1 and 3.3.6)",
+ "allOf":
+ [
+ { "$ref": "otherProperties.json#/definitions/rightsValidIfPresent"},
+ { "type": "object",
+ "required": [ "rights" ]}
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/3.3.6-collectionRightsValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.6-collectionRightsValidated.json
new file mode 100644
index 00000000000..68410460589
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/3.3.6-collectionRightsValidated.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.6-collectionRightsValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation Collection Collection has one or more values for the rights key that are not strings of format uri.",
+ "title": "If present the Annotation Collection Collection-level **_rights_ key** has values that are all **strings of format uri** - [model 3.3.6](https://www.w3.org/TR/annotation-model/#rights-information)",
+ "description": "True when no Annotation Collection Collection rights key present or when all values of rights key are strings of format uri (Section 3.3.6)",
+ "type": "object",
+ "allOf": [
+ { "$ref": "otherProperties.json#/definitions/rightsValidIfPresent" }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionContextValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionContextValidated.json
new file mode 100644
index 00000000000..d9a5dc31235
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionContextValidated.json
@@ -0,0 +1,20 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.1-collectionContextValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation Collection is missing @context key or 'http://www.w3.org/ns/anno.jsonld' is not a value of @context.",
+ "title": "Implements **_@context_ key** and '**http://www.w3.org/ns/anno.jsonld**' is **a value of _@context_** - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)",
+ "description": "True when the Annotation Collection has @context key and 'http://www.w3.org/ns/anno.jsonld' is an @context value (Section 5.1)",
+ "type": "object",
+ "required": [ "@context" ],
+ "properties": {
+ "@context": {
+ "oneOf": [
+ { "$ref": "collections.json#/definitions/contextValueFound" },
+ { "$ref": "collections.json#/definitions/contextValueInArrayFound" }
+ ]
+ }
+ }
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionFirstImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionFirstImplemented.json
new file mode 100644
index 00000000000..0eee805921e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionFirstImplemented.json
@@ -0,0 +1,10 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.1-collectionFirstImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Annotation Collection is allowed exactly one first key.",
+ "title": "Implements **Annotation Collection _first_ key** - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)",
+ "$ref": "collections.json#/definitions/firstFound"
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionFirstValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionFirstValidated.json
new file mode 100644
index 00000000000..4c31e1fd744
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionFirstValidated.json
@@ -0,0 +1,10 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.1-collectionFirstValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation Collection has invalid first key or has total value more than zero without a valid first key.",
+ "title": "**Annotation Collection has _first_ key**, or no **_total_ key**, or **_total_ key** with value of zero - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)",
+ "$ref": "collections.json#/definitions/firstRequiredIfTotalMoreThanZero"
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionIdValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionIdValidated.json
new file mode 100644
index 00000000000..164620879ee
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionIdValidated.json
@@ -0,0 +1,11 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.1-collectionIdValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation Collection is missing id key or value of id key is not a single string of format uri.",
+ "title": "Implements **Annotation Collection _id_ key** which has a **single value** that is a **string of format uri** - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)",
+ "description": "True when the Annotation Collection has a single id that is a string of format uri (Section 5.1)",
+ "$ref": "id.json#/definitions/idValueFound"
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionLabelImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionLabelImplemented.json
new file mode 100644
index 00000000000..916ba5c80d7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionLabelImplemented.json
@@ -0,0 +1,10 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.1-collectionLabelImplemented.json",
+ "assertionType": "should",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Annotation Collection should have a label key.",
+ "title": "Implements **Annotation Collection _label_ key** - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)",
+ "$ref": "collections.json#/definitions/labelFound"
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionLabelValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionLabelValidated.json
new file mode 100644
index 00000000000..7543d515da4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionLabelValidated.json
@@ -0,0 +1,10 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.1-collectionLabelValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation Collection has label key with non-string value or an array as value containing non-string value.",
+ "title": "**Annotation Collection _label_ key**, if present, is **a value of type string** - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)",
+ "$ref": "collections.json#/definitions/labelDefinition"
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionLastImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionLastImplemented.json
new file mode 100644
index 00000000000..528a5616e88
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionLastImplemented.json
@@ -0,0 +1,10 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.1-collectionLastImplemented.json",
+ "assertionType": "should",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Annotation Collection should include exactly one last key with value that is string of uri format.",
+ "title": "Implements **Annotation Collection _last_ key** - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)",
+ "$ref": "collections.json#/definitions/lastFound"
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionLastValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionLastValidated.json
new file mode 100644
index 00000000000..d00e90da69b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionLastValidated.json
@@ -0,0 +1,10 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.1-collectionLastValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation Collection has last key with non-uri value or array as value containing more than one item.",
+ "title": "**Annotation Collection _last_ key**, if present, is **a single value of format uri** - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)",
+ "$ref": "collections.json#/definitions/lastValidIfPresent"
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionTotalImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionTotalImplemented.json
new file mode 100644
index 00000000000..088e785c2e6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionTotalImplemented.json
@@ -0,0 +1,10 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.1-collectionTotalImplemented.json",
+ "assertionType": "should",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Annotation Collection should include exactly one total key with non-negative numeric value.",
+ "title": "Implements **Annotation Collection _total_ key** - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)",
+ "$ref": "collections.json#/definitions/totalFound"
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionTotalValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionTotalValidated.json
new file mode 100644
index 00000000000..51b3ff263a2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionTotalValidated.json
@@ -0,0 +1,10 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.1-collectionTotalValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation Collection has total key with non-numeric value, a negative numeric value, or more than one value.",
+ "title": "**Annotation Collection _total_ key**, if present, is **a non-negative integer value** - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)",
+ "$ref": "collections.json#/definitions/totalDefinition"
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionTypeValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionTypeValidated.json
new file mode 100644
index 00000000000..3c858ab92d3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/5.1-collectionTypeValidated.json
@@ -0,0 +1,10 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.1-collectionTypeValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation Collection is missing type key or 'AnnotationCollection' is not a value of type.",
+ "title": "Implements **Annotation Collection _type_ key** such that '**AnnotationCollection**' is **a value of _type_** - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)",
+ "$ref": "collections.json#/definitions/annotationCollectionTypeValueFound"
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/collectionMusts-manual.html b/tests/wpt/web-platform-tests/annotation-model/collections/collectionMusts-manual.html
new file mode 100644
index 00000000000..d1ff44491b1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/collectionMusts-manual.html
@@ -0,0 +1,49 @@
+<!doctype html>
+<html>
+<head>
+<title>A single Annotation Collection has all required keys and all collection keys used meet required value constraints</title>
+<link rel="stylesheet" href="/resources/testharness.css">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/annotation-model/scripts/ajv.min.js"></script>
+<script src="/annotation-model/scripts/showdown.min.js"></script>
+<script src="/annotation-model/scripts/JSONtest.js"></script>
+<script>
+setup({explicit_timeout: true, explicit_done: true });
+
+var theDefinitions=[
+ "definitions/choiceSet.json",
+ "definitions/id.json",
+ "definitions/bodyTarget.json",
+ "definitions/annotations.json",
+ "definitions/specificResource.json",
+ "definitions/otherProperties.json",
+ "definitions/collections.json"
+];
+
+var theTestFile="collectionMusts.test";
+
+var runningTest = new JSONtest( {
+ "testInput" : "annotation-input",
+ "runTest" : "annotation-run",
+ "closeWindow" : "annotation-close",
+ "schemaDefs" : theDefinitions,
+ "testFile" : theTestFile
+} ) ;
+
+</script>
+</head>
+<body>
+<p>Fill the textarea below with JSON output from your annotation client
+implementation that supports the following criteria:</p>
+<div id="testDescription"></div>
+<form name="annotation" id="annotation">
+ <textarea name="annotation-input" id="annotation-input" style="width: 90%; height: 10em" ></textarea>
+ <p><input type="button" id="annotation-run" name="Loading..." value="Loading...">
+ <input style="display: none" type="button" id="annotation-close"
+ name="Close" value="Close"></p>
+</form>
+<p>Specifically, the following assertions will be evaluated:</p>
+<div id="assertion"></div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/collectionMusts.test b/tests/wpt/web-platform-tests/annotation-model/collections/collectionMusts.test
new file mode 100644
index 00000000000..31864b784f7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/collectionMusts.test
@@ -0,0 +1,19 @@
+{
+ "@context": "https://www.w3.org/ns/JSONtest-v1.jsonld",
+ "name": "A single Annotation Collection has all required keys and all collection keys used meet required value constraints",
+ "description": "Collections of Web Annotations: <ul> <li>MUST include certain properties (keys)</li> <li>MUST satisfy model constraints on values of required and any optional Annotation keys used</li> </ul> Note: Implementation of optional Annotation Collection keys (features), optional constraints on key values, and optional keys and constraints on Agents involved in an Annotation Collection checked by other tests.<br/><b>Please fill textarea with json-ld serialization of a single Annotation Collection description</b>",
+ "testType": "manual",
+ "ref": "https://www.w3.org/TR/annotation-model/",
+ "assertions": [
+ "collections/5.1-collectionContextValidated.json",
+ "collections/5.1-collectionIdValidated.json",
+ "collections/5.1-collectionTypeValidated.json",
+ "collections/5.1-collectionLabelValidated.json",
+ "collections/5.1-collectionTotalValidated.json",
+ "collections/5.1-collectionFirstValidated.json",
+ "collections/5.1-collectionLastValidated.json",
+ "collections/3.3.1-collectionCreatedValidated.json",
+ "collections/3.3.1-collectionModifiedValidated.json",
+ "collections/3.3.6-collectionRightsValidated.json"
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/collectionOptionals-manual.html b/tests/wpt/web-platform-tests/annotation-model/collections/collectionOptionals-manual.html
new file mode 100644
index 00000000000..ce489fce204
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/collectionOptionals-manual.html
@@ -0,0 +1,49 @@
+<!doctype html>
+<html>
+<head>
+<title>A single Annotation Collection implements optional keys and meets optional key value constraints</title>
+<link rel="stylesheet" href="/resources/testharness.css">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/annotation-model/scripts/ajv.min.js"></script>
+<script src="/annotation-model/scripts/showdown.min.js"></script>
+<script src="/annotation-model/scripts/JSONtest.js"></script>
+<script>
+setup({explicit_timeout: true, explicit_done: true });
+
+var theDefinitions=[
+ "definitions/choiceSet.json",
+ "definitions/id.json",
+ "definitions/bodyTarget.json",
+ "definitions/annotations.json",
+ "definitions/specificResource.json",
+ "definitions/otherProperties.json",
+ "definitions/collections.json"
+];
+
+var theTestFile="collectionOptionals.test";
+
+var runningTest = new JSONtest( {
+ "testInput" : "annotation-input",
+ "runTest" : "annotation-run",
+ "closeWindow" : "annotation-close",
+ "schemaDefs" : theDefinitions,
+ "testFile" : theTestFile
+} ) ;
+
+</script>
+</head>
+<body>
+<p>Fill the textarea below with JSON output from your annotation client
+implementation that supports the following criteria:</p>
+<div id="testDescription"></div>
+<form name="annotation" id="annotation">
+ <textarea name="annotation-input" id="annotation-input" style="width: 90%; height: 10em" ></textarea>
+ <p><input type="button" id="annotation-run" name="Loading..." value="Loading...">
+ <input style="display: none" type="button" id="annotation-close"
+ name="Close" value="Close"></p>
+</form>
+<p>Specifically, the following assertions will be evaluated:</p>
+<div id="assertion"></div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/collectionOptionals.test b/tests/wpt/web-platform-tests/annotation-model/collections/collectionOptionals.test
new file mode 100644
index 00000000000..885b3f4020c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/collectionOptionals.test
@@ -0,0 +1,24 @@
+{
+ "@context": "https://www.w3.org/ns/JSONtest-v1.jsonld",
+ "name": "A single Annotation Collection implements optional keys and meets optional key value constraints",
+ "description": "A Collection of Web Annotations: <ul> <li>Should include certain properties (keys)</li> <li>May include additional keys</li> <li>May have creator Agent key values that conform to model recommended constraints</li></ul> Note: failing an assertion indicates only that a recommended or optional feature has not been implemented or has not been implemented correctly. <br/><b>Please fill textarea with json-ld serialization of a single Annotation Collection description</b>",
+ "testType": "manual",
+ "ref": "https://www.w3.org/TR/annotation-model/",
+ "assertions": [
+ "collections/5.1-collectionLabelImplemented.json",
+ "collections/5.1-collectionLastImplemented.json",
+ "collections/5.1-collectionTotalImplemented.json",
+ "collections/5.1-collectionFirstImplemented.json",
+ "collections/3.3.1-collectionModifiedImplemented.json",
+ "collections/3.3.1-collectionCreatorImplemented.json",
+ "collections/3.3.1-collectionCreatedImplemented.json",
+ "collections/3.3.6-collectionRightsImplemented.json",
+ "collections/3.3.2-collectionCreatorAgentEmail_sha1Implemented.json",
+ "collections/3.3.2-collectionCreatorAgentEmailImplemented.json",
+ "collections/3.3.2-collectionCreatorAgentHomepageImplemented.json",
+ "collections/3.3.2-collectionCreatorAgentIdImplemented.json",
+ "collections/3.3.2-collectionCreatorAgentNameImplemented.json",
+ "collections/3.3.2-collectionCreatorAgentNicknameImplemented.json",
+ "collections/3.3.2-collectionCreatorAgentTypeImplemented.json"
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatedImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatedImplemented.json
new file mode 100644
index 00000000000..e65ea8f29c1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatedImplemented.json
@@ -0,0 +1,37 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.1-pageCreatedImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Valid Annotation Page-level created key not found. Annotation Page may have exactly one created key value inherited from Collection.",
+ "title": "Implements Annotation Page-level **_created_ key** which has a **single value** that is a **string of format date-time** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)",
+ "description": "True when the Annotation Page implements exactly one created key value (Sections 3.3.1 and 5.2)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "#/definitions/createdImplemented" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "#/definitions/createdImplemented" }
+ },
+ "required": [ "first" ]
+ }
+ ],
+ "definitions":
+ {
+ "createdImplemented":
+ {
+ "allOf":
+ [
+ { "$ref": "otherProperties.json#/definitions/createdValidIfPresent"},
+ { "type": "object",
+ "required" : [ "created" ]
+ }
+ ]
+ }
+ }
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatedValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatedValidated.json
new file mode 100644
index 00000000000..be4e9c32487
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatedValidated.json
@@ -0,0 +1,24 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.1-pageCreatedValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation page has multiple created key values or a single created key value that is not of format date-time.",
+ "title": "If present the Annotation page-level **_created_ key** has a **single value** that is of **format date-time** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)",
+ "description": "True when no Annotation page created key present or when created key has a single value that is of format date-time (Section 3.3.1)",
+ "type": "object",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "otherProperties.json#/definitions/createdValidIfPresent" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "properties":
+ {"first":
+ { "$ref": "otherProperties.json#/definitions/createdValidIfPresent" }
+ },
+ "required": [ "first" ]
+ }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatorImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatorImplemented.json
new file mode 100644
index 00000000000..8b6ded3a4ec
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageCreatorImplemented.json
@@ -0,0 +1,36 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.1-pageCreatorImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Valid Annotation Page-level creator key not found. Annotation Page may have zero or more creators inherited from Collection.",
+ "title": "Implements **Annotation Page-level _creator_ key** which has one or more values, each of which is a **string of format uri** or an **object** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)",
+ "description": "True when the Annotation Page implements creator key (Section 3.3.1)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "#/definitions/creatorImplemented" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "#/definitions/creatorImplemented" }
+ },
+ "required": [ "first" ]
+ }
+ ],
+ "definitions":
+ {
+ "creatorImplemented":
+ {
+ "allOf":
+ [
+ { "$ref": "otherProperties.json#/definitions/creatorValidIfPresent"},
+ { "type": "object",
+ "required": [ "creator" ] }
+ ]
+ }
+ }
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageModifiedImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageModifiedImplemented.json
new file mode 100644
index 00000000000..5bccc821152
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageModifiedImplemented.json
@@ -0,0 +1,36 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.1-pageModifiedImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Valid Annotation Page-level modified key not found. Annotation Page may have zero or exactly one modified key value inherited from Collection.",
+ "title": "Implements Annotation Page-level **_modified_ key** which has a **single value** that is a **string of format date-time** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)",
+ "description": "True when the Annotation Page implements exactly one modified key value (Section 3.3.1, 5.2)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "#/definitions/modifiedImplemented" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "#/definitions/modifiedImplemented" }
+ },
+ "required": [ "first" ]
+ }
+ ],
+ "definitions":
+ {
+ "modifiedImplemented":
+ {
+ "allOf":
+ [
+ { "$ref": "otherProperties.json#/definitions/modifiedValidIfPresent"},
+ { "type": "object",
+ "required": [ "modified" ] }
+ ]
+ }
+ }
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageModifiedValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageModifiedValidated.json
new file mode 100644
index 00000000000..d8591cd16a4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.1-pageModifiedValidated.json
@@ -0,0 +1,24 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.1-pageModifiedValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation page has multiple modified key values or a single modified key value that is not of format date-time.",
+ "title": "If present the Annotation page-level **_modified_ key** has a **single value** that is of **format date-time** - [model 3.3.1](https://www.w3.org/TR/annotation-model/#lifecycle-information)",
+ "description": "True when no Annotation page modified key present or when modified key has a single value that is of format date-time (Section 3.3.1)",
+ "type": "object",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "otherProperties.json#/definitions/modifiedValidIfPresent" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "properties":
+ {"first":
+ { "$ref": "otherProperties.json#/definitions/modifiedValidIfPresent" }
+ },
+ "required": [ "first" ]
+ }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentEmailImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentEmailImplemented.json
new file mode 100644
index 00000000000..c30f81ac28f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentEmailImplemented.json
@@ -0,0 +1,42 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.2-pageCreatorAgentEmailImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Email for Annotation Page Creator (Agent), inherited from Collection, not found. Agents may have one or more email values.",
+ "title": "Implements Annotation Page-level creator (Agent), inherited from Collection, **_email_ key** with one or more values, each of which is a **mailto: uri** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)",
+ "description": "True when one or more email values for Annotation Page Creator (Agent), inherited from Collection, is implemented (Section 3.3.2)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "#/definitions/creatorAgentEmailFound" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "#/definitions/creatorAgentEmailFound" }
+ },
+ "required": [ "first" ]
+ }
+ ],
+ "definitions": {
+ "creatorAgentEmailFound":
+ { "properties":
+ { "creator":
+ { "oneOf":
+ [
+ { "$ref": "otherProperties.json#/definitions/agentEmailFound" },
+ { "type": "array",
+ "minItems": 1,
+ "not":
+ { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentEmailFound" } } }
+ }
+ ]
+ }
+ },
+ "required": ["creator"]
+ }
+ }
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentEmail_sha1Implemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentEmail_sha1Implemented.json
new file mode 100644
index 00000000000..41e6ec0f6a4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentEmail_sha1Implemented.json
@@ -0,0 +1,42 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.2-pageCreatorAgentEmail_sha1Implemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Email_sha1 for Annotation Page Creator (Agent), inherited from Collection, not found. Agents may have one or more email_sha1 values.",
+ "title": "Implements Annotation Page-level creator (Agent), inherited from Collection, **email_sha1 key** with one or more values - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)",
+ "description": "True when one or more email_sha1 values for Annotation Page Creator (Agent), inherited from Collection, is implemented (Section 3.3.2)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "#/definitions/creatorAgentEmail_sha1Found" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "#/definitions/creatorAgentEmail_sha1Found" }
+ },
+ "required": [ "first" ]
+ }
+ ],
+ "definitions": {
+ "creatorAgentEmail_sha1Found":
+ { "properties":
+ { "creator":
+ { "oneOf":
+ [
+ { "$ref": "otherProperties.json#/definitions/agentEmail_sha1Found" },
+ { "type": "array",
+ "minItems": 1,
+ "not":
+ { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentEmail_sha1Found" } } }
+ }
+ ]
+ }
+ },
+ "required": ["creator"]
+ }
+ }
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentHomepageImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentHomepageImplemented.json
new file mode 100644
index 00000000000..d325b17ba83
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentHomepageImplemented.json
@@ -0,0 +1,42 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.2-pageCreatorAgentHomepageImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Homepage for Annotation Page Creator (Agent), inherited from Collection, not found. Agents may have one or more homepage values.",
+ "title": "Implements Annotation Page-level creator (Agent), inherited from Collection, **_homepage_ key** with one or more values, each of which is a **string of format uri** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)",
+ "description": "True when one or more homepage values for Annotation Page Creator (Agent), inherited from Collection, is implemented (Section 3.3.2)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "#/definitions/creatorAgentHomePageFound" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "#/definitions/creatorAgentHomePageFound" }
+ },
+ "required": [ "first" ]
+ }
+ ],
+ "definitions": {
+ "creatorAgentHomePageFound":
+ { "properties":
+ { "creator":
+ { "oneOf":
+ [
+ { "$ref": "otherProperties.json#/definitions/agentHomepageFound" },
+ { "type": "array",
+ "minItems": 1,
+ "not":
+ { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentHomepageFound" } } }
+ }
+ ]
+ }
+ },
+ "required": ["creator"]
+ }
+ }
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentIdImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentIdImplemented.json
new file mode 100644
index 00000000000..6d45c1df72b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentIdImplemented.json
@@ -0,0 +1,43 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.2-pageCreatorAgentIdImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Single id for Annotation Page Creator (Agent), inherited from Collection, not found for any Creator. Agents should have exactly one id of format uri.",
+ "title": "Implements Annotation Page-level creator (Agent), inherited from Collection, **_id_ key** with **single value** that is a **string of format uri** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)",
+ "description": "True when at least one Annotation Page Creator (Agent), inherited from Collection, has exactly one id (Section 3.3.2)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "#/definitions/creatorAgentIdFound" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "#/definitions/creatorAgentIdFound" }
+ },
+ "required": [ "first" ]
+ }
+ ],
+ "definitions": {
+ "creatorAgentIdFound":
+ {
+ "properties":
+ { "creator":
+ { "oneOf":
+ [
+ { "$ref": "id.json#/definitions/idValueFound" },
+ { "type": "array",
+ "minItems": 1,
+ "not":
+ { "items": { "not": { "$ref": "id.json#/definitions/idValueFound" } } }
+ }
+ ]
+ }
+ },
+ "required": ["creator"]
+ }
+ }
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentNameImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentNameImplemented.json
new file mode 100644
index 00000000000..077c3d51402
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentNameImplemented.json
@@ -0,0 +1,42 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.2-pageCreatorAgentNameImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Name for Annotation Page Creator (Agent), inherited from Collection, not found. Agents may have one or more name values.",
+ "title": "Implements Annotation Page-level creator (Agent), inherited from Collection, **_name_ key** with one or more values - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)",
+ "description": "True when one or more name values for Annotation Page Creator (Agent), inherited from Collection, is implemented (Section 3.3.2)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "#/definitions/creatorAgentNameFound" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "#/definitions/creatorAgentNameFound" }
+ },
+ "required": [ "first" ]
+ }
+ ],
+ "definitions": {
+ "creatorAgentNameFound":
+ { "properties":
+ { "creator":
+ { "oneOf":
+ [
+ { "$ref": "otherProperties.json#/definitions/agentNameFound" },
+ { "type": "array",
+ "minItems": 1,
+ "not":
+ { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentNameFound" } } }
+ }
+ ]
+ }
+ },
+ "required": ["creator"]
+ }
+ }
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentNicknameImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentNicknameImplemented.json
new file mode 100644
index 00000000000..60398fed77c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentNicknameImplemented.json
@@ -0,0 +1,45 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.2-pageCreatorAgentNicknameImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Single nickname for Annotation Page Creator (Agent), inherited from Collection, not found for any Creator. Agents should have exactly one id of format uri.",
+ "title": "Implements Annotation Page-level creator (Agent), inherited from Collection, **_nickname_ key** with **single value** that is a **string of format uri** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)",
+ "description": "True when at least one Annotation Page Creator (Agent), inherited from Collection, has exactly one nickname (Section 3.3.2)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "#/definitions/creatorAgentNicknameFound" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "#/definitions/creatorAgentNicknameFound" }
+ },
+ "required": [ "first" ]
+ }
+ ],
+ "definitions": {
+ "creatorAgentNicknameFound":
+ {
+ "properties":
+ { "creator":
+ { "oneOf":
+ [
+ { "$ref": "otherProperties.json#/definitions/agentSingularNicknameFound" },
+ { "type": "array",
+ "minItems": 1,
+ "not":
+ { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentSingularNicknameFound" } } }
+ }
+ ]
+ }
+ },
+ "required": ["creator"]
+ }
+ }
+}
+
+
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentTypeImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentTypeImplemented.json
new file mode 100644
index 00000000000..8144fa24e5a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.2-pageCreatorAgentTypeImplemented.json
@@ -0,0 +1,42 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.2-pageCreatorAgentTypeImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Type (Person, Organization, Software) for Annotation Page Creator (Agent), inherited from Collection, not found. Agents should have one or more type values.",
+ "title": "Implements Annotation Page-level creator (Agent), inherited from Collection, **_type_ key** with one or more values from **model-recommended list (Person, Organization, Software)** - [model 3.2.2](https://www.w3.org/TR/annotation-model/#agents)",
+ "description": "True when type for Annotation Page Creator (Agent), inherited from Collection, is implemented (Section 3.3.2)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "#/definitions/creatorAgentNameFound" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "#/definitions/creatorAgentNameFound" }
+ },
+ "required": [ "first" ]
+ }
+ ],
+ "definitions": {
+ "creatorAgentNameFound":
+ { "properties":
+ { "creator":
+ { "oneOf":
+ [
+ { "$ref": "otherProperties.json#/definitions/agentNameFound" },
+ { "type": "array",
+ "minItems": 1,
+ "not":
+ { "items": { "not": { "$ref": "otherProperties.json#/definitions/agentNameFound" } } }
+ }
+ ]
+ }
+ },
+ "required": ["creator"]
+ }
+ }
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.6-pageRightsImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.6-pageRightsImplemented.json
new file mode 100644
index 00000000000..56e4e910124
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.6-pageRightsImplemented.json
@@ -0,0 +1,31 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.6-pageRightsImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Annotation Page rights key (inherited from Collection) having string value(s) of format uri not found. Annotation Page may may have zero or more rights key values.",
+ "title": "Implements Annotation Page **_rights_** key (inherited from Collection) which has one or more values, each of which is a **string of format uri** - [model 3.3.6](https://www.w3.org/TR/annotation-model/#rights-information)",
+ "description": "True when the Annotation Page implements rights key with with string(s) of format uri value(s) (Sections 5.1 and 3.3.6)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "otherProperties.json#/definitions/rightsValidIfPresent" },
+ { "type": "object",
+ "required": [ "rights" ]},
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "allOf": [
+ { "$ref": "otherProperties.json#/definitions/rightsValidIfPresent" },
+ { "type": "object",
+ "required": [ "rights" ]}
+ ]
+ }
+ },
+ "required": [ "first" ]
+ }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.6-pageRightsValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.6-pageRightsValidated.json
new file mode 100644
index 00000000000..472c316dc6b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/3.3.6-pageRightsValidated.json
@@ -0,0 +1,24 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "3.3.6-pageRightsValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation page page has one or more values for the rights key that are not strings of format uri.",
+ "title": "If present the Annotation page page-level **_rights_ key** has values that are all **strings of format uri** - [model 3.3.6](https://www.w3.org/TR/annotation-model/#rights-information)",
+ "description": "True when no Annotation page page rights key present or when all values of rights key are strings of format uri (Section 3.3.6)",
+ "type": "object",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "otherProperties.json#/definitions/rightsValidIfPresent" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "properties":
+ {"first":
+ { "$ref": "otherProperties.json#/definitions/rightsValidIfPresent" }
+ },
+ "required": [ "first" ]
+ }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageContextValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageContextValidated.json
new file mode 100644
index 00000000000..66cbe0779fd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageContextValidated.json
@@ -0,0 +1,20 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.2-pageContextValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation Page/Collection is missing @context key or 'http://www.w3.org/ns/anno.jsonld' is not a value of @context.",
+ "title": "Implements **Annotation Page** (or Annotation Collection for embedded Page) **_@context_ key** and '**http://www.w3.org/ns/anno.jsonld**' is **a value of _@context_** - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)",
+ "description": "True when the Annotation Page/Collection has @context key and 'http://www.w3.org/ns/anno.jsonld' is an @context value (Section 5.2)",
+ "type": "object",
+ "required": [ "@context" ],
+ "properties": {
+ "@context": {
+ "oneOf": [
+ { "$ref": "collections.json#/definitions/contextValueFound" },
+ { "$ref": "collections.json#/definitions/contextValueInArrayFound" }
+ ]
+ }
+ }
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageFirstImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageFirstImplemented.json
new file mode 100644
index 00000000000..1c7dfb141e7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageFirstImplemented.json
@@ -0,0 +1,25 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.2-pageFirstImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Annotation Page has no first key (inherited from Collection).",
+ "title": "Implements **Annotation Page _first_ key** (inherited from Collection) with valid value - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "collections.json#/definitions/firstFound" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "collections.json#/definitions/firstFound" }
+ },
+ "required": [ "first" ]
+ }
+ ]
+}
+
+
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageFirstValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageFirstValidated.json
new file mode 100644
index 00000000000..2e260b1d36e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageFirstValidated.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.2-pageFirstValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation Page has invalid first key.",
+ "title": "**Annotation Page _first_ key** (inherited from Collection), if present, has value of string of format uri - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "collections.json#/definitions/firstValidIfPresent" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "collections.json#/definitions/firstValidIfPresent" }
+ },
+ "required": [ "first" ]
+ }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageIdValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageIdValidated.json
new file mode 100644
index 00000000000..bafa019c465
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageIdValidated.json
@@ -0,0 +1,24 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.2-pageIdValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation Page is missing id key or value of id key is not a single string of format uri.",
+ "title": "Implements **Annotation Page _id_ key** which has a **single value** that is a **string of format uri** - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)",
+ "description": "True when the Annotation Page has a single id that is a string of format uri (Section 5.2)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "id.json#/definitions/idValueFound" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "id.json#/definitions/idValueFound" }
+ },
+ "required": [ "first" ]
+ }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageItemsValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageItemsValidated.json
new file mode 100644
index 00000000000..57bedba8506
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageItemsValidated.json
@@ -0,0 +1,19 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.2-pageItemsValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation Page is missing items key or value of items key is not an array of strings of format uri and/or objects of type Annotation.",
+ "title": "Implements **Annotation Page _items_ key** such that value of items key is an array of strings of format uri and/or objects of type Annotation - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)",
+ "oneOf": [
+ { "$ref": "collections.json#/definitions/itemsFound" },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "collections.json#/definitions/itemsFound" }
+ },
+ "required": [ "first" ]
+ }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLabelImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLabelImplemented.json
new file mode 100644
index 00000000000..e64d5d80b24
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLabelImplemented.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.2-pageLabelImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Annotation Page has no label key (inherited from Collection).",
+ "title": "Implements **Annotation Page _label_ key** (inherited from Collection) with valid value - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "collections.json#/definitions/labelFound" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "collections.json#/definitions/labelFound" }
+ },
+ "required": [ "first" ]
+ }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLabelValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLabelValidated.json
new file mode 100644
index 00000000000..740bd622aed
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLabelValidated.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.2-pageLabelValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation Page has label key with non-string value or an array as value containing non-string value.",
+ "title": "**Annotation Page _label_ key**, if present (inherited from Collection), is **a value of type string** - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "collections.json#/definitions/labelDefinition" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "collections.json#/definitions/labelDefinition" }
+ },
+ "required": [ "first" ]
+ }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLastImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLastImplemented.json
new file mode 100644
index 00000000000..dc0806404fd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLastImplemented.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.2-pageLastImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Annotation Page has no last key (inherited from Collection).",
+ "title": "Implements **Annotation Page _last_ key** (inherited from Collection) with valid value - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "collections.json#/definitions/lastFound" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "collections.json#/definitions/lastFound" }
+ },
+ "required": [ "first" ]
+ }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLastValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLastValidated.json
new file mode 100644
index 00000000000..9d02948b39d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageLastValidated.json
@@ -0,0 +1,27 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.2-pageLastValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation Page has last key with non-uri value or array as value containing more than one item.",
+ "title": "**Annotation Page _last_ key** (inherited from Collection), if present, is **a single value of format uri** - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "collections.json#/definitions/lastValidIfPresent" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "collections.json#/definitions/lastValidIfPresent" }
+ },
+ "required": [ "first" ]
+ }
+ ]
+
+
+
+
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageNextImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageNextImplemented.json
new file mode 100644
index 00000000000..fb057117596
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageNextImplemented.json
@@ -0,0 +1,19 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.2-pageNextImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Annotation Page has no next key.",
+ "title": "Implements **Annotation Page _next_ key** with valid value of string of format uri - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)",
+ "oneOf": [
+ { "$ref": "collections.json#/definitions/nextFound" },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "collections.json#/definitions/nextFound" }
+ },
+ "required": [ "first" ]
+ }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageNextValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageNextValidated.json
new file mode 100644
index 00000000000..ab9198cc204
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageNextValidated.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.2-pageNextValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation Page has an invalid next value.",
+ "title": "True when **Annotation Page has no _next_ key** or has **_next_ key** with valid value of string of format uri - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "collections.json#/definitions/nextValidIfPresent" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "collections.json#/definitions/nextValidIfPresent" }
+ },
+ "required": [ "first" ]
+ }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pagePartOfImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pagePartOfImplemented.json
new file mode 100644
index 00000000000..a23e27ea689
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pagePartOfImplemented.json
@@ -0,0 +1,19 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.2-pagePartOfImplemented.json",
+ "assertionType": "should",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Annotation Page has no partOf key.",
+ "title": "Implements **Annotation Page _partOf_ key** with valid value of string of format uri - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)",
+ "oneOf": [
+ { "$ref": "collections.json#/definitions/partOfFound" },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "collections.json#/definitions/partOfFound" }
+ },
+ "required": [ "first" ]
+ }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pagePartOfValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pagePartOfValidated.json
new file mode 100644
index 00000000000..d073c63050b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pagePartOfValidated.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.2-pagePartOfValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation Page has an invalid partOf value.",
+ "title": "True when **Annotation Page has no _partOf_ key** or has **_partOf_ key** with valid value oof string of format uri - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "collections.json#/definitions/partOfValidIfPresent" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "collections.json#/definitions/partOfValidIfPresent" }
+ },
+ "required": [ "first" ]
+ }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pagePrevImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pagePrevImplemented.json
new file mode 100644
index 00000000000..0ba0e8792e7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pagePrevImplemented.json
@@ -0,0 +1,19 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.2-pagePrevImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Annotation Page has no prev key.",
+ "title": "Implements **Annotation Page _prev_ key** with valid value of string of format uri - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)",
+ "oneOf": [
+ { "$ref": "collections.json#/definitions/prevFound" },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "collections.json#/definitions/prevFound" }
+ },
+ "required": [ "first" ]
+ }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pagePrevValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pagePrevValidated.json
new file mode 100644
index 00000000000..a9fbc71e6d3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pagePrevValidated.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.2-pagePrevValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation Page has an invalid prev value.",
+ "title": "True when **Annotation Page has no _prev_ key** or has **_prev_ key** with valid value of string of format uri - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "collections.json#/definitions/prevValidIfPresent" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "collections.json#/definitions/prevValidIfPresent" }
+ },
+ "required": [ "first" ]
+ }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageStartIndexImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageStartIndexImplemented.json
new file mode 100644
index 00000000000..00a1eddd28c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageStartIndexImplemented.json
@@ -0,0 +1,19 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.2-pageStartIndexImplemented.json",
+ "assertionType": "should",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Annotation Page has has no valid startIndex value.",
+ "title": "Implements **Annotation Page _startIndex_ key** with valid value of _type_ integer >= 0 - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)",
+ "oneOf": [
+ { "$ref": "collections.json#/definitions/startIndexFound" },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "collections.json#/definitions/startIndexFound" }
+ },
+ "required": [ "first" ]
+ }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageStartIndexValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageStartIndexValidated.json
new file mode 100644
index 00000000000..21771937700
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageStartIndexValidated.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.2-pageStartIndexValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation Page has an invalid startIndex value.",
+ "title": "True when **Annotation Page has no _startIndex_ key** or has **_startIndex_ key** with valid value of _type_ integer >= 0 - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "collections.json#/definitions/startIndexDefinition" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "collections.json#/definitions/startIndexDefinition" }
+ },
+ "required": [ "first" ]
+ }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageTotalImplemented.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageTotalImplemented.json
new file mode 100644
index 00000000000..6e0e61a5c15
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageTotalImplemented.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.2-pageTotalImplemented.json",
+ "assertionType": "may",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "passAndContinue",
+ "errorMessage": "Annotation Page has no total key (inherited from Collection).",
+ "title": "Implements **Annotation Page _total_ key** (inherited from Collection) with valid value - [model 5.1](https://www.w3.org/TR/annotation-model/#annotation-collection)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "collections.json#/definitions/totalFound" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "collections.json#/definitions/totalFound" }
+ },
+ "required": [ "first" ]
+ }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageTotalValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageTotalValidated.json
new file mode 100644
index 00000000000..eb9411d8522
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageTotalValidated.json
@@ -0,0 +1,23 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.2-pageTotalValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation Page has total key with non-numeric value, a negative numeric value, or more than one value.",
+ "title": "**Annotation Page _total_ key**, if present (inherited from Collection), is **a non-negative integer value** - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)",
+ "oneOf": [
+ { "allOf": [
+ { "$ref": "collections.json#/definitions/totalDefinition" },
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "collections.json#/definitions/totalDefinition" }
+ },
+ "required": [ "first" ]
+ }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageTypeValidated.json b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageTypeValidated.json
new file mode 100644
index 00000000000..cb0e2f362db
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/5.2-pageTypeValidated.json
@@ -0,0 +1,19 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "5.2-pageTypeValidated.json",
+ "assertionType": "must",
+ "expectedResult": "valid",
+ "onUnexpectedResult" : "failAndContinue",
+ "errorMessage": "ERROR: Annotation Page is missing type key or 'AnnotationPage' is not a value of type.",
+ "title": "Implements **Annotation Page _type_ key** such that '**AnnotationPage**' is **a value of _type_** - [model 5.2](https://www.w3.org/TR/annotation-model/#annotation-page)",
+ "oneOf": [
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" },
+ { "type": "object",
+ "properties":
+ {"first":
+ { "$ref": "collections.json#/definitions/annotationPageTypeValueFound" }
+ },
+ "required": [ "first" ]
+ }
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/pageMusts-manual.html b/tests/wpt/web-platform-tests/annotation-model/collections/pages/pageMusts-manual.html
new file mode 100644
index 00000000000..843faaf5e78
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/pageMusts-manual.html
@@ -0,0 +1,49 @@
+<!doctype html>
+<html>
+<head>
+<title>A single Annotation Page has all required keys and all page keys present meet required value constraints</title>
+<link rel="stylesheet" href="/resources/testharness.css">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/annotation-model/scripts/ajv.min.js"></script>
+<script src="/annotation-model/scripts/showdown.min.js"></script>
+<script src="/annotation-model/scripts/JSONtest.js"></script>
+<script>
+setup({explicit_timeout: true, explicit_done: true });
+
+var theDefinitions=[
+ "definitions/choiceSet.json",
+ "definitions/id.json",
+ "definitions/bodyTarget.json",
+ "definitions/annotations.json",
+ "definitions/specificResource.json",
+ "definitions/otherProperties.json",
+ "definitions/collections.json"
+];
+
+var theTestFile="pageMusts.test";
+
+var runningTest = new JSONtest( {
+ "testInput" : "annotation-input",
+ "runTest" : "annotation-run",
+ "closeWindow" : "annotation-close",
+ "schemaDefs" : theDefinitions,
+ "testFile" : theTestFile
+} ) ;
+
+</script>
+</head>
+<body>
+<p>Fill the textarea below with JSON output from your annotation client
+implementation that supports the following criteria:</p>
+<div id="testDescription"></div>
+<form name="annotation" id="annotation">
+ <textarea name="annotation-input" id="annotation-input" style="width: 90%; height: 10em" ></textarea>
+ <p><input type="button" id="annotation-run" name="Loading..." value="Loading...">
+ <input style="display: none" type="button" id="annotation-close"
+ name="Close" value="Close"></p>
+</form>
+<p>Specifically, the following assertions will be evaluated:</p>
+<div id="assertion"></div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/pageMusts.test b/tests/wpt/web-platform-tests/annotation-model/collections/pages/pageMusts.test
new file mode 100644
index 00000000000..38722d75d26
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/pageMusts.test
@@ -0,0 +1,24 @@
+{
+ "@context": "https://www.w3.org/ns/JSONtest-v1.jsonld",
+ "name": "A single Annotation Page has all required keys and all page keys present meet required value constraints",
+ "description": "Pages of Web Annotations: <ul> <li>MUST include certain properties (keys)</li> <li>MUST satisfy model constraints on values of required and any optional Annotation keys used</li> </ul> Note: Implementation of optional Annotation Collection keys (features), optional constraints on key values, and optional keys and constraints on Agents involved in an Annotation Collection checked by other tests.<br/><b>Please fill textarea with json-ld serialization of a single Annotation Page or an Annotation Collection with an embedded Page</b>",
+ "testType": "manual",
+ "ref": "https://www.w3.org/TR/annotation-model/",
+ "assertions": [
+ "collections/pages/5.2-pageContextValidated.json",
+ "collections/pages/5.2-pageIdValidated.json",
+ "collections/pages/5.2-pageTypeValidated.json",
+ "collections/pages/5.2-pageItemsValidated.json",
+ "collections/pages/5.2-pageStartIndexValidated.json",
+ "collections/pages/5.2-pagePartOfValidated.json",
+ "collections/pages/5.2-pageNextValidated.json",
+ "collections/pages/5.2-pagePrevValidated.json",
+ "collections/pages/5.2-pageTotalValidated.json",
+ "collections/pages/5.2-pageLabelValidated.json",
+ "collections/pages/5.2-pageFirstValidated.json",
+ "collections/pages/5.2-pageLastValidated.json",
+ "collections/pages/3.3.1-pageCreatedValidated.json",
+ "collections/pages/3.3.1-pageModifiedValidated.json",
+ "collections/pages/3.3.6-pageRightsValidated.json"
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/pageOptionals-manual.html b/tests/wpt/web-platform-tests/annotation-model/collections/pages/pageOptionals-manual.html
new file mode 100644
index 00000000000..e68f2d17c65
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/pageOptionals-manual.html
@@ -0,0 +1,49 @@
+<!doctype html>
+<html>
+<head>
+<title>A single Annotation Page implements optional keys and meets optional key value constraints</title>
+<link rel="stylesheet" href="/resources/testharness.css">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/annotation-model/scripts/ajv.min.js"></script>
+<script src="/annotation-model/scripts/showdown.min.js"></script>
+<script src="/annotation-model/scripts/JSONtest.js"></script>
+<script>
+setup({explicit_timeout: true, explicit_done: true });
+
+var theDefinitions=[
+ "definitions/choiceSet.json",
+ "definitions/id.json",
+ "definitions/bodyTarget.json",
+ "definitions/annotations.json",
+ "definitions/specificResource.json",
+ "definitions/otherProperties.json",
+ "definitions/collections.json"
+];
+
+var theTestFile="pageOptionals.test";
+
+var runningTest = new JSONtest( {
+ "testInput" : "annotation-input",
+ "runTest" : "annotation-run",
+ "closeWindow" : "annotation-close",
+ "schemaDefs" : theDefinitions,
+ "testFile" : theTestFile
+} ) ;
+
+</script>
+</head>
+<body>
+<p>Fill the textarea below with JSON output from your annotation client
+implementation that supports the following criteria:</p>
+<div id="testDescription"></div>
+<form name="annotation" id="annotation">
+ <textarea name="annotation-input" id="annotation-input" style="width: 90%; height: 10em" ></textarea>
+ <p><input type="button" id="annotation-run" name="Loading..." value="Loading...">
+ <input style="display: none" type="button" id="annotation-close"
+ name="Close" value="Close"></p>
+</form>
+<p>Specifically, the following assertions will be evaluated:</p>
+<div id="assertion"></div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/annotation-model/collections/pages/pageOptionals.test b/tests/wpt/web-platform-tests/annotation-model/collections/pages/pageOptionals.test
new file mode 100644
index 00000000000..2d53d6550c7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/collections/pages/pageOptionals.test
@@ -0,0 +1,28 @@
+{
+ "@context": "https://www.w3.org/ns/JSONtest-v1.jsonld",
+ "name": "A single Annotation Page implements optional keys and meets optional key value constraints",
+ "description": "Pages of Web Annotations: <ul> <li>MUST include certain properties (keys)</li> <li>MUST satisfy model constraints on values of required and any optional Annotation keys used</li> </ul> Note: Implementation of optional Annotation Collection keys (features), optional constraints on key values, and optional keys and constraints on Agents involved in an Annotation Collection checked by other tests.<br/><b>Please fill textarea with json-ld serialization of a single Annotation Page or an Annotation Collection with an embedded Page</b>",
+ "testType": "manual",
+ "ref": "https://www.w3.org/TR/annotation-model/",
+ "assertions": [
+ "collections/pages/5.2-pagePartOfImplemented.json",
+ "collections/pages/5.2-pageStartIndexImplemented.json",
+ "collections/pages/5.2-pageNextImplemented.json",
+ "collections/pages/5.2-pagePrevImplemented.json",
+ "collections/pages/5.2-pageLabelImplemented.json",
+ "collections/pages/5.2-pageLastImplemented.json",
+ "collections/pages/5.2-pageTotalImplemented.json",
+ "collections/pages/5.2-pageFirstImplemented.json",
+ "collections/pages/3.3.1-pageModifiedImplemented.json",
+ "collections/pages/3.3.1-pageCreatorImplemented.json",
+ "collections/pages/3.3.1-pageCreatedImplemented.json",
+ "collections/pages/3.3.6-pageRightsImplemented.json",
+ "collections/pages/3.3.2-pageCreatorAgentEmail_sha1Implemented.json",
+ "collections/pages/3.3.2-pageCreatorAgentEmailImplemented.json",
+ "collections/pages/3.3.2-pageCreatorAgentHomepageImplemented.json",
+ "collections/pages/3.3.2-pageCreatorAgentIdImplemented.json",
+ "collections/pages/3.3.2-pageCreatorAgentNameImplemented.json",
+ "collections/pages/3.3.2-pageCreatorAgentNicknameImplemented.json",
+ "collections/pages/3.3.2-pageCreatorAgentTypeImplemented.json"
+ ]
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/definitions/bodyTarget.json b/tests/wpt/web-platform-tests/annotation-model/definitions/bodyTarget.json
index 65af961f681..b51c0461f9c 100644
--- a/tests/wpt/web-platform-tests/annotation-model/definitions/bodyTarget.json
+++ b/tests/wpt/web-platform-tests/annotation-model/definitions/bodyTarget.json
@@ -9,13 +9,12 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "Definition: External Web Resource",
- "description": "True when the object is an External Web Resource, i.e., includes an id that is of format uri but does not contain value (Textual Body) or source (Specific Resource) keys (Sections 3.2.1, 3.2.4, 4).",
+ "description": "True when the object is an External Web Resource, i.e., includes an id that is of format uri but does not contain source (Specific Resource) keys (Sections 3.2.1, 3.2.4, 4).",
"type": "object",
"allOf": [ {"$ref": "id.json#/definitions/idValueFound"} ],
"not":
{ "anyOf":
[
- { "required": ["value"] },
{ "required": ["source"] },
{ "required": ["target"] }
]
@@ -26,23 +25,23 @@
{
"type": "object",
"properties":
- {
- "source": {"$ref": "#/definitions/externalWebResourceDetected"}
- }
+ {
+ "source": {"$ref": "#/definitions/externalWebResourceDetected"}
+ }
},
"itemEwrDetected":
{
"type": "object",
"properties":
- {
- "items": {
- "type": "array",
- "minItems": 1,
- "not":
- { "items": {"not": { "$ref": "#/definitions/externalWebResourceDetected" } } }
+ {
+ "items": {
+ "type": "array",
+ "minItems": 1,
+ "not":
+ { "items": {"not": { "$ref": "#/definitions/externalWebResourceDetected" } } }
+ }
}
- }
},
"textualBodyFound" :
@@ -65,14 +64,14 @@
{
"type": "object",
"properties":
- {
- "items": {
- "type": "array",
- "minItems": 1,
- "not":
- { "items": {"not": { "$ref": "#/definitions/textualBodyFound" } } }
+ {
+ "items": {
+ "type": "array",
+ "minItems": 1,
+ "not":
+ { "items": {"not": { "$ref": "#/definitions/textualBodyFound" } } }
+ }
}
- }
},
"targetResourcesFound" :
@@ -98,15 +97,15 @@
"title": "Definition: Resources that can be used as Body",
"description": "True when the string is format uri or the object is recognized as a valid body resource (Sections 3.2 and 4).",
"type" : ["string", "object"],
- "oneOf": [
+ "anyOf": [
{"$ref": "id.json#/definitions/stringUri"},
{"$ref": "choiceSet.json#/definitions/choiceDetected" },
{"$ref": "choiceSet.json#/definitions/compositeDetected" },
- {"$ref": "choiceSet.json#/definitions/independentsDetected" },
- {"$ref": "choiceSet.json#/definitions/listDetected" },
- {"$ref": "specificResource.json#/definitions/specificeResourceDetected" },
- {"$ref": "#/definitions/externalWebResourceDetected" },
- {"$ref": "#/definitions/textualBodyFound" }
+ {"$ref": "choiceSet.json#/definitions/independentsDetected" },
+ {"$ref": "choiceSet.json#/definitions/listDetected" },
+ {"$ref": "specificResource.json#/definitions/specificeResourceDetected" },
+ {"$ref": "#/definitions/externalWebResourceDetected" },
+ {"$ref": "#/definitions/textualBodyFound" }
]
},
@@ -297,16 +296,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/recognizedTypeFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/recognizedTypeFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -319,12 +318,12 @@
"type": "object",
"properties":
{
- "source":
- {
- "type": "object",
- "required": ["type"] ,
- "$ref": "#/definitions/resourceTypeRecognizedIfPresent"
- }
+ "source":
+ {
+ "type": "object",
+ "required": ["type"] ,
+ "$ref": "#/definitions/resourceTypeRecognizedIfPresent"
+ }
},
"required": ["source"]
},
@@ -408,16 +407,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/formatPropertyFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/formatPropertyFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -430,12 +429,12 @@
"type": "object",
"properties":
{
- "source":
- {
- "type": "object",
- "required": ["format"] ,
- "$ref": "#/definitions/formatValidIfPresent"
- }
+ "source":
+ {
+ "type": "object",
+ "required": ["format"] ,
+ "$ref": "#/definitions/formatValidIfPresent"
+ }
},
"required": ["source"]
},
@@ -466,16 +465,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/singleFormatPropertyFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/singleFormatPropertyFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -488,12 +487,12 @@
"type": "object",
"properties":
{
- "source":
- {
- "type": "object",
- "required": ["format"] ,
- "$ref": "#/definitions/formatSingularIfPresent"
- }
+ "source":
+ {
+ "type": "object",
+ "required": ["format"] ,
+ "$ref": "#/definitions/formatSingularIfPresent"
+ }
},
"required": ["source"]
},
@@ -582,16 +581,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/languagePropertyFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/languagePropertyFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -604,12 +603,12 @@
"type": "object",
"properties":
{
- "source":
- {
- "type": "object",
- "required": ["language"] ,
- "$ref": "#/definitions/languageValidIfPresent"
- }
+ "source":
+ {
+ "type": "object",
+ "required": ["language"] ,
+ "$ref": "#/definitions/languageValidIfPresent"
+ }
},
"required": ["source"]
},
@@ -640,16 +639,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/singleLanguagePropertyFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/singleLanguagePropertyFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -662,12 +661,12 @@
"type": "object",
"properties":
{
- "source":
- {
- "type": "object",
- "required": ["language"] ,
- "$ref": "#/definitions/languageSingularIfPresent"
- }
+ "source":
+ {
+ "type": "object",
+ "required": ["language"] ,
+ "$ref": "#/definitions/languageSingularIfPresent"
+ }
},
"required": ["source"]
},
@@ -720,16 +719,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/processingLanguagePropertyFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/processingLanguagePropertyFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -742,12 +741,12 @@
"type": "object",
"properties":
{
- "source":
- {
- "type": "object",
- "required": ["processingLanguage"] ,
- "$ref": "#/definitions/processingLanguageValidIfPresent"
- }
+ "source":
+ {
+ "type": "object",
+ "required": ["processingLanguage"] ,
+ "$ref": "#/definitions/processingLanguageValidIfPresent"
+ }
},
"required": ["source"]
},
@@ -802,16 +801,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/textDirectionPropertyFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/textDirectionPropertyFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -824,12 +823,12 @@
"type": "object",
"properties":
{
- "source":
- {
- "type": "object",
- "required": ["textDirection"] ,
- "$ref": "#/definitions/textDirectionValidIfPresent"
- }
+ "source":
+ {
+ "type": "object",
+ "required": ["textDirection"] ,
+ "$ref": "#/definitions/textDirectionValidIfPresent"
+ }
},
"required": ["source"]
},
@@ -848,9 +847,9 @@
{
"type": "object",
"properties":
- {
- "source": {"$ref": "#/definitions/ewrWithItems"}
- },
+ {
+ "source": {"$ref": "#/definitions/ewrWithItems"}
+ },
"required": ["source"]
},
@@ -858,14 +857,14 @@
{
"type": "object",
"properties":
- {
- "items": {
- "type": "array",
- "minItems": 1,
- "not":
- { "items": {"not": { "$ref": "#/definitions/ewrWithItems" } } }
- }
- },
+ {
+ "items": {
+ "type": "array",
+ "minItems": 1,
+ "not":
+ { "items": {"not": { "$ref": "#/definitions/ewrWithItems" } } }
+ }
+ },
"required": ["items"]
},
@@ -882,9 +881,9 @@
{
"type": "object",
"properties":
- {
- "source": {"$ref": "#/definitions/ewrWithPurpose"}
- },
+ {
+ "source": {"$ref": "#/definitions/ewrWithPurpose"}
+ },
"required": ["source"]
},
@@ -892,14 +891,14 @@
{
"type": "object",
"properties":
- {
- "items": {
- "type": "array",
- "minItems": 1,
- "not":
- { "items": {"not": { "$ref": "#/definitions/ewrWithPurpose" } } }
- }
- },
+ {
+ "items": {
+ "type": "array",
+ "minItems": 1,
+ "not":
+ { "items": {"not": { "$ref": "#/definitions/ewrWithPurpose" } } }
+ }
+ },
"required": ["items"]
},
@@ -916,14 +915,14 @@
{
"type": "object",
"properties":
- {
- "items": {
- "type": "array",
- "minItems": 1,
- "not":
- { "items": {"not": { "$ref": "#/definitions/embeddedTextualBodyWithItems" } } }
- }
- },
+ {
+ "items": {
+ "type": "array",
+ "minItems": 1,
+ "not":
+ { "items": {"not": { "$ref": "#/definitions/embeddedTextualBodyWithItems" } } }
+ }
+ },
"required": ["items"]
},
@@ -940,109 +939,158 @@
{
"type": "object",
"properties":
- {
- "items": {
- "type": "array",
- "minItems": 1,
- "not":
- { "items": {"not": { "$ref": "#/definitions/embeddedTextualBodyWithSource" } } }
- }
- },
+ {
+ "items": {
+ "type": "array",
+ "minItems": 1,
+ "not":
+ { "items": {"not": { "$ref": "#/definitions/embeddedTextualBodyWithSource" } } }
+ }
+ },
"required": ["items"]
},
"embeddedTextTypeIncludesTextualBody":
{
- "allOf":
+ "allOf":
[
- { "$ref": "#/definitions/textualBodyFound" },
- { "required": ["type"] },
- { "properties":
- {
- "type":
- {
- "oneOf":
- [
- { "type": "string",
- "enum": ["TextualBody"] },
- { "type": "array",
- "minItems": 1,
- "not":
- { "items":
- { "not": { "enum": [ "TextualBody"] } }
- }
- }
- ]
- }
+ { "$ref": "#/definitions/textualBodyFound" },
+ { "required": ["type"] },
+ { "properties":
+ {
+ "type":
+ {
+ "oneOf":
+ [
+ { "type": "string",
+ "enum": ["TextualBody"] },
+ { "type": "array",
+ "minItems": 1,
+ "not":
+ { "items":
+ { "not": { "enum": [ "TextualBody"] } }
+ }
+ }
+ ]
+ }
+ }
}
- }
- ]
+ ]
+ },
+
+ "embeddedTextTypeInclTextualBodyWithoutId":
+ {
+ "allOf":
+ [
+ { "$ref": "#/definitions/textualBodyFound" },
+ { "required": ["type"] },
+ { "properties":
+ {
+ "type":
+ {
+ "oneOf":
+ [
+ { "type": "string",
+ "enum": ["TextualBody"] },
+ { "type": "array",
+ "minItems": 1,
+ "not":
+ { "items":
+ { "not": { "enum": [ "TextualBody"] } }
+ }
+ }
+ ]
+ }
+ }
+ },
+ { "not": { "$ref": "id.json#/definitions/idValueFound" } }
+ ]
},
"itemEmbeddedTextTypeIncludesTextualBody":
{
- "type": "object",
- "properties":
- {
- "items":
+ "type": "object",
+ "properties":
{
- "type": "array",
- "minItems": 1,
- "not":
- {
- "items":
- { "not": { "$ref": "#/definitions/embeddedTextTypeIncludesTextualBody" } }
- }
- }
- },
- "required": ["items"]
+ "items":
+ {
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/embeddedTextTypeIncludesTextualBody" } }
+ }
+ }
+ },
+ "required": ["items"]
},
- "embeddedTextTypeIncludesText":
+ "itemEmbeddedTextTypeInclTextualBodyWithoutId":
{
- "allOf":
+ "type": "object",
+ "properties":
+ {
+ "items":
+ {
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/embeddedTextTypeIncludesTextualBody" } }
+ }
+ }
+ },
+ "required": ["items"],
+ "not": { "$ref": "id.json#/definitions/idValueFound" }
+ },
+
+"embeddedTextTypeIncludesText":
+ {
+ "allOf":
[
- { "$ref": "#/definitions/textualBodyFound" },
- { "required": ["type"] },
- { "properties":
- {
- "type":
+ { "$ref": "#/definitions/textualBodyFound" },
+ { "required": ["type"] },
+ { "properties":
{
- "oneOf":
- [
- { "type": "string",
- "enum": ["Text"] },
- { "type": "array",
- "minItems": 1,
- "not":
- { "items":
- { "not": { "enum": [ "Text"] } }
- }
- }
- ]
+ "type":
+ {
+ "oneOf":
+ [
+ { "type": "string",
+ "enum": ["Text"] },
+ { "type": "array",
+ "minItems": 1,
+ "not":
+ { "items":
+ { "not": { "enum": [ "Text"] } }
+ }
+ }
+ ]
+ }
}
}
- }
- ]
+ ]
},
"itemEmbeddedTextTypeIncludesText":
{
- "type": "object",
- "properties":
- {
- "items":
+ "type": "object",
+ "properties":
{
- "type": "array",
- "minItems": 1,
- "not":
- {
- "items":
- { "not": { "$ref": "#/definitions/embeddedTextTypeIncludesText" } }
- }
- }
- },
- "required": ["items"]
+ "items":
+ {
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/embeddedTextTypeIncludesText" } }
+ }
+ }
+ },
+ "required": ["items"]
}
}
diff --git a/tests/wpt/web-platform-tests/annotation-model/definitions/choiceSet.json b/tests/wpt/web-platform-tests/annotation-model/definitions/choiceSet.json
index ffe21a0f0e0..89c2ebdc74c 100644
--- a/tests/wpt/web-platform-tests/annotation-model/definitions/choiceSet.json
+++ b/tests/wpt/web-platform-tests/annotation-model/definitions/choiceSet.json
@@ -21,14 +21,14 @@
"items": {
"oneOf":
[
- { "$ref": "specificResource.json#/definitions/specificeResourceDetected" },
- { "$ref": "bodyTarget.json#/definitions/externalWebResourceDetected" },
- { "$ref": "bodyTarget.json#/definitions/textualBodyFound" },
+ { "$ref": "specificResource.json#/definitions/specificeResourceDetected" },
+ { "$ref": "bodyTarget.json#/definitions/externalWebResourceDetected" },
+ { "$ref": "bodyTarget.json#/definitions/textualBodyFound" },
{ "$ref": "id.json#/definitions/stringUri" },
{ "allOf":
[
- { "$ref" : "#/definitions/choiceOrSetTypeDefinition" },
- { "$ref": "#/definitions/itemsDetected" }
+ { "$ref" : "#/definitions/choiceOrSetTypeDefinition" },
+ { "$ref": "#/definitions/itemsDetected" }
]
}
]
@@ -108,19 +108,19 @@
"choiceOrSetTypeDefinition":
{
- "$schema": "http://json-schema.org/draft-04/schema#",
- "title": "Definition: Choice or Set type",
- "description": "True when object has type key and object's type is any of 'Choice', 'Composite', 'List', 'Independents' (Section 3.2.7)",
- "type": "object",
- "properties":
- {
- "type":
- {
- "type": "string",
- "enum": ["Choice", "Composite", "List", "Independents"]
- }
- },
- "required": [ "type" ]
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Definition: Choice or Set type",
+ "description": "True when object has type key and object's type is any of 'Choice', 'Composite', 'List', 'Independents' (Section 3.2.7)",
+ "type": "object",
+ "properties":
+ {
+ "type":
+ {
+ "type": "string",
+ "enum": ["Choice", "Composite", "List", "Independents"]
+ }
+ },
+ "required": [ "type" ]
},
"choiceDetected": {
@@ -178,36 +178,36 @@
"type": "object",
"allOf":
[
- { "$ref": "#/definitions/choiceOrSetTypeDefinition" },
- { "$ref": "#/definitions/itemsDetected" }
+ { "$ref": "#/definitions/choiceOrSetTypeDefinition" },
+ { "$ref": "#/definitions/itemsDetected" }
]
},
"choiceSetWithValue" :
{
- "allOf":
- [
- { "$ref": "#/definitions/choiceOrSetDetected" },
- { "required": [ "value" ] }
- ]
+ "allOf":
+ [
+ { "$ref": "#/definitions/choiceOrSetDetected" },
+ { "required": [ "value" ] }
+ ]
},
"choiceSetWithSource" :
{
- "allOf":
- [
- { "$ref": "#/definitions/choiceOrSetDetected" },
- { "required": [ "source" ] }
- ]
+ "allOf":
+ [
+ { "$ref": "#/definitions/choiceOrSetDetected" },
+ { "required": [ "source" ] }
+ ]
},
"choiceSetWithPurpose" :
{
- "allOf":
- [
- { "$ref": "#/definitions/choiceOrSetDetected" },
- { "required": [ "purpose" ] }
- ]
+ "allOf":
+ [
+ { "$ref": "#/definitions/choiceOrSetDetected" },
+ { "required": [ "purpose" ] }
+ ]
}
}
diff --git a/tests/wpt/web-platform-tests/annotation-model/definitions/collections.json b/tests/wpt/web-platform-tests/annotation-model/definitions/collections.json
new file mode 100644
index 00000000000..9f5b13a9f83
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-model/definitions/collections.json
@@ -0,0 +1,428 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "id": "collections.json",
+ "title": "Definitions: Annotation Collections.",
+ "description": "Schemas in #/definitions detect or validate keys/objects (direct children) uniquely used to describe Annotation Collections (Section 5.1 and 5.2).",
+ "definitions": {
+
+ "contextValueFound": {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Definition: Valid @context string included in Collection / Page description",
+ "description": "True when the string has value http://www.w3.org/ns/anno.jsonld (Section 5)",
+ "type": "string",
+ "enum": [ "http://www.w3.org/ns/anno.jsonld" ]
+ },
+
+ "contextValueInArrayFound": {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Definition: Valid @context string found in array included in Collection / Page description",
+ "description": "True when the array contains a string item having value http://www.w3.org/ns/anno.jsonld (Section 5)",
+ "type": "array",
+ "not":
+ { "items":
+ { "not":
+ { "$ref": "#/definitions/contextValueFound" }
+ }
+ }
+ },
+
+ "annotationCollectionTypeValueRecognized": {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Definition: Valid AnnotationCollection type value string included in Collection description",
+ "description": "True when the string has value 'AnnotationCollection' (Section 5.1)",
+ "type": "string",
+ "enum": [ "AnnotationCollection" ]
+ },
+
+ "annotationCollectionTypeValueInArrayRecognized": {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Definition: Valid AnnotationCollection type in array included in Collection description",
+ "description": "True when the array contains a string item having value 'AnnotationCollection' (Section 5.1)",
+ "type": "array",
+ "not":
+ { "items":
+ { "not":
+ { "$ref": "#/definitions/annotationCollectionTypeValueRecognized" }
+ }
+ }
+ },
+
+ "annotationCollectionTypeValueFound":
+ {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Implementation: AnnotationCollection type",
+ "description": "True when the Annotation Collection has type key and 'AnnotationCollection' is a value of type (Section 5.1)",
+ "type": "object",
+ "required": [ "type" ],
+ "properties": {
+ "type": {
+ "oneOf": [
+ { "$ref": "#/definitions/annotationCollectionTypeValueRecognized" },
+ { "$ref": "#/definitions/annotationCollectionTypeValueInArrayRecognized" }
+ ]
+ }
+ }
+ },
+
+ "annotationPageTypeValueRecognized": {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Definition: Valid AnnotationPage type value string included in Page description",
+ "description": "True when the string has value 'AnnotationPage' (Section 5.2)",
+ "type": "string",
+ "enum": [ "AnnotationPage" ]
+ },
+
+ "annotationPageTypeValueInArrayRecognized": {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Definition: Valid AnnotationPage type in array included in Page description",
+ "description": "True when the array contains a string item having value 'AnnotationPage' (Section 5.2)",
+ "type": "array",
+ "not":
+ { "items":
+ { "not":
+ { "$ref": "#/definitions/annotationPageTypeValueRecognized" }
+ }
+ }
+ },
+
+ "annotationPageTypeValueFound":
+ {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Implementation: AnnotationPage type",
+ "description": "True when the Annotation Page has type key and 'AnnotationPage' is a value of type (Section 5.2)",
+ "type": "object",
+ "required": [ "type" ],
+ "properties": {
+ "type": {
+ "oneOf": [
+ { "$ref": "#/definitions/annotationPageTypeValueRecognized" },
+ { "$ref": "#/definitions/annotationPageTypeValueInArrayRecognized" }
+ ]
+ }
+ }
+ },
+
+ "labelDefinition":
+ {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Definition: label (Annotation Collections)",
+ "description": "True when the object has no label or has one or more label values of type string (Section 5.1)",
+ "type": "object",
+ "properties":
+ {
+ "label":
+ {
+ "oneOf":
+ [
+ {"type": "string" },
+ {"type": "array",
+ "minItems": 1,
+ "items": {"type": "string"}
+ }
+ ]
+ }
+ }
+ },
+
+ "labelFound":
+ {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Check for implementation of Annotation Collection label",
+ "description": "True when the object has one or more label value(s) (Section 5.1)",
+ "allOf": [
+ {"required": ["label"]},
+ {"$ref": "#/definitions/labelDefinition"}
+ ]
+ },
+
+ "totalDefinition":
+ {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Definition: total (Annotation Collections)",
+ "description": "True when the object has no total key or has exactly one total value of type integer greater or equal to zero (Section 5.1)",
+ "type": "object",
+ "properties":
+ {
+ "total":
+ {
+ "oneOf":
+ [
+ {"type": "integer",
+ "minimum": 0 },
+ {"type": "array",
+ "minItems": 1,
+ "maxItems": 1,
+ "items": {"type": "integer",
+ "minimum": 0 }
+ }
+ ]
+ }
+ }
+ },
+
+ "totalFound":
+ {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Check for implementation of Annotation Collection total key",
+ "description": "True when the object has exactly one total value (Section 5.1)",
+ "allOf": [
+ {"required": ["total"]},
+ {"$ref": "#/definitions/totalDefinition"}
+ ]
+ },
+
+ "totalMoreThanZero":
+ {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Definition: total more than zero (Annotation Collections)",
+ "description": "True when the object has exactly one total value of type integer and greater than zero (Section 5.1)",
+ "type": "object",
+ "properties":
+ {
+ "total":
+ {
+ "oneOf":
+ [
+ {"type": "integer",
+ "minimum": 0,
+ "exclusiveMinimum": true},
+ {"type": "array",
+ "minItems": 1,
+ "maxItems": 1,
+ "items": {"type": "integer",
+ "minimum": 0,
+ "exclusiveMinimum": true}
+ }
+ ]
+ }
+ },
+ "required": [ "total" ]
+ },
+
+ "firstValidIfPresent":
+ { "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Validation: first value (Annotation Collection)",
+ "description": "True when the Annotation Collection has no first key or has 1 first key value that is string of format uri or has first key value that is an object of type AnnotationPage (Section 5.1)",
+ "type": "object",
+ "properties": {"first":
+ { "oneOf": [
+ {
+ "oneOf": [
+ { "$ref": "id.json#/definitions/stringUri" },
+ { "$ref": "#/definitions/annotationPageTypeValueFound" }
+ ]
+ },
+ { "type": "array",
+ "minItems": 1,
+ "maxItems": 1,
+ "items": {
+ "oneOf": [
+ { "$ref": "id.json#/definitions/stringUri" },
+ { "$ref": "#/definitions/annotationPageTypeValueFound" }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ },
+
+ "firstFound":
+ {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Check for implementation of Annotation Collection first key",
+ "description": "True when the object has exactly one first value (Section 5.1)",
+ "allOf": [
+ {"required": ["first"]},
+ {"$ref": "#/definitions/firstValidIfPresent"}
+ ]
+ },
+
+ "firstRequiredIfTotalMoreThanZero":
+ {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "If total greater than zero, check for implementation of Annotation Collection first key",
+ "description": "True when the object has no total or has total = zero or has exactly one first value (Section 5.1)",
+ "type": "object",
+ "oneOf": [
+ {
+ "allOf": [
+ { "$ref": "#/definitions/totalMoreThanZero" },
+ { "$ref": "#/definitions/firstFound" }
+ ]
+ },
+ { "not": { "$ref": "#/definitions/totalMoreThanZero" } }
+ ]
+ },
+
+ "lastValidIfPresent":
+ { "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Validation: last value (Annotation Collection)",
+ "description": "True when the Annotation Collection has no last key or has 1 last key value that is string of format uri (Section 5.1)",
+ "type": "object",
+ "properties": {"last":
+ { "oneOf": [
+ { "$ref": "id.json#/definitions/stringUri" },
+ { "type": "array",
+ "minItems": 1,
+ "maxItems": 1,
+ "items": { "$ref": "id.json#/definitions/stringUri" }
+ }
+ ]
+ }
+ }
+ },
+
+ "lastFound":
+ {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Check for implementation of Annotation Collection last key",
+ "description": "True when the object has exactly one last value that is string of format uri (Section 5.1)",
+ "allOf": [
+ {"required": ["last"]},
+ {"$ref": "#/definitions/lastValidIfPresent"}
+ ]
+ },
+
+ "partOfValidIfPresent":
+ { "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Validation: partOf value (Annotation Page)",
+ "description": "True when the Annotation Page has no partOf key or has 1 partOf key value that is string of format uri (Section 5.2)",
+ "type": "object",
+ "properties": {"partOf":
+ { "oneOf": [
+ { "$ref": "id.json#/definitions/arraySingleStringUri" },
+ { "$ref": "id.json#/definitions/idValueFound" }
+ ]
+ }
+ }
+ },
+
+ "partOfFound":
+ {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Check for implementation of Annotation Page partOf key",
+ "description": "True when the object has exactly one partOf value that is string of format uri (Section 5.2)",
+ "allOf": [
+ {"required": ["partOf"]},
+ {"$ref": "#/definitions/partOfValidIfPresent"}
+ ]
+ },
+
+ "nextValidIfPresent":
+ { "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Validation: next value (Annotation Page)",
+ "description": "True when the Annotation Page has no next key or has 1 next key value that is string of format uri (Section 5.2)",
+ "type": "object",
+ "properties": {"next":
+ { "oneOf": [
+ { "$ref": "id.json#/definitions/stringUri" },
+ { "type": "array",
+ "minItems": 1,
+ "maxItems": 1,
+ "items": { "$ref": "id.json#/definitions/stringUri" }
+ }
+ ]
+ }
+ }
+ },
+
+ "nextFound":
+ {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Check for implementation of Annotation Page next key",
+ "description": "True when the object has exactly one next value that is string of format uri (Section 5.2)",
+ "allOf": [
+ {"required": ["next"]},
+ {"$ref": "#/definitions/nextValidIfPresent"}
+ ]
+ },
+
+ "prevValidIfPresent":
+ { "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Validation: prev value (Annotation Page)",
+ "description": "True when the Annotation Page has no prev key or has 1 prev key value that is string of format uri (Section 5.2)",
+ "type": "object",
+ "properties": {"prev":
+ { "oneOf": [
+ { "$ref": "id.json#/definitions/stringUri" },
+ { "type": "array",
+ "minItems": 1,
+ "maxItems": 1,
+ "items": { "$ref": "id.json#/definitions/stringUri" }
+ }
+ ]
+ }
+ }
+ },
+
+ "prevFound":
+ {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Check for implementation of Annotation Page prev key",
+ "description": "True when the object has exactly one prev value that is string of format uri (Section 5.2)",
+ "allOf": [
+ {"required": ["prev"]},
+ {"$ref": "#/definitions/prevValidIfPresent"}
+ ]
+ },
+
+ "startIndexDefinition":
+ {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Definition: startIndex (Annotation Pages)",
+ "description": "True when the object has no startIndex key or has exactly one startIndex value of type integer greater or equal to zero (Section 5.2)",
+ "type": "object",
+ "properties":
+ {
+ "startIndex":
+ {
+ "oneOf":
+ [
+ {"type": "integer",
+ "minimum": 0 },
+ {"type": "array",
+ "minItems": 1,
+ "maxItems": 1,
+ "items": {"type": "integer",
+ "minimum": 0 }
+ }
+ ]
+ }
+ }
+ },
+
+ "startIndexFound":
+ {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Check for implementation of Annotation Page startIndex key",
+ "description": "True when the object has exactly one startIndex value (Section 5.2)",
+ "allOf": [
+ {"required": ["startIndex"]},
+ {"$ref": "#/definitions/startIndexDefinition"}
+ ]
+ },
+
+ "itemsFound":
+ {
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Check for implementation of Annotation Page items key",
+ "description": "True when the object has items key with value that is an array of strings of format uri and/or objects of type Annotation (Section 5.2)",
+ "type": "object",
+ "properties":
+ { "items":
+ { "type": "array",
+ "items": {
+ "oneOf":[
+ { "$ref": "annotations.json#/definitions/annotationTypeValueFound" },
+ { "type": "string",
+ "format": "uri" }
+ ]
+ }
+ }
+ },
+ "required": [ "items" ]
+ }
+
+ }
+}
diff --git a/tests/wpt/web-platform-tests/annotation-model/definitions/otherProperties.json b/tests/wpt/web-platform-tests/annotation-model/definitions/otherProperties.json
index 0cf42525cb4..faa2231f302 100644
--- a/tests/wpt/web-platform-tests/annotation-model/definitions/otherProperties.json
+++ b/tests/wpt/web-platform-tests/annotation-model/definitions/otherProperties.json
@@ -51,16 +51,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/createdPropertyFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/createdPropertyFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -73,12 +73,12 @@
"type": "object",
"properties":
{
- "source":
- {
- "type": "object",
- "required": ["created"] ,
- "$ref": "#/definitions/createdValidIfPresent"
- }
+ "source":
+ {
+ "type": "object",
+ "required": ["created"] ,
+ "$ref": "#/definitions/createdValidIfPresent"
+ }
},
"required": ["source"]
},
@@ -110,7 +110,7 @@
"title": "Collate: generated key with qualifying body/target classes",
"description": "Supports implementation check of generated (if/when) used on External Web Resources, Specific Resources, Textual Body Resources (Sections 3.2.1-6, 3.3)",
"oneOf": [
- {"$ref": "annotations.json#/definitions/annotationTypeValueFound"}
+ {"$ref": "annotations.json#/definitions/annotationTypeValueFound"}
],
"allOf": [
{"$ref": "#/definitions/generatedValidIfPresent"},
@@ -164,16 +164,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/modifiedPropertyFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/modifiedPropertyFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -186,12 +186,12 @@
"type": "object",
"properties":
{
- "source":
- {
- "type": "object",
- "required": ["modified"] ,
- "$ref": "#/definitions/modifiedValidIfPresent"
- }
+ "source":
+ {
+ "type": "object",
+ "required": ["modified"] ,
+ "$ref": "#/definitions/modifiedValidIfPresent"
+ }
},
"required": ["source"]
},
@@ -269,16 +269,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/creatorPropertyFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/creatorPropertyFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -291,12 +291,12 @@
"type": "object",
"properties":
{
- "source":
- {
- "type": "object",
- "required": ["creator"] ,
- "$ref": "#/definitions/creatorValidIfPresent"
- }
+ "source":
+ {
+ "type": "object",
+ "required": ["creator"] ,
+ "$ref": "#/definitions/creatorValidIfPresent"
+ }
},
"required": ["source"]
},
@@ -325,16 +325,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/singleCreatorPropertyFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/singleCreatorPropertyFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -347,12 +347,12 @@
"type": "object",
"properties":
{
- "source":
- {
- "type": "object",
- "required": ["creator"] ,
- "$ref": "#/definitions/creatorSingularIfPresent"
- }
+ "source":
+ {
+ "type": "object",
+ "required": ["creator"] ,
+ "$ref": "#/definitions/creatorSingularIfPresent"
+ }
},
"required": ["source"]
},
@@ -386,7 +386,7 @@
"title": "Collate: generator key with qualifying body/target classes",
"description": "Supports implementation check of generator (if/when) used on External Web Resources, Specific Resources, Textual Body Resources (Section 3.3.1)",
"oneOf": [
- {"$ref": "annotations.json#/definitions/annotationTypeValueFound"}
+ {"$ref": "annotations.json#/definitions/annotationTypeValueFound"}
],
"allOf": [
{"required": ["generator"]},
@@ -474,16 +474,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/audiencePropertyFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/audiencePropertyFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -496,12 +496,12 @@
"type": "object",
"properties":
{
- "source":
- {
- "type": "object",
- "required": ["audience"] ,
- "$ref": "#/definitions/audienceValidIfPresent"
- }
+ "source":
+ {
+ "type": "object",
+ "required": ["audience"] ,
+ "$ref": "#/definitions/audienceValidIfPresent"
+ }
},
"required": ["source"]
},
@@ -551,16 +551,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/accessibilityPropertyFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/accessibilityPropertyFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -573,12 +573,12 @@
"type": "object",
"properties":
{
- "source":
- {
- "type": "object",
- "required": ["accessibility"] ,
- "$ref": "#/definitions/accessibilityValidIfPresent"
- }
+ "source":
+ {
+ "type": "object",
+ "required": ["accessibility"] ,
+ "$ref": "#/definitions/accessibilityValidIfPresent"
+ }
},
"required": ["source"]
},
@@ -623,16 +623,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/rightsPropertyFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/rightsPropertyFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -645,12 +645,12 @@
"type": "object",
"properties":
{
- "source":
- {
- "type": "object",
- "required": ["rights"] ,
- "$ref": "#/definitions/rightsValidIfPresent"
- }
+ "source":
+ {
+ "type": "object",
+ "required": ["rights"] ,
+ "$ref": "#/definitions/rightsValidIfPresent"
+ }
},
"required": ["source"]
},
@@ -689,16 +689,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/canonicalPropertyFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/canonicalPropertyFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -711,12 +711,12 @@
"type": "object",
"properties":
{
- "source":
- {
- "type": "object",
- "required": ["canonical"] ,
- "$ref": "#/definitions/canonicalValidIfPresent"
- }
+ "source":
+ {
+ "type": "object",
+ "required": ["canonical"] ,
+ "$ref": "#/definitions/canonicalValidIfPresent"
+ }
},
"required": ["source"]
},
@@ -761,16 +761,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/viaPropertyFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/viaPropertyFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -783,12 +783,12 @@
"type": "object",
"properties":
{
- "source":
- {
- "type": "object",
- "required": ["via"] ,
- "$ref": "#/definitions/viaValidIfPresent"
- }
+ "source":
+ {
+ "type": "object",
+ "required": ["via"] ,
+ "$ref": "#/definitions/viaValidIfPresent"
+ }
},
"required": ["source"]
},
@@ -831,16 +831,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/purposePropertyFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/purposePropertyFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -866,11 +866,11 @@
"sourceCreatorAgentWithIdFound":
{ "type": "object",
"properties":
- {
- "source":
- { "$ref": "#/definitions/creatorAgentWithIdFound" }
- },
- "required": ["source"]
+ {
+ "source":
+ { "$ref": "#/definitions/creatorAgentWithIdFound" }
+ },
+ "required": ["source"]
},
"itemCreatorAgentWithIdFound":
@@ -878,16 +878,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/creatorAgentWithIdFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/creatorAgentWithIdFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -954,11 +954,11 @@
"sourceCreatorAgentWithTypeFound":
{ "type": "object",
"properties":
- {
- "source":
- { "$ref": "#/definitions/creatorAgentWithTypeFound" }
- },
- "required": ["source"]
+ {
+ "source":
+ { "$ref": "#/definitions/creatorAgentWithTypeFound" }
+ },
+ "required": ["source"]
},
"itemCreatorAgentWithTypeFound":
@@ -966,16 +966,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/creatorAgentWithTypeFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/creatorAgentWithTypeFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -1057,11 +1057,11 @@
"sourceCreatorAgentWithNameFound":
{ "type": "object",
"properties":
- {
- "source":
- { "$ref": "#/definitions/creatorAgentWithNameFound" }
- },
- "required": ["source"]
+ {
+ "source":
+ { "$ref": "#/definitions/creatorAgentWithNameFound" }
+ },
+ "required": ["source"]
},
"itemCreatorAgentWithNameFound":
@@ -1069,16 +1069,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/creatorAgentWithNameFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/creatorAgentWithNameFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -1115,11 +1115,11 @@
"sourceCreatorAgentWithSingularNameFound":
{ "type": "object",
"properties":
- {
- "source":
- { "$ref": "#/definitions/creatorAgentWithSingularNameFound" }
- },
- "required": ["source"]
+ {
+ "source":
+ { "$ref": "#/definitions/creatorAgentWithSingularNameFound" }
+ },
+ "required": ["source"]
},
"itemCreatorAgentWithSingularNameFound":
@@ -1127,16 +1127,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/creatorAgentWithSingularNameFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/creatorAgentWithSingularNameFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -1196,11 +1196,11 @@
"sourceCreatorAgentWithSingularNicknameFound":
{ "type": "object",
"properties":
- {
- "source":
- { "$ref": "#/definitions/creatorAgentWithSingularNicknameFound" }
- },
- "required": ["source"]
+ {
+ "source":
+ { "$ref": "#/definitions/creatorAgentWithSingularNicknameFound" }
+ },
+ "required": ["source"]
},
"itemCreatorAgentWithSingularNicknameFound":
@@ -1208,16 +1208,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/creatorAgentWithSingularNicknameFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/creatorAgentWithSingularNicknameFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -1280,11 +1280,11 @@
"sourceCreatorAgentWithEmailFound":
{ "type": "object",
"properties":
- {
- "source":
- { "$ref": "#/definitions/creatorAgentWithEmailFound" }
- },
- "required": ["source"]
+ {
+ "source":
+ { "$ref": "#/definitions/creatorAgentWithEmailFound" }
+ },
+ "required": ["source"]
},
"itemCreatorAgentWithEmailFound":
@@ -1292,16 +1292,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/creatorAgentWithEmailFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/creatorAgentWithEmailFound" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -1360,11 +1360,11 @@
"sourceCreatorAgentWithEmail_sha1Found":
{ "type": "object",
"properties":
- {
- "source":
- { "$ref": "#/definitions/creatorAgentWithEmail_sha1Found" }
- },
- "required": ["source"]
+ {
+ "source":
+ { "$ref": "#/definitions/creatorAgentWithEmail_sha1Found" }
+ },
+ "required": ["source"]
},
"itemCreatorAgentWithEmail_sha1Found":
@@ -1372,16 +1372,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/creatorAgentWithEmail_sha1Found" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/creatorAgentWithEmail_sha1Found" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -1442,11 +1442,11 @@
"sourceCreatorAgentWithHomepageFound":
{ "type": "object",
"properties":
- {
- "source":
- { "$ref": "#/definitions/creatorAgentWithHomepageFound" }
- },
- "required": ["source"]
+ {
+ "source":
+ { "$ref": "#/definitions/creatorAgentWithHomepageFound" }
+ },
+ "required": ["source"]
},
"itemCreatorAgentWithHomepageFound":
@@ -1454,16 +1454,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/creatorAgentWithHomepageFound" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/creatorAgentWithHomepageFound" } }
+ }
}
- }
},
"required": ["items"]
}
diff --git a/tests/wpt/web-platform-tests/annotation-model/definitions/specificResource.json b/tests/wpt/web-platform-tests/annotation-model/definitions/specificResource.json
index c3d97541efd..b830f68bd2d 100644
--- a/tests/wpt/web-platform-tests/annotation-model/definitions/specificResource.json
+++ b/tests/wpt/web-platform-tests/annotation-model/definitions/specificResource.json
@@ -16,8 +16,8 @@
{
"type": ["string", "object" ],
"oneOf": [
- { "$ref": "id.json#/definitions/stringUri" },
- { "$ref": "bodyTarget.json#/definitions/externalWebResourceDetected"}
+ { "$ref": "id.json#/definitions/stringUri" },
+ { "$ref": "bodyTarget.json#/definitions/externalWebResourceDetected"}
]
}
},
@@ -29,14 +29,14 @@
"title": "Detection: Specific Resource",
"description": "True when object has exactly 1 source value and at least one of purpose, selector, state, styleClass, renderedVia, scope (Section 4)",
"type": "object",
- "$ref": "#/definitions/sourceDetected",
+ "$ref": "#/definitions/sourceDetected",
"anyOf": [
- { "$ref": "otherProperties.json#/definitions/purposeRecognizedIfPresent", "required": ["purpose"] },
- { "$ref": "#/definitions/selectorDetected" },
- { "$ref": "#/definitions/stateDetected" },
+ { "$ref": "otherProperties.json#/definitions/purposeRecognizedIfPresent", "required": ["purpose"] },
+ { "$ref": "#/definitions/selectorDetected" },
+ { "$ref": "#/definitions/stateDetected" },
{ "$ref": "#/definitions/styleClassDetected" },
{ "$ref": "#/definitions/renderedViaDetected" },
- { "$ref": "#/definitions/scopeDetected" }
+ { "$ref": "#/definitions/scopeDetected" }
]
},
@@ -47,16 +47,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/specificeResourceDetected" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/specificeResourceDetected" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -77,11 +77,11 @@
{"$ref": "id.json#/definitions/idValueFound"},
{"$ref": "#/definitions/fragmentSelectorDetected"},
{"$ref": "#/definitions/cssSelectorDetected"},
- {"$ref": "#/definitions/xpathSelectorDetected"},
+ {"$ref": "#/definitions/xpathSelectorDetected"},
{"$ref": "#/definitions/textQuoteSelectorDetected"},
- {"$ref": "#/definitions/textPositionSelectorDetected"},
+ {"$ref": "#/definitions/textPositionSelectorDetected"},
{"$ref": "#/definitions/dataPositionSelectorDetected"},
- {"$ref": "#/definitions/rangeSelectorDetected"},
+ {"$ref": "#/definitions/rangeSelectorDetected"},
{"$ref": "#/definitions/svgSelectorDetected"}
]
},
@@ -96,11 +96,11 @@
{"$ref": "id.json#/definitions/idValueFound"},
{"$ref": "#/definitions/fragmentSelectorDetected"},
{"$ref": "#/definitions/cssSelectorDetected"},
- {"$ref": "#/definitions/xpathSelectorDetected"},
+ {"$ref": "#/definitions/xpathSelectorDetected"},
{"$ref": "#/definitions/textQuoteSelectorDetected"},
- {"$ref": "#/definitions/textPositionSelectorDetected"},
+ {"$ref": "#/definitions/textPositionSelectorDetected"},
{"$ref": "#/definitions/dataPositionSelectorDetected"},
- {"$ref": "#/definitions/rangeSelectorDetected"},
+ {"$ref": "#/definitions/rangeSelectorDetected"},
{"$ref": "#/definitions/svgSelectorDetected"}
]
}
@@ -114,23 +114,23 @@
"itemSelectorValidIfPresent":
{
- "description": "True if ALL items in the items array of object tested have no selector, or have a selector that is uri, or have a selector that has recognized value(s)",
- "type": "object",
- "properties":
- {
- "items":
- { "type": "array",
- "minItems": 1,
- "items":
- {
- "oneOf":
- [
- { "$ref": "id.json#/definitions/stringUri" },
- { "$ref": "#/definitions/selectorDefined" }
- ]
- }
+ "description": "True if ALL items in the items array of object tested have no selector, or have a selector that is uri, or have a selector that has recognized value(s)",
+ "type": "object",
+ "properties":
+ {
+ "items":
+ { "type": "array",
+ "minItems": 1,
+ "items":
+ {
+ "oneOf":
+ [
+ { "$ref": "id.json#/definitions/stringUri" },
+ { "$ref": "#/definitions/selectorDefined" }
+ ]
+ }
+ }
}
- }
},
"selectorDetected":
@@ -138,7 +138,7 @@
"title": "Detection: selector type",
"description": "True when object tested has selector(s) that is(are) recognized as being one or more of the selectors described in the model (Section 4.2)",
"type": "object",
- "$ref": "#/definitions/selectorDefined",
+ "$ref": "#/definitions/selectorDefined",
"required": ["selector"]
},
@@ -146,9 +146,9 @@
{
"type": "object",
"properties":
- {
- "type": { "type": "string", "enum": ["FragmentSelector"] }
- },
+ {
+ "type": { "type": "string", "enum": ["FragmentSelector"] }
+ },
"required": ["type"]
},
@@ -157,7 +157,7 @@
"title": "Detection: fragment selector",
"description": "True when object is a fragment selelctor (Section 4.2.1)",
"allOf":
- [
+ [
{ "$ref": "#/definitions/fragmentSelectorTypeDetected"},
{
"type": "object",
@@ -168,7 +168,7 @@
},
"required": ["value"]
}
- ]
+ ]
},
"conformsToPropertyFound":
@@ -177,20 +177,20 @@
"description": "True when object is a fragment selelctor with a conformsTo key (Section 4.2.1)",
"type": "object",
"allOf":
- [
+ [
{ "$ref": "#/definitions/fragmentSelectorDetected"},
{ "required": ["conformsTo"] }
- ]
+ ]
},
"fragmentSelectorTypeValidIfPresent":
{
- "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
- "oneOf":
- [
- { "not": { "$ref": "#/definitions/fragmentSelectorTypeDetected" } },
- { "$ref": "#/definitions/fragmentSelectorDetected" }
- ]
+ "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
+ "oneOf":
+ [
+ { "not": { "$ref": "#/definitions/fragmentSelectorTypeDetected" } },
+ { "$ref": "#/definitions/fragmentSelectorDetected" }
+ ]
},
"cssSelectorTypeDetected":
@@ -208,7 +208,7 @@
"title": "Detection: CssSelector selector",
"description": "True when object is a CssSelector selelctor (Section 4.2.2)",
"allOf":
- [
+ [
{ "$ref": "#/definitions/cssSelectorTypeDetected" },
{
"type": "object",
@@ -218,17 +218,17 @@
},
"required": ["value"]
}
- ]
+ ]
},
"cssSelectorTypeValidIfPresent":
{
- "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
- "oneOf":
- [
- { "not": { "$ref": "#/definitions/cssSelectorTypeDetected" } },
- { "$ref": "#/definitions/cssSelectorDetected" }
- ]
+ "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
+ "oneOf":
+ [
+ { "not": { "$ref": "#/definitions/cssSelectorTypeDetected" } },
+ { "$ref": "#/definitions/cssSelectorDetected" }
+ ]
},
"xpathSelectorTypeDetected":
@@ -246,7 +246,7 @@
"title": "Detection: XPath selector",
"description": "True when object is a XPath selelctor (Section 4.2.3)",
"allOf":
- [
+ [
{ "$ref": "#/definitions/xpathSelectorTypeDetected" },
{
"type": "object",
@@ -256,18 +256,18 @@
},
"required": ["value"]
}
- ]
+ ]
},
"xpathSelectorTypeValidIfPresent":
{
- "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
- "oneOf":
- [
- { "not": { "$ref": "#/definitions/xpathSelectorTypeDetected" } },
- { "$ref": "#/definitions/xpathSelectorDetected" }
- ]
+ "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
+ "oneOf":
+ [
+ { "not": { "$ref": "#/definitions/xpathSelectorTypeDetected" } },
+ { "$ref": "#/definitions/xpathSelectorDetected" }
+ ]
},
"textQuoteSelectorTypeDetected":
@@ -285,7 +285,7 @@
"title": "Detection: text quote selector",
"description": "True when object is a text quote selelctor (Section 4.2.4)",
"allOf":
- [
+ [
{ "$ref": "#/definitions/textQuoteSelectorTypeDetected" },
{
"type": "object",
@@ -297,7 +297,7 @@
},
"required": ["exact"]
}
- ]
+ ]
},
"prefixPropertyFound":
@@ -306,10 +306,10 @@
"description": "True when object is a text quote selelctor with a prefix key (Section 4.2.4)",
"type": "object",
"allOf":
- [
+ [
{ "$ref": "#/definitions/textQuoteSelectorDetected"},
{ "required": ["prefix"] }
- ]
+ ]
},
"suffixPropertyFound":
@@ -318,20 +318,20 @@
"description": "True when object is a text quote selelctor with a suffix key (Section 4.2.4)",
"type": "object",
"allOf":
- [
+ [
{ "$ref": "#/definitions/textQuoteSelectorDetected"},
{ "required": ["suffix"] }
- ]
+ ]
},
"textQuoteSelectorTypeValidIfPresent":
{
- "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
- "oneOf":
- [
- { "not": { "$ref": "#/definitions/textQuoteSelectorTypeDetected" } },
- { "$ref": "#/definitions/textQuoteSelectorDetected" }
- ]
+ "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
+ "oneOf":
+ [
+ { "not": { "$ref": "#/definitions/textQuoteSelectorTypeDetected" } },
+ { "$ref": "#/definitions/textQuoteSelectorDetected" }
+ ]
},
"textPositionSelectorTypeDetected":
@@ -349,28 +349,28 @@
"title": "Definition: text position selector",
"description": "True when object is a text position selelctor (Section 4.2.5)",
"allOf":
- [
- { "$ref": "#/definitions/textPositionSelectorTypeDetected" },
- {
- "type": "object",
- "properties":
- {
- "start": { "type": "integer", "minimum": 0 },
- "end": { "type": "integer","minimum": 0 }
- },
- "required": ["start", "end"]
- }
- ]
+ [
+ { "$ref": "#/definitions/textPositionSelectorTypeDetected" },
+ {
+ "type": "object",
+ "properties":
+ {
+ "start": { "type": "integer", "minimum": 0 },
+ "end": { "type": "integer","minimum": 0 }
+ },
+ "required": ["start", "end"]
+ }
+ ]
},
"textPositionSelectorTypeValidIfPresent":
{
- "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
- "oneOf":
- [
- { "not": { "$ref": "#/definitions/textPositionSelectorTypeDetected" } },
- { "$ref": "#/definitions/textPositionSelectorDetected" }
- ]
+ "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
+ "oneOf":
+ [
+ { "not": { "$ref": "#/definitions/textPositionSelectorTypeDetected" } },
+ { "$ref": "#/definitions/textPositionSelectorDetected" }
+ ]
},
"dataPositionSelectorTypeDetected":
@@ -378,7 +378,7 @@
"type": "object",
"properties":
{
- "type": { "type": "string", "enum": ["DataPositionSelector"] }
+ "type": { "type": "string", "enum": ["DataPositionSelector"] }
},
"required": ["type"]
},
@@ -388,28 +388,28 @@
"title": "Definition: data position selector",
"description": "True when object is a data position selelctor (Section 4.2.5)",
"allOf":
- [
- { "$ref": "#/definitions/dataPositionSelectorTypeDetected" },
- {
- "type": "object",
- "properties":
- {
- "start": { "type": "integer", "minimum": 0 },
- "end": { "type": "integer","minimum": 0 }
- },
- "required": ["start", "end"]
- }
- ]
+ [
+ { "$ref": "#/definitions/dataPositionSelectorTypeDetected" },
+ {
+ "type": "object",
+ "properties":
+ {
+ "start": { "type": "integer", "minimum": 0 },
+ "end": { "type": "integer","minimum": 0 }
+ },
+ "required": ["start", "end"]
+ }
+ ]
},
"dataPositionSelectorTypeValidIfPresent":
{
- "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
- "oneOf":
- [
- { "not": { "$ref": "#/definitions/dataPositionSelectorTypeDetected" } },
- { "$ref": "#/definitions/dataPositionSelectorDetected" }
- ]
+ "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
+ "oneOf":
+ [
+ { "not": { "$ref": "#/definitions/dataPositionSelectorTypeDetected" } },
+ { "$ref": "#/definitions/dataPositionSelectorDetected" }
+ ]
},
"svgSelectorTypeDetected":
@@ -417,7 +417,7 @@
"type": "object",
"properties":
{
- "type": { "type": "string", "enum": ["SvgSelector"] }
+ "type": { "type": "string", "enum": ["SvgSelector"] }
},
"required": ["type"]
},
@@ -427,7 +427,7 @@
"title": "Detection: svg selector",
"description": "True when object is a svg selelctor (Section 4.2.7)",
"allOf":
- [
+ [
{ "$ref": "#/definitions/svgSelectorTypeDetected" },
{
"type": "object",
@@ -437,21 +437,21 @@
"id": { "$ref": "id.json#/definitions/arraySingleStringUri" }
},
"oneOf": [
- {"required": ["value"] },
- {"required": ["id"] }
+ {"required": ["value"] },
+ {"required": ["id"] }
]
}
- ]
+ ]
},
"svgSelectorTypeValidIfPresent":
{
- "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
- "oneOf":
- [
- { "not": { "$ref": "#/definitions/svgSelectorTypeDetected" } },
- { "$ref": "#/definitions/svgSelectorDetected" }
- ]
+ "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
+ "oneOf":
+ [
+ { "not": { "$ref": "#/definitions/svgSelectorTypeDetected" } },
+ { "$ref": "#/definitions/svgSelectorDetected" }
+ ]
},
"rangeSelectorTypeDetected":
@@ -469,7 +469,7 @@
"title": "Detection: range selector",
"description": "True when object is a range selelctor (Section 4.2.9)",
"allOf":
- [
+ [
{ "$ref": "#/definitions/rangeSelectorTypeDetected" },
{
"type": "object",
@@ -478,13 +478,13 @@
"^(startSelector|endSelector)$":
{ "type": "object",
"oneOf": [
- {"$ref": "#/definitions/fragmentSelectorDetected"},
- {"$ref": "#/definitions/cssSelectorDetected"},
- {"$ref": "#/definitions/xpathSelectorDetected"},
+ {"$ref": "#/definitions/fragmentSelectorDetected"},
+ {"$ref": "#/definitions/cssSelectorDetected"},
+ {"$ref": "#/definitions/xpathSelectorDetected"},
{"$ref": "#/definitions/textQuoteSelectorDetected"},
{"$ref": "#/definitions/textPositionSelectorDetected"},
- {"$ref": "#/definitions/dataPositionSelectorDetected"},
- {"$ref": "#/definitions/svgSelectorDetected"}
+ {"$ref": "#/definitions/dataPositionSelectorDetected"},
+ {"$ref": "#/definitions/svgSelectorDetected"}
]
}
},
@@ -495,12 +495,12 @@
"rangeSelectorTypeValidIfPresent":
{
- "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
- "oneOf":
- [
- { "not": { "$ref": "#/definitions/rangeSelectorTypeDetected" } },
- { "$ref": "#/definitions/rangeSelectorDetected" }
- ]
+ "description": "True if Selector Type not detected (i.e., not present), or if both Type and Selector detected (i.e., Selector constraints met); note, Selector cannot be detected if Selector Type not detected.",
+ "oneOf":
+ [
+ { "not": { "$ref": "#/definitions/rangeSelectorTypeDetected" } },
+ { "$ref": "#/definitions/rangeSelectorDetected" }
+ ]
},
"stateDefined" :
@@ -513,30 +513,30 @@
"state":
{
"oneOf": [
- { "$ref": "id.json#/definitions/stringUri" },
- { "type": "object",
- "anyOf": [
- {"$ref": "id.json#/definitions/idValueFound"},
- {"$ref": "#/definitions/timeStateDetected"},
- {"$ref": "#/definitions/requestHeaderStateDetected"}
- ]
- },
- {
- "type": "array",
- "minItems": 1,
- "items":
- { "oneOf": [
- { "$ref": "id.json#/definitions/stringUri" },
- { "type": "object",
- "anyOf": [
+ { "$ref": "id.json#/definitions/stringUri" },
+ { "type": "object",
+ "anyOf": [
{"$ref": "id.json#/definitions/idValueFound"},
{"$ref": "#/definitions/timeStateDetected"},
{"$ref": "#/definitions/requestHeaderStateDetected"}
+ ]
+ },
+ {
+ "type": "array",
+ "minItems": 1,
+ "items":
+ { "oneOf": [
+ { "$ref": "id.json#/definitions/stringUri" },
+ { "type": "object",
+ "anyOf": [
+ {"$ref": "id.json#/definitions/idValueFound"},
+ {"$ref": "#/definitions/timeStateDetected"},
+ {"$ref": "#/definitions/requestHeaderStateDetected"}
+ ]
+ }
]
}
- ]
}
- }
]
}
}
@@ -544,23 +544,23 @@
"itemStateValidIfPresent":
{
- "description": "True if ALL items in the items array of object tested have no state, or have a state that is uri, or have a state that has recognized value(s)",
- "type": "object",
- "properties":
- {
- "items":
- { "type": "array",
- "minItems": 1,
- "items":
- {
- "oneOf":
- [
- { "$ref": "id.json#/definitions/stringUri" },
- { "$ref": "#/definitions/stateDefined" }
- ]
- }
+ "description": "True if ALL items in the items array of object tested have no state, or have a state that is uri, or have a state that has recognized value(s)",
+ "type": "object",
+ "properties":
+ {
+ "items":
+ { "type": "array",
+ "minItems": 1,
+ "items":
+ {
+ "oneOf":
+ [
+ { "$ref": "id.json#/definitions/stringUri" },
+ { "$ref": "#/definitions/stateDefined" }
+ ]
+ }
+ }
}
- }
},
"stateDetected":
@@ -568,7 +568,7 @@
"title": "Detection: state type",
"description": "True when object tested has state(s) that is(are) recognized as being one or more of the states described in the model (Section 4.3)",
"type": "object",
- "$ref": "#/definitions/stateDefined",
+ "$ref": "#/definitions/stateDefined",
"required": ["state"]
},
@@ -587,34 +587,34 @@
"title": "Detection: time state",
"description": "True when object is a time state (Section 4.3.1)",
"allOf":
- [
+ [
{ "$ref": "#/definitions/timeStateTypeDetected" },
{
"type": "object",
"properties":
{
- "sourceDate":
- { "oneOf": [
- { "type": "string",
- "format": "date-time"},
- { "type": "array",
- "minItems": 1,
- "items":
- {"type": "string", "format": "date-time"}
- }
- ]
- },
- "sourceDateStart": { "type": "string", "format": "date-time"},
- "sourceDateEnd": { "type": "string", "format": "date-time"},
- "cached": { "type": "string", "format": "uri"}
+ "sourceDate":
+ { "oneOf": [
+ { "type": "string",
+ "format": "date-time"},
+ { "type": "array",
+ "minItems": 1,
+ "items":
+ {"type": "string", "format": "date-time"}
+ }
+ ]
+ },
+ "sourceDateStart": { "type": "string", "format": "date-time"},
+ "sourceDateEnd": { "type": "string", "format": "date-time"},
+ "cached": { "type": "string", "format": "uri"}
},
"oneOf":
- [
- { "required": ["sourceDate"] },
- { "required": ["sourceDateStart", "sourceDateEnd"] }
- ],
+ [
+ { "required": ["sourceDate"] },
+ { "required": ["sourceDateStart", "sourceDateEnd"] }
+ ],
"not":
- { "required": [ "sourceDate", "sourceDateStart", "sourceDateEnd" ] }
+ { "required": [ "sourceDate", "sourceDateStart", "sourceDateEnd" ] }
}
]
},
@@ -625,20 +625,20 @@
"description": "True when object is a time state with a cached key (Section 4.3.1)",
"type": "object",
"allOf":
- [
+ [
{ "$ref": "#/definitions/timeStateDetected"},
{ "required": ["cached"] }
- ]
+ ]
},
"timeStateTypeValidIfPresent":
{
- "description": "True if State Type not detected (i.e., not present), or if both Type and State detected (i.e., State constraints met); note, State cannot be detected if State Type not detected.",
- "oneOf":
- [
- { "not": { "$ref": "#/definitions/timeStateTypeDetected" } },
- { "$ref": "#/definitions/timeStateDetected" }
- ]
+ "description": "True if State Type not detected (i.e., not present), or if both Type and State detected (i.e., State constraints met); note, State cannot be detected if State Type not detected.",
+ "oneOf":
+ [
+ { "not": { "$ref": "#/definitions/timeStateTypeDetected" } },
+ { "$ref": "#/definitions/timeStateDetected" }
+ ]
},
"requestHeaderStateTypeDetected":
@@ -656,27 +656,27 @@
"title": "Detection: request header state",
"description": "True when object is a request header state (Section 4.3.2)",
"allOf":
- [
+ [
{ "$ref": "#/definitions/requestHeaderStateTypeDetected" },
{
"type": "object",
"properties":
{
- "value": { "type": "string"}
+ "value": { "type": "string"}
},
"required": ["value"]
}
- ]
+ ]
},
"requestHeaderStateTypeValidIfPresent":
{
- "description": "True if State Type not detected (i.e., not present), or if both Type and State detected (i.e., State constraints met); note, State cannot be detected if State Type not detected.",
- "oneOf":
- [
- { "not": { "$ref": "#/definitions/requestHeaderStateTypeDetected" } },
- { "$ref": "#/definitions/requestHeaderStateDetected" }
- ]
+ "description": "True if State Type not detected (i.e., not present), or if both Type and State detected (i.e., State constraints met); note, State cannot be detected if State Type not detected.",
+ "oneOf":
+ [
+ { "not": { "$ref": "#/definitions/requestHeaderStateTypeDetected" } },
+ { "$ref": "#/definitions/requestHeaderStateDetected" }
+ ]
},
"refinedByDefined":
@@ -695,14 +695,14 @@
{"$ref": "id.json#/definitions/idValueFound"},
{"$ref": "#/definitions/fragmentSelectorDetected"},
{"$ref": "#/definitions/cssSelectorDetected"},
- {"$ref": "#/definitions/xpathSelectorDetected"},
+ {"$ref": "#/definitions/xpathSelectorDetected"},
{"$ref": "#/definitions/textQuoteSelectorDetected"},
- {"$ref": "#/definitions/textPositionSelectorDetected"},
+ {"$ref": "#/definitions/textPositionSelectorDetected"},
{"$ref": "#/definitions/dataPositionSelectorDetected"},
- {"$ref": "#/definitions/rangeSelectorDetected"},
+ {"$ref": "#/definitions/rangeSelectorDetected"},
{"$ref": "#/definitions/svgSelectorDetected"},
- {"$ref": "#/definitions/timeStateDetected"},
- {"$ref": "#/definitions/requestHeaderStateDetected"}
+ {"$ref": "#/definitions/timeStateDetected"},
+ {"$ref": "#/definitions/requestHeaderStateDetected"}
]
},
{
@@ -716,14 +716,14 @@
{"$ref": "id.json#/definitions/idValueFound"},
{"$ref": "#/definitions/fragmentSelectorDetected"},
{"$ref": "#/definitions/cssSelectorDetected"},
- {"$ref": "#/definitions/xpathSelectorDetected"},
+ {"$ref": "#/definitions/xpathSelectorDetected"},
{"$ref": "#/definitions/textQuoteSelectorDetected"},
- {"$ref": "#/definitions/textPositionSelectorDetected"},
+ {"$ref": "#/definitions/textPositionSelectorDetected"},
{"$ref": "#/definitions/dataPositionSelectorDetected"},
- {"$ref": "#/definitions/rangeSelectorDetected"},
+ {"$ref": "#/definitions/rangeSelectorDetected"},
{"$ref": "#/definitions/svgSelectorDetected"},
- {"$ref": "#/definitions/timeStateDetected"},
- {"$ref": "#/definitions/requestHeaderStateDetected"}
+ {"$ref": "#/definitions/timeStateDetected"},
+ {"$ref": "#/definitions/requestHeaderStateDetected"}
]
}
]
@@ -736,51 +736,51 @@
"checkForRefinedBy":
{
- "description": "True if no state or selector, if no refinedBy, or if correct refinedBy",
- "type": "object",
- "patternProperties":
- {
- "^(state|selector)$":
+ "description": "True if no state or selector, if no refinedBy, or if correct refinedBy",
+ "type": "object",
+ "patternProperties":
+ {
+ "^(state|selector)$":
{"oneOf":
- [
- { "$ref": "id.json#/definitions/stringUri" },
- { "type": "object",
- "$ref": "#/definitions/refinedByDefined" },
- { "type": "array",
- "minItems": 1,
- "items":
- {"oneOf":
- [
- { "$ref": "id.json#/definitions/stringUri" },
- { "type": "object",
- "$ref": "#/definitions/refinedByDefined" }
- ]
- }
- }
- ]
- }
+ [
+ { "$ref": "id.json#/definitions/stringUri" },
+ { "type": "object",
+ "$ref": "#/definitions/refinedByDefined" },
+ { "type": "array",
+ "minItems": 1,
+ "items":
+ {"oneOf":
+ [
+ { "$ref": "id.json#/definitions/stringUri" },
+ { "type": "object",
+ "$ref": "#/definitions/refinedByDefined" }
+ ]
+ }
+ }
+ ]
+ }
}
},
"itemRefinedByValidIfPresent":
{
- "description": "True if items in the items array of object tested have no refinedBy, or have a refinedBy that is uri, or have a refinedBy that has recognized value(s)",
- "type": "object",
- "properties":
- {
- "items":
- { "type": "array",
- "minItems": 1,
- "items":
- {
- "oneOf":
- [
- { "$ref": "id.json#/definitions/stringUri" },
- { "$ref": "#/definitions/checkForRefinedBy" }
- ]
- }
+ "description": "True if items in the items array of object tested have no refinedBy, or have a refinedBy that is uri, or have a refinedBy that has recognized value(s)",
+ "type": "object",
+ "properties":
+ {
+ "items":
+ { "type": "array",
+ "minItems": 1,
+ "items":
+ {
+ "oneOf":
+ [
+ { "$ref": "id.json#/definitions/stringUri" },
+ { "$ref": "#/definitions/checkForRefinedBy" }
+ ]
+ }
+ }
}
- }
},
"refinedByDetected":
@@ -789,22 +789,22 @@
"description": "True when object tested has selector or state that has refinedBy(s) that is(are) recognized as being one or more of the refinedBys described in the model (Section 4.2)",
"type": "object",
"anyOf":
- [
- { "properties":
- { "state" : { "$ref ": "#/definitions/refinedByWithinStateSelector" } },
- "required": ["state"]
- },
- { "properties":
- { "selector" : { "$ref ": "#/definitions/refinedByWithinStateSelector" } },
- "required": ["selector"]
- }
- ]
+ [
+ { "properties":
+ { "state" : { "$ref ": "#/definitions/refinedByWithinStateSelector" } },
+ "required": ["state"]
+ },
+ { "properties":
+ { "selector" : { "$ref ": "#/definitions/refinedByWithinStateSelector" } },
+ "required": ["selector"]
+ }
+ ]
},
"refinedByWithinStateSelector":
{
- "oneOf":
- [
+ "oneOf":
+ [
{ "type": "object",
"$ref": "#/definitions/refinedByDefined",
"required": ["refinedBy"]
@@ -813,16 +813,16 @@
"minItems": 1,
"not":
{
- "items":
+ "items":
{"not":
- { "type": "object",
- "$ref": "#/definitions/refinedByDefined",
- "required": ["refinedBy"]
- }
+ { "type": "object",
+ "$ref": "#/definitions/refinedByDefined",
+ "required": ["refinedBy"]
+ }
}
}
}
- ]
+ ]
},
"styleClassDefinition":
@@ -830,22 +830,22 @@
"title": "Definition: styleClass property value",
"description": "True when the object has no styleClass property or has a styleClass property that appears with source and that is a string value or array of string values (Section 4.4)",
"properties":
- {
- "styleClass":
- {
- "oneOf":
- [
- { "type": "string" },
- { "type": "array",
- "minItems": 1,
- "items": { "type": "string" } }
- ]
- }
- },
- "dependencies":
- {
- "styleClass": ["source"]
- }
+ {
+ "styleClass":
+ {
+ "oneOf":
+ [
+ { "type": "string" },
+ { "type": "array",
+ "minItems": 1,
+ "items": { "type": "string" } }
+ ]
+ }
+ },
+ "dependencies":
+ {
+ "styleClass": ["source"]
+ }
},
"styleClassDetected":
@@ -854,8 +854,8 @@
"description": "Supports implementation check of styleClass (if/when) used on Specific Resources (Sections 4.4)",
"type": "object",
"allOf": [
- { "$ref": "#/definitions/styleClassDefinition" },
- { "required": ["styleClass"] }
+ { "$ref": "#/definitions/styleClassDefinition" },
+ { "required": ["styleClass"] }
]
},
@@ -867,16 +867,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/styleClassDetected" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/styleClassDetected" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -914,9 +914,9 @@
"title": "Collate: renderedVia key with qualifying body/target classes",
"description": "Supports implementation check of renderedVia (if/when) used on Specific Resources (Sections 4.4)",
"allOf": [
- { "$ref": "#/definitions/sourceDetected" },
- { "required": ["renderedVia"] },
- { "$ref": "#/definitions/renderedViaDefinition" }
+ { "$ref": "#/definitions/sourceDetected" },
+ { "required": ["renderedVia"] },
+ { "$ref": "#/definitions/renderedViaDefinition" }
]
},
@@ -928,16 +928,16 @@
"type": "object",
"properties":
{
- "items":
- {
- "type": "array",
- "minItems": 1,
- "not":
+ "items":
{
- "items":
- { "not": { "$ref": "#/definitions/renderedViaDetected" } }
+ "type": "array",
+ "minItems": 1,
+ "not":
+ {
+ "items":
+ { "not": { "$ref": "#/definitions/renderedViaDetected" } }
+ }
}
- }
},
"required": ["items"]
},
@@ -966,164 +966,163 @@
{ "$schema": "http://json-schema.org/draft-04/schema#",
"title": "Collate: scope key with qualifying body/target classes",
"description": "Supports implementation check of scope (if/when) used on Specific Resource Body (Sections 4.6)",
- "$ref": "#/definitions/sourceDetected",
"allOf": [
- {"required": ["scope"]},
- {"$ref": "#/definitions/scopeDefinition"}
+ {"required": ["scope"]},
+ {"$ref": "#/definitions/scopeDefinition"}
]
},
- "sourceWithCreated":
- {
- "description": "True if no source, or source is uri, or source is object that does not have created key, or if source is object that has only 1 created key of date-time format",
- "type": "object",
- "properties":
- {
- "source":
+ "sourceWithCreated":
{
- "oneOf":
- [
- { "$ref": "id.json#/definitions/arraySingleStringUri" },
- { "$ref": "otherProperties.json#/definitions/createdValidIfPresent" }
- ]
- }
- }
- },
+ "description": "True if no source, or source is uri, or source is object that does not have created key, or if source is object that has only 1 created key of date-time format",
+ "type": "object",
+ "properties":
+ {
+ "source":
+ {
+ "oneOf":
+ [
+ { "$ref": "id.json#/definitions/arraySingleStringUri" },
+ { "$ref": "otherProperties.json#/definitions/createdValidIfPresent" }
+ ]
+ }
+ }
+ },
- "sourceWithModified":
- {
- "description": "True if no source, or source is uri, or source is object that does not have modified key, or if source is object that has only 1 modified key of date-time format",
- "type": "object",
- "properties":
- {
- "source":
+ "sourceWithModified":
{
- "oneOf":
- [
- { "$ref": "id.json#/definitions/arraySingleStringUri" },
- { "$ref": "otherProperties.json#/definitions/modifiedValidIfPresent" }
- ]
- }
- }
- },
+ "description": "True if no source, or source is uri, or source is object that does not have modified key, or if source is object that has only 1 modified key of date-time format",
+ "type": "object",
+ "properties":
+ {
+ "source":
+ {
+ "oneOf":
+ [
+ { "$ref": "id.json#/definitions/arraySingleStringUri" },
+ { "$ref": "otherProperties.json#/definitions/modifiedValidIfPresent" }
+ ]
+ }
+ }
+ },
- "sourceWithRights":
- {
- "description": "True if no source, or source is uri, or source is object that does not have rights key, or if source is object that has rights key with all values of uri format",
- "type": "object",
- "properties":
- {
- "source":
+ "sourceWithRights":
{
- "oneOf":
- [
- { "$ref": "id.json#/definitions/arraySingleStringUri" },
- { "$ref": "otherProperties.json#/definitions/rightsValidIfPresent" }
- ]
- }
- }
- },
+ "description": "True if no source, or source is uri, or source is object that does not have rights key, or if source is object that has rights key with all values of uri format",
+ "type": "object",
+ "properties":
+ {
+ "source":
+ {
+ "oneOf":
+ [
+ { "$ref": "id.json#/definitions/arraySingleStringUri" },
+ { "$ref": "otherProperties.json#/definitions/rightsValidIfPresent" }
+ ]
+ }
+ }
+ },
- "sourceWithCanonical":
- {
- "description": "True if no source, or source is uri, or source is object that does not have canonical key, or if source is object that has only 1 canonical key of uri format",
- "type": "object",
- "properties":
- {
- "source":
+ "sourceWithCanonical":
{
- "oneOf":
- [
- { "$ref": "id.json#/definitions/arraySingleStringUri" },
- { "$ref": "otherProperties.json#/definitions/canonicalValidIfPresent" }
- ]
- }
- }
- },
+ "description": "True if no source, or source is uri, or source is object that does not have canonical key, or if source is object that has only 1 canonical key of uri format",
+ "type": "object",
+ "properties":
+ {
+ "source":
+ {
+ "oneOf":
+ [
+ { "$ref": "id.json#/definitions/arraySingleStringUri" },
+ { "$ref": "otherProperties.json#/definitions/canonicalValidIfPresent" }
+ ]
+ }
+ }
+ },
- "sourceWithVia":
- {
- "description": "True if no source, or source is uri, or source is object that does not have via key, or if source is object that has via key with all values of uri format",
- "type": "object",
- "properties":
- {
- "source":
+ "sourceWithVia":
{
- "oneOf":
- [
- { "$ref": "id.json#/definitions/arraySingleStringUri" },
- { "$ref": "otherProperties.json#/definitions/viaValidIfPresent" }
- ]
- }
- }
- },
+ "description": "True if no source, or source is uri, or source is object that does not have via key, or if source is object that has via key with all values of uri format",
+ "type": "object",
+ "properties":
+ {
+ "source":
+ {
+ "oneOf":
+ [
+ { "$ref": "id.json#/definitions/arraySingleStringUri" },
+ { "$ref": "otherProperties.json#/definitions/viaValidIfPresent" }
+ ]
+ }
+ }
+ },
- "sourceWithTextDirection":
- {
- "description": "True if no source, or source is uri, or source is object that does not have textDirection key, or if source is object that has only 1 textDirectoin key, one of ltr, rtl, auto",
- "type": "object",
- "properties":
- {
- "source":
+ "sourceWithTextDirection":
{
- "oneOf":
- [
- { "$ref": "id.json#/definitions/arraySingleStringUri" },
- { "$ref": "bodyTarget.json#/definitions/textDirectionValidIfPresent" }
- ]
- }
- }
- },
+ "description": "True if no source, or source is uri, or source is object that does not have textDirection key, or if source is object that has only 1 textDirectoin key, one of ltr, rtl, auto",
+ "type": "object",
+ "properties":
+ {
+ "source":
+ {
+ "oneOf":
+ [
+ { "$ref": "id.json#/definitions/arraySingleStringUri" },
+ { "$ref": "bodyTarget.json#/definitions/textDirectionValidIfPresent" }
+ ]
+ }
+ }
+ },
- "specificResourceWithItems" :
- {
- "description": "True if both source and items keys are present.",
- "allOf":
- [
- { "$ref": "#/definitions/sourceDetected"},
- { "required": [ "items" ] }
- ]
- },
+ "specificResourceWithItems" :
+ {
+ "description": "True if both source and items keys are present.",
+ "allOf":
+ [
+ { "$ref": "#/definitions/sourceDetected"},
+ { "required": [ "items" ] }
+ ]
+ },
"itemSRWithItems":
{
"type": "object",
"properties":
- {
- "items": {
- "type": "array",
- "minItems": 1,
- "not":
- { "items": {"not": { "$ref": "#/definitions/specificResourceWithItems" } } }
- }
- },
+ {
+ "items": {
+ "type": "array",
+ "minItems": 1,
+ "not":
+ { "items": {"not": { "$ref": "#/definitions/specificResourceWithItems" } } }
+ }
+ },
"required": ["items"]
},
- "specificResourceWithValue" :
- {
- "description": "True if both source and value keys are present.",
- "allOf":
- [
- { "$ref": "#/definitions/sourceDetected"},
- { "required": [ "value" ] }
- ]
- },
+ "specificResourceWithValue" :
+ {
+ "description": "True if both source and value keys are present.",
+ "allOf":
+ [
+ { "$ref": "#/definitions/sourceDetected"},
+ { "required": [ "value" ] }
+ ]
+ },
"itemSRWithValue":
{
"type": "object",
"properties":
- {
- "items": {
- "type": "array",
- "minItems": 1,
- "not":
- { "items": {"not": { "$ref": "#/definitions/specificResourceWithValue" } } }
- }
- },
+ {
+ "items": {
+ "type": "array",
+ "minItems": 1,
+ "not":
+ { "items": {"not": { "$ref": "#/definitions/specificResourceWithValue" } } }
+ }
+ },
"required": ["items"]
}
}
-}
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/annotation-model/scripts/JSONtest.js b/tests/wpt/web-platform-tests/annotation-model/scripts/JSONtest.js
index 825522e9f42..3ee49b86a81 100644
--- a/tests/wpt/web-platform-tests/annotation-model/scripts/JSONtest.js
+++ b/tests/wpt/web-platform-tests/annotation-model/scripts/JSONtest.js
@@ -29,6 +29,7 @@ function JSONtest(params) {
this.Params = null; // paramaters passed in
this.Promise = null; // master Promise that resolves when intialization is complete
this.Properties = null; // testharness_properties from the opening window
+ this.SkipFailures = []; // list of assertionType values that should be skipped if their test would fail
this.Test = null; // test being run
this.AssertionCounter = 0;// keeps track of which assertion is being processed
@@ -122,6 +123,10 @@ function JSONtest(params) {
this.DescriptionText = test.description;
}
+ if (test.hasOwnProperty("skipFailures") && Array.isArray(test.skipFailures) ) {
+ this.SkipFailures = test.skipFailures;
+ }
+
if (test.content) {
// we have content
if (typeof test.content === "string") {
@@ -407,7 +412,7 @@ JSONtest.prototype = {
var message = assert.hasOwnProperty('errorMessage') ?
assert.errorMessage : "Result was not " + expected;
var type = assert.hasOwnProperty('assertionType') ?
- assert.assertionType : "must" ;
+ assert.assertionType.toLowerCase() : "must" ;
if (!typeMap.hasOwnProperty(type)) {
type = "must";
}
@@ -507,39 +512,42 @@ JSONtest.prototype = {
return ;
}
- if (testAction !== 'continue') {
+ if (testAction === 'continue') {
// a previous test told us to not run this test; skip it
- test(function() { }, "SKIPPED: " + assert.title);
- } else {
+ // test(function() { }, "SKIPPED: " + assert.title);
// start an actual sub-test
- test(function() {
- var valid = validate(content) ;
+ var valid = validate(content) ;
- var result = this.determineResult(assert, valid) ;
+ var theResult = this.determineResult(assert, valid) ;
- // remember the result
- theResults.push(result);
+ // remember the result
+ theResults.push(theResult);
- var newAction = this.determineAction(assert, result) ;
- // next time around we will use this action
- testAction = newAction;
+ var newAction = this.determineAction(assert, theResult) ;
+ // next time around we will use this action
+ testAction = newAction;
- var err = ";";
- if (validate.errors !== null) {
- err = "; Errors: " + this.ajv.errorsText(validate.errors) + ";" ;
- }
- if (testAction === 'abort') {
- err += "; Aborting execution of remaining assertions;";
- } else if (testAction === 'skip') {
- err += "; Skipping execution of remaining assertions at level " + level + ";";
- }
- if (result === false) {
- // test result was unexpected; use message
- assert_true(result, typeMap[type] + message + err);
- } else {
- assert_true(result, err) ;
- }
- }.bind(this), "" + level + ":" + (num+1) + " " + assert.title);
+ // only run the test if we are NOT skipping fails for some types
+ // or the result is expected
+ if ( theResult === true || !this.SkipFailures.includes(type) ) {
+ test(function() {
+ var err = ";";
+ if (validate.errors !== null && !assert.hasOwnProperty("errorMessage")) {
+ err = "; Errors: " + this.ajv.errorsText(validate.errors) + ";" ;
+ }
+ if (testAction === 'abort') {
+ err += "; Aborting execution of remaining assertions;";
+ } else if (testAction === 'skip') {
+ err += "; Skipping execution of remaining assertions at level " + level + ";";
+ }
+ if (theResult === false) {
+ // test result was unexpected; use message
+ assert_true(theResult, typeMap[type] + message + err);
+ } else {
+ assert_true(theResult, err) ;
+ }
+ }.bind(this), "" + level + ":" + (num+1) + " " + assert.title);
+ }
}
}.bind(this));
}
diff --git a/tests/wpt/web-platform-tests/annotation-protocol/files/annotations/annotation.options.headers b/tests/wpt/web-platform-tests/annotation-protocol/files/annotations/annotation.options.headers
index e07c9bce15b..48973d74597 100755
--- a/tests/wpt/web-platform-tests/annotation-protocol/files/annotations/annotation.options.headers
+++ b/tests/wpt/web-platform-tests/annotation-protocol/files/annotations/annotation.options.headers
@@ -1,3 +1,2 @@
-Content-Type: text/plain
Allow: GET,HEAD,OPTIONS,DELETE,PUT
Vary: Accept
diff --git a/tests/wpt/web-platform-tests/annotation-protocol/files/annotations/collection.options.headers b/tests/wpt/web-platform-tests/annotation-protocol/files/annotations/collection.options.headers
index 1280684795e..7bc301662c6 100755
--- a/tests/wpt/web-platform-tests/annotation-protocol/files/annotations/collection.options.headers
+++ b/tests/wpt/web-platform-tests/annotation-protocol/files/annotations/collection.options.headers
@@ -1,3 +1,2 @@
-Content-Type: text/plain
Allow: POST,GET,OPTIONS,HEAD,DELETE,PUT
Vary: Accept, Prefer
diff --git a/tests/wpt/web-platform-tests/annotation-protocol/server/server-manual.html b/tests/wpt/web-platform-tests/annotation-protocol/server/server-manual.html
index 3d8d1ba160b..3a04a599175 100644
--- a/tests/wpt/web-platform-tests/annotation-protocol/server/server-manual.html
+++ b/tests/wpt/web-platform-tests/annotation-protocol/server/server-manual.html
@@ -63,16 +63,22 @@ function request(method, url, headers, content) {
resp.text = d;
// we have it; what is it?
var type = xhr.getResponseHeader('Content-Type');
- resp.type = type.split(';')[0];
- if (resp.type === MEDIA_TYPE) {
- try {
- d = JSON.parse(d);
- resp.body = d;
- }
- catch(err) {
- resp.body = null;
+ if (type) {
+ resp.type = type.split(';')[0];
+ if (resp.type === MEDIA_TYPE) {
+ try {
+ d = JSON.parse(d);
+ resp.body = d;
+ }
+ catch(err) {
+ resp.body = null;
+ }
}
+ } else {
+ resp.type = null;
+ resp.body = null;
}
+
}
resolve(resp);
};
@@ -167,6 +173,9 @@ function makePromiseTests( thennable, criteria ) {
}
function runTests( container_url, annotation_url ) {
+ // trim whitespace from incoming variables
+ container_url = container_url.trim();
+ annotation_url = annotation_url.trim();
// Section 4 has a requirement that the URL end in a slash, so...
// ensure the url has a length
@@ -323,7 +332,7 @@ function runTests( container_url, annotation_url ) {
// SHOULD tests
test(function() {
- assert_equals("https", container_url.toLowerCase().substr(0,5), "Server is not using HTTPS");
+ assert_equals(container_url.toLowerCase().substr(0,5), "https", "Server is not using HTTPS");
}, "Annotation server SHOULD use HTTPS rather than HTTP");
var thePrefRequest = request("GET", container_url,
diff --git a/tests/wpt/web-platform-tests/annotation-protocol/tools/protocol-server.py b/tests/wpt/web-platform-tests/annotation-protocol/tools/protocol-server.py
index e74e323f794..cbfc4034ca2 100755
--- a/tests/wpt/web-platform-tests/annotation-protocol/tools/protocol-server.py
+++ b/tests/wpt/web-platform-tests/annotation-protocol/tools/protocol-server.py
@@ -204,9 +204,6 @@ def collection_options(request, response):
for header, value in load_headers_from_file(headers_file):
response.headers.append(header, value)
- response.content = "Collection Options\n";
-
-
def page(request, response):
page_json = {
"@context": "http://www.w3.org/ns/anno.jsonld",
@@ -312,7 +309,6 @@ def annotation_head(request, response):
response.status = 404
add_cors_headers(response)
- response.content = "Annotation Options\n"
@wptserve.handlers.handler
def annotation_options(request, response):
@@ -331,8 +327,6 @@ def annotation_options(request, response):
response.status = 404
add_cors_headers(response)
- response.content = "Annotation Options\n"
-
def create_annotation(body):
# TODO: verify media type is JSON of some kind (at least)
@@ -409,6 +403,8 @@ def annotation_delete(request, response):
if __name__ == '__main__':
print 'http://' + myhost + ':{0}/'.format(port)
+ print 'container URI is http://' + myhost + ':{0}/'.format(port) + "/annotations/"
+ print 'example annotation URI is http://' + myhost + ':{0}/'.format(port) + "/annotations/anno1.json"
routes = [
("GET", "", wptserve.handlers.file_handler),
diff --git a/tests/wpt/web-platform-tests/bluetooth/bluetooth-helpers.js b/tests/wpt/web-platform-tests/bluetooth/bluetooth-helpers.js
new file mode 100644
index 00000000000..14ed7d66d85
--- /dev/null
+++ b/tests/wpt/web-platform-tests/bluetooth/bluetooth-helpers.js
@@ -0,0 +1,147 @@
+'use strict';
+
+// Bluetooth UUID constants:
+// Services:
+var blacklist_test_service_uuid = "611c954a-263b-4f4a-aab6-01ddb953f985";
+var request_disconnection_service_uuid = "01d7d889-7451-419f-aeb8-d65e7b9277af";
+// Characteristics:
+var blacklist_exclude_reads_characteristic_uuid = "bad1c9a2-9a5b-4015-8b60-1579bbbf2135";
+var request_disconnection_characteristic_uuid = "01d7d88a-7451-419f-aeb8-d65e7b9277af";
+// Descriptors:
+var blacklist_exclude_reads_descriptor_uuid = "aaaaaaaa-aaaa-1181-0510-810819516110";
+var blacklist_descriptor_uuid = "07711111-6104-0970-7011-1107105110aaa";
+var characteristic_user_description_uuid = "00002901-0000-1000-8000-00805f9b34fb";
+
+// Bluetooth Adapter types:
+var adapter_type = {
+ not_present: 'NotPresentAdapter',
+ not_powered: 'NotPoweredAdapter',
+ empty: 'EmptyAdapter',
+ heart_rate: 'HeartRateAdapter',
+ two_heart_rate: 'TwoHeartRateServicesAdapter',
+ empty_name_heart_rate: 'EmptyNameHeartRateAdapter',
+ no_name_heart_rate: 'NoNameHeartRateAdapter',
+ glucose_heart_rate: 'GlucoseHeartRateAdapter',
+ unicode_device: 'UnicodeDeviceAdapter',
+ blacklist: 'BlacklistTestAdapter',
+ missing_characteristic_heart_rate: 'MissingCharacteristicHeartRateAdapter',
+ missing_service_heart_rate: 'MissingServiceHeartRateAdapter',
+ missing_descriptor_heart_rate: 'MissingDescriptorHeartRateAdapter'
+};
+
+var mock_device_name = {
+ heart_rate: 'Heart Rate Device',
+ glucose: 'Glucose Device'
+};
+
+var wrong = {
+ name: 'wrong_name',
+ service: 'wrong_service'
+};
+
+// Sometimes we need to test that using either the name, alias, or UUID
+// produces the same result. The following objects help us do that.
+var generic_access = {
+ alias: 0x1800,
+ name: 'generic_access',
+ uuid: '00001800-0000-1000-8000-00805f9b34fb'
+};
+
+var device_name = {
+ alias: 0x2a00,
+ name: 'gap.device_name',
+ uuid: '00002a00-0000-1000-8000-00805f9b34fb'
+};
+
+var reconnection_address = {
+ alias: 0x2a03,
+ name: 'gap.reconnection_address',
+ uuid: '00002a03-0000-1000-8000-00805f9b34fb'
+};
+
+var heart_rate = {
+ alias: 0x180d,
+ name: 'heart_rate',
+ uuid: '0000180d-0000-1000-8000-00805f9b34fb'
+};
+
+var heart_rate_measurement = {
+ alias: 0x2a37,
+ name: 'heart_rate_measurement',
+ uuid: '00002a37-0000-1000-8000-00805f9b34fb'
+};
+
+var body_sensor_location = {
+ alias: 0x2a38,
+ name: 'body_sensor_location',
+ uuid: '00002a38-0000-1000-8000-00805f9b34fb'
+};
+
+var glucose = {
+ alias: 0x1808,
+ name: 'glucose',
+ uuid: '00001808-0000-1000-8000-00805f9b34fb'
+};
+
+var battery_service = {
+ alias: 0x180f,
+ name: 'battery_service',
+ uuid: '0000180f-0000-1000-8000-00805f9b34fb'
+};
+
+var battery_level = {
+ alias: 0x2a19,
+ name: 'battery_level',
+ uuid: '00002a19-0000-1000-8000-00805f9b34fb'
+};
+
+var tx_power = {
+ alias: 0x1804,
+ name: 'tx_power',
+ uuid: '00001804-0000-1000-8000-00805f9b34fb'
+};
+
+var human_interface_device = {
+ alias: 0x1812,
+ name: 'human_interface_device',
+ uuid: '00001812-0000-1000-8000-00805f9b34fb'
+};
+
+var device_information = {
+ alias: 0x180a,
+ name: 'device_information',
+ uuid: '0000180a-0000-1000-8000-00805f9b34fb'
+};
+
+var peripherial_privacy_flag = {
+ alias: 0x2a02,
+ name: 'gap.peripheral_privacy_flag',
+ uuid: '00002a02-0000-1000-8000-00805f9b34fb'
+};
+
+var serial_number_string = {
+ alias: 0x2a25,
+ name: 'serial_number_string',
+ uuid: '00002a25-0000-1000-8000-00805f9b34fb'
+};
+
+var client_characteristic_configuration = {
+ alias: 0x2902,
+ name: 'gatt.client_characteristic_configuration',
+ uuid: '00002902-0000-1000-8000-00805f9b34fb'
+};
+
+var number_of_digitals = {
+ alias: 0x2909,
+ name: 'number_of_digitals',
+ uuid: '00002909-0000-1000-8000-00805f9b34fb'
+};
+
+// Helper function for converting strings to an array of bytes.
+function asciiToDecimal(bytestr) {
+ var result = [];
+ for(var i = 0; i < bytestr.length; i++) {
+ result[i] = bytestr.charCodeAt(i) ;
+ }
+ return result;
+}
diff --git a/tests/wpt/web-platform-tests/check_stability.py b/tests/wpt/web-platform-tests/check_stability.py
new file mode 100644
index 00000000000..7b707212158
--- /dev/null
+++ b/tests/wpt/web-platform-tests/check_stability.py
@@ -0,0 +1,599 @@
+from __future__ import print_function
+
+import argparse
+import json
+import logging
+import os
+import re
+import stat
+import subprocess
+import sys
+import tarfile
+import traceback
+import zipfile
+from cStringIO import StringIO
+from collections import defaultdict
+from urlparse import urljoin
+
+import requests
+
+BaseHandler = None
+LogActionFilter = None
+LogHandler = None
+LogLevelFilter = None
+StreamHandler = None
+TbplFormatter = None
+reader = None
+wptcommandline = None
+wptrunner = None
+
+
+logger = logging.getLogger(os.path.splitext(__file__)[0])
+
+
+def do_delayed_imports():
+ global BaseHandler
+ global LogLevelFilter
+ global StreamHandler
+ global TbplFormatter
+ global reader
+ global wptcommandline
+ global wptrunner
+ from mozlog import reader
+ from mozlog.formatters import TbplFormatter
+ from mozlog.handlers import BaseHandler, LogLevelFilter, StreamHandler
+ from wptrunner import wptcommandline, wptrunner
+ setup_log_handler()
+ setup_action_filter()
+
+
+def setup_logging():
+ handler = logging.StreamHandler(sys.stdout)
+ formatter = logging.Formatter(logging.BASIC_FORMAT, None)
+ handler.setFormatter(formatter)
+ logger.addHandler(handler)
+ logger.setLevel(logging.DEBUG)
+
+setup_logging()
+
+
+def setup_action_filter():
+ global LogActionFilter
+
+ class LogActionFilter(BaseHandler):
+ """Handler that filters out messages with action of log and a level
+ lower than some specified level.
+
+ :param inner: Handler to use for messages that pass this filter
+ :param level: Minimum log level to process
+ """
+ def __init__(self, inner, actions):
+ BaseHandler.__init__(self, inner)
+ self.inner = inner
+ self.actions = actions
+
+ def __call__(self, item):
+ if item["action"] in self.actions:
+ return self.inner(item)
+
+
+class TravisFold(object):
+ def __init__(self, name):
+ self.name = name
+
+ def __enter__(self):
+ print("travis_fold:start:%s" % self.name, file=sys.stderr)
+
+ def __exit__(self, type, value, traceback):
+ print("travis_fold:end:%s" % self.name, file=sys.stderr)
+
+
+class GitHub(object):
+ def __init__(self, org, repo, token):
+ self.token = token
+ self.headers = {"Accept": "application/vnd.github.v3+json"}
+ self.auth = (self.token, "x-oauth-basic")
+ self.org = org
+ self.repo = repo
+ self.base_url = "https://api.github.com/repos/%s/%s/" % (org, repo)
+
+ def _headers(self, headers):
+ if headers is None:
+ headers = {}
+ rv = self.headers.copy()
+ rv.update(headers)
+ return rv
+
+ def post(self, url, data, headers=None):
+ logger.debug("POST %s" % url)
+ if data is not None:
+ data = json.dumps(data)
+ resp = requests.post(
+ url,
+ data=data,
+ headers=self._headers(headers),
+ auth=self.auth
+ )
+ resp.raise_for_status()
+ return resp
+
+ def get(self, url, headers=None):
+ logger.debug("GET %s" % url)
+ resp = requests.get(
+ url,
+ headers=self._headers(headers),
+ auth=self.auth
+ )
+ resp.raise_for_status()
+ return resp
+
+ def post_comment(self, issue_number, body):
+ url = urljoin(self.base_url, "issues/%s/comments" % issue_number)
+ return self.post(url, {"body": body})
+
+ def releases(self):
+ url = urljoin(self.base_url, "releases/latest")
+ return self.get(url)
+
+
+class GitHubCommentHandler(logging.Handler):
+ def __init__(self, github, pull_number):
+ logging.Handler.__init__(self)
+ self.github = github
+ self.pull_number = pull_number
+ self.log_data = []
+
+ def emit(self, record):
+ try:
+ msg = self.format(record)
+ self.log_data.append(msg)
+ except Exception:
+ self.handleError(record)
+
+ def send(self):
+ self.github.post_comment(self.pull_number, "\n".join(self.log_data))
+ self.log_data = []
+
+
+class Browser(object):
+ product = None
+
+ def __init__(self, github_token):
+ self.github_token = github_token
+
+
+class Firefox(Browser):
+ product = "firefox"
+
+ def install(self):
+ call("pip", "install", "-r", "w3c/wptrunner/requirements_firefox.txt")
+ resp = get("https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central/firefox-52.0a1.en-US.linux-x86_64.tar.bz2")
+ untar(resp.raw)
+
+ if not os.path.exists("profiles"):
+ os.mkdir("profiles")
+ with open(os.path.join("profiles", "prefs_general.js"), "wb") as f:
+ resp = get("https://hg.mozilla.org/mozilla-central/raw-file/tip/testing/profiles/prefs_general.js")
+ f.write(resp.content)
+ call("pip", "install", "-r", os.path.join("w3c", "wptrunner", "requirements_firefox.txt"))
+
+ def _latest_geckodriver_version(self):
+ # This is used rather than an API call to avoid rate limits
+ tags = call("git", "ls-remote", "--tags", "--refs",
+ "https://github.com/mozilla/geckodriver.git")
+ release_re = re.compile(".*refs/tags/v(\d+)\.(\d+)\.(\d+)")
+ latest_release = 0
+ for item in tags.split("\n"):
+ m = release_re.match(item)
+ if m:
+ version = [int(item) for item in m.groups()]
+ if version > latest_release:
+ latest_release = version
+ assert latest_release != 0
+ return "v%s.%s.%s" % tuple(str(item) for item in latest_release)
+
+
+ def install_webdriver(self):
+ version = self._latest_geckodriver_version()
+ logger.debug("Latest geckodriver release %s" % version)
+ url = "https://github.com/mozilla/geckodriver/releases/download/%s/geckodriver-%s-linux64.tar.gz" % (version, version)
+ untar(get(url).raw)
+
+ def wptrunner_args(self, root):
+ return {
+ "product": "firefox",
+ "binary": "%s/firefox/firefox" % root,
+ "certutil_binary": "certutil",
+ "webdriver_binary": "%s/geckodriver" % root,
+ "prefs_root": "%s/profiles" % root,
+ }
+
+
+class Chrome(Browser):
+ product = "chrome"
+
+ def install(self):
+ latest = get("https://www.googleapis.com/download/storage/v1/b/chromium-browser-snapshots/o/Linux_x64%2FLAST_CHANGE?alt=media").text.strip()
+ url = "https://www.googleapis.com/download/storage/v1/b/chromium-browser-snapshots/o/Linux_x64%%2F%s%%2Fchrome-linux.zip?alt=media" % latest
+ unzip(get(url).raw)
+ logger.debug(call("ls", "-lhrt", "chrome-linux"))
+ call("pip", "install", "-r", os.path.join("w3c", "wptrunner", "requirements_chrome.txt"))
+
+ def install_webdriver(self):
+ latest = get("http://chromedriver.storage.googleapis.com/LATEST_RELEASE").text.strip()
+ url = "http://chromedriver.storage.googleapis.com/%s/chromedriver_linux64.zip" % latest
+ unzip(get(url).raw)
+ st = os.stat('chromedriver')
+ os.chmod('chromedriver', st.st_mode | stat.S_IEXEC)
+
+ def wptrunner_args(self, root):
+ return {
+ "product": "chrome",
+ "binary": "%s/chrome-linux/chrome" % root,
+ "webdriver_binary": "%s/chromedriver" % root,
+ "test_types": ["testharness", "reftest"]
+ }
+
+
+def get(url):
+ logger.debug("GET %s" % url)
+ resp = requests.get(url, stream=True)
+ resp.raise_for_status()
+ return resp
+
+
+def call(*args):
+ logger.debug("%s" % " ".join(args))
+ return subprocess.check_output(args)
+
+
+def get_git_cmd(repo_path):
+ def git(cmd, *args):
+ full_cmd = ["git", cmd] + list(args)
+ try:
+ return subprocess.check_output(full_cmd, cwd=repo_path, stderr=subprocess.STDOUT)
+ except subprocess.CalledProcessError as e:
+ logger.error("Git command exited with status %i" % e.returncode)
+ logger.error(e.output)
+ sys.exit(1)
+ return git
+
+
+def seekable(fileobj):
+ try:
+ fileobj.seek(fileobj.tell())
+ except Exception:
+ return StringIO(fileobj.read())
+ else:
+ return fileobj
+
+
+def untar(fileobj):
+ logger.debug("untar")
+ fileobj = seekable(fileobj)
+ with tarfile.open(fileobj=fileobj) as tar_data:
+ tar_data.extractall()
+
+
+def unzip(fileobj):
+ logger.debug("unzip")
+ fileobj = seekable(fileobj)
+ with zipfile.ZipFile(fileobj) as zip_data:
+ for info in zip_data.infolist():
+ zip_data.extract(info)
+ perm = info.external_attr >> 16 & 0x1FF
+ os.chmod(info.filename, perm)
+
+
+def setup_github_logging(args):
+ gh_handler = None
+ if args.comment_pr:
+ github = GitHub("w3c", "web-platform-tests", args.gh_token)
+ try:
+ pr_number = int(args.comment_pr)
+ except ValueError:
+ pass
+ else:
+ gh_handler = GitHubCommentHandler(github, pr_number)
+ gh_handler.setLevel(logging.INFO)
+ logger.debug("Setting up GitHub logging")
+ logger.addHandler(gh_handler)
+ else:
+ logger.warning("No PR number found; not posting to GitHub")
+ return gh_handler
+
+
+class pwd(object):
+ def __init__(self, dir):
+ self.dir = dir
+ self.old_dir = None
+
+ def __enter__(self):
+ self.old_dir = os.path.abspath(os.curdir)
+ os.chdir(self.dir)
+
+ def __exit__(self, *args, **kwargs):
+ os.chdir(self.old_dir)
+ self.old_dir = None
+
+
+def fetch_wpt_master():
+ git = get_git_cmd(os.path.join(os.path.abspath(os.curdir), "w3c", "web-platform-tests"))
+ git("fetch", "https://github.com/w3c/web-platform-tests.git", "master:master")
+
+
+def get_sha1():
+ git = get_git_cmd(os.path.join(os.path.abspath(os.curdir), "w3c", "web-platform-tests"))
+ return git("rev-parse", "HEAD").strip()
+
+def build_manifest():
+ with pwd(os.path.join(os.path.abspath(os.curdir), "w3c", "web-platform-tests")):
+ # TODO: Call the manifest code directly
+ call("python", "manifest")
+
+
+def install_wptrunner():
+ call("git", "clone", "--depth=1", "https://github.com/w3c/wptrunner.git", "w3c/wptrunner")
+ git = get_git_cmd(os.path.join(os.path.abspath(os.curdir), "w3c", "wptrunner"))
+ git("submodule", "update", "--init", "--recursive")
+ call("pip", "install", os.path.join("w3c", "wptrunner"))
+
+
+def get_files_changed():
+ root = os.path.abspath(os.curdir)
+ git = get_git_cmd("%s/w3c/web-platform-tests" % root)
+ branch_point = git("merge-base", "HEAD", "master").strip()
+ logger.debug("Branch point from master: %s" % branch_point)
+ logger.debug(git("log", "--oneline", "%s.." % branch_point))
+ files = git("diff", "--name-only", "-z", "%s.." % branch_point)
+ if not files:
+ return []
+ assert files[-1] == "\0"
+ return ["%s/w3c/web-platform-tests/%s" % (root, item)
+ for item in files[:-1].split("\0")]
+
+
+def wptrunner_args(root, files_changed, iterations, browser):
+ parser = wptcommandline.create_parser([browser.product])
+ args = vars(parser.parse_args([]))
+ wpt_root = os.path.join(root, "w3c", "web-platform-tests")
+ args.update(browser.wptrunner_args(root))
+ args.update({
+ "tests_root": wpt_root,
+ "metadata_root": wpt_root,
+ "repeat": iterations,
+ "config": "%s/w3c/wptrunner/wptrunner.default.ini" % root,
+ "test_list": files_changed,
+ "restart_on_unexpected": False,
+ "pause_after_test": False
+ })
+ wptcommandline.check_args(args)
+ return args
+
+
+def setup_log_handler():
+ global LogHandler
+
+ class LogHandler(reader.LogHandler):
+ def __init__(self):
+ self.results = defaultdict(lambda: defaultdict(lambda: defaultdict(int)))
+
+ def test_status(self, data):
+ self.results[data["test"]][data.get("subtest")][data["status"]] += 1
+
+ def test_end(self, data):
+ self.results[data["test"]][None][data["status"]] += 1
+
+
+def is_inconsistent(results_dict, iterations):
+ return len(results_dict) > 1 or sum(results_dict.values()) != iterations
+
+
+def err_string(results_dict, iterations):
+ rv = []
+ total_results = sum(results_dict.values())
+ for key, value in sorted(results_dict.items()):
+ rv.append("%s%s" %
+ (key, ": %s/%s" % (value, iterations) if value != iterations else ""))
+ rv = ", ".join(rv)
+ if total_results < iterations:
+ rv.append("MISSING: %s/%s" % (iterations - total_results, iterations))
+ if len(results_dict) > 1 or total_results != iterations:
+ rv = "**%s**" % rv
+ return rv
+
+
+def process_results(log, iterations):
+ inconsistent = []
+ handler = LogHandler()
+ reader.handle_log(reader.read(log), handler)
+ results = handler.results
+ for test, test_results in results.iteritems():
+ for subtest, result in test_results.iteritems():
+ if is_inconsistent(result, iterations):
+ inconsistent.append((test, subtest, result))
+ return results, inconsistent
+
+
+def markdown_adjust(s):
+ s = s.replace('\t', u'\\t')
+ s = s.replace('\n', u'\\n')
+ s = s.replace('\r', u'\\r')
+ s = s.replace('`', u'\\`')
+ return s
+
+
+def table(headings, data, log):
+ cols = range(len(headings))
+ assert all(len(item) == len(cols) for item in data)
+ max_widths = reduce(lambda prev, cur: [(len(cur[i]) + 2)
+ if (len(cur[i]) + 2) > prev[i]
+ else prev[i]
+ for i in cols],
+ data,
+ [len(item) + 2 for item in headings])
+ log("|%s|" % "|".join(item.center(max_widths[i]) for i, item in enumerate(headings)))
+ log("|%s|" % "|".join("-" * max_widths[i] for i in cols))
+ for row in data:
+ log("|%s|" % "|".join(" %s" % row[i].ljust(max_widths[i] - 1) for i in cols))
+ log("")
+
+
+def write_inconsistent(inconsistent, iterations):
+ logger.error("## Unstable results ##\n")
+ strings = [("`%s`" % markdown_adjust(test), ("`%s`" % markdown_adjust(subtest)) if subtest else "", err_string(results, iterations))
+ for test, subtest, results in inconsistent]
+ table(["Test", "Subtest", "Results"], strings, logger.error)
+
+
+def write_results(results, iterations, comment_pr):
+ logger.info("## All results ##\n")
+ for test, test_results in results.iteritems():
+ baseurl = "http://w3c-test.org/submissions"
+ if "https" in os.path.splitext(test)[0].split(".")[1:]:
+ baseurl = "https://w3c-test.org/submissions"
+ pr_number = None
+ if comment_pr:
+ try:
+ pr_number = int(comment_pr)
+ except ValueError:
+ pass
+ if pr_number:
+ logger.info("### [%s](%s/%s%s) ###" % (test, baseurl, pr_number, test))
+ else:
+ logger.info("### %s ###" % test)
+ parent = test_results.pop(None)
+ strings = [("", err_string(parent, iterations))]
+ strings.extend(((("`%s`" % markdown_adjust(subtest)) if subtest else "", err_string(results, iterations))
+ for subtest, results in test_results.iteritems()))
+ table(["Subtest", "Results"], strings, logger.info)
+
+
+def get_parser():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--root",
+ action="store",
+ default=os.path.join(os.path.expanduser("~"), "build"),
+ help="Root path")
+ parser.add_argument("--iterations",
+ action="store",
+ default=10,
+ type=int,
+ help="Number of times to run tests")
+ parser.add_argument("--gh-token",
+ action="store",
+ default=os.environ.get("GH_TOKEN"),
+ help="OAuth token to use for accessing GitHub api")
+ parser.add_argument("--comment-pr",
+ action="store",
+ default=os.environ.get("TRAVIS_PULL_REQUEST"),
+ help="PR to comment on with stability results")
+ parser.add_argument("browser",
+ action="store",
+ help="Browser to run against")
+ return parser
+
+
+def main():
+ retcode = 0
+ parser = get_parser()
+ args = parser.parse_args()
+
+ if not os.path.exists(args.root):
+ logger.critical("Root directory %s does not exist" % args.root)
+ return 1
+
+ os.chdir(args.root)
+
+ if args.gh_token:
+ gh_handler = setup_github_logging(args)
+ else:
+ logger.warning("Can't log to GitHub")
+ gh_handler = None
+
+ with TravisFold("browser_setup"):
+ logger.info("# %s #" % args.browser.title())
+
+ browser_cls = {"firefox": Firefox,
+ "chrome": Chrome}.get(args.browser)
+ if browser_cls is None:
+ logger.critical("Unrecognised browser %s" % args.browser)
+ return 1
+
+ fetch_wpt_master()
+
+ head_sha1 = get_sha1()
+ logger.info("Testing revision %s" % head_sha1)
+
+ # For now just pass the whole list of changed files to wptrunner and
+ # assume that it will run everything that's actually a test
+ files_changed = get_files_changed()
+
+ if not files_changed:
+ logger.info("No files changed")
+ return 0
+
+ build_manifest()
+ install_wptrunner()
+ do_delayed_imports()
+
+ logger.debug("Files changed:\n%s" % "".join(" * %s\n" % item for item in files_changed))
+
+ browser = browser_cls(args.gh_token)
+
+ browser.install()
+ browser.install_webdriver()
+
+ kwargs = wptrunner_args(args.root,
+ files_changed,
+ args.iterations,
+ browser)
+
+ with TravisFold("running_tests"):
+ logger.info("Starting %i test iterations" % args.iterations)
+ with open("raw.log", "wb") as log:
+ wptrunner.setup_logging(kwargs,
+ {"raw": log})
+ # Setup logging for wptrunner that keeps process output and
+ # warning+ level logs only
+ wptrunner.logger.add_handler(
+ LogActionFilter(
+ LogLevelFilter(
+ StreamHandler(
+ sys.stdout,
+ TbplFormatter()
+ ),
+ "WARNING"),
+ ["log", "process_output"]))
+
+ wptrunner.run_tests(**kwargs)
+
+ with open("raw.log", "rb") as log:
+ results, inconsistent = process_results(log, args.iterations)
+
+ if results:
+ if inconsistent:
+ write_inconsistent(inconsistent, args.iterations)
+ retcode = 2
+ else:
+ logger.info("All results were stable\n")
+ with TravisFold("full_results"):
+ write_results(results, args.iterations, args.comment_pr)
+ else:
+ logger.info("No tests run.")
+
+ try:
+ if gh_handler:
+ gh_handler.send()
+ except Exception:
+ logger.error(traceback.format_exc())
+ return retcode
+
+
+if __name__ == "__main__":
+ try:
+ retcode = main()
+ except:
+ raise
+ else:
+ sys.exit(retcode)
diff --git a/tests/wpt/web-platform-tests/ci_lint.sh b/tests/wpt/web-platform-tests/ci_lint.sh
new file mode 100644
index 00000000000..ebcd5c0901e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/ci_lint.sh
@@ -0,0 +1,5 @@
+set -ex
+
+./manifest
+./lint
+./diff-manifest.py
diff --git a/tests/wpt/web-platform-tests/ci_stability.sh b/tests/wpt/web-platform-tests/ci_stability.sh
new file mode 100644
index 00000000000..8e03c182084
--- /dev/null
+++ b/tests/wpt/web-platform-tests/ci_stability.sh
@@ -0,0 +1,33 @@
+set -e
+
+hosts_fixup() {
+ echo "travis_fold:start:hosts_fixup"
+ echo "Rewriting hosts file"
+ echo "## /etc/hosts ##"
+ cat /etc/hosts
+ sudo sed -i 's/^::1\s*localhost/::1/' /etc/hosts
+ sudo sh -c 'echo "
+127.0.0.1 web-platform.test
+127.0.0.1 www.web-platform.test
+127.0.0.1 www1.web-platform.test
+127.0.0.1 www2.web-platform.test
+127.0.0.1 xn--n8j6ds53lwwkrqhv28a.web-platform.test
+127.0.0.1 xn--lve-6lad.web-platform.test
+" >> /etc/hosts'
+ echo "== /etc/hosts =="
+ cat /etc/hosts
+ echo "----------------"
+ echo "travis_fold:end:hosts_fixup"
+}
+
+
+test_stability() {
+ python check_stability.py $PRODUCT
+}
+
+main() {
+ hosts_fixup
+ test_stability
+}
+
+main
diff --git a/tests/wpt/web-platform-tests/common/dummy.xhtml b/tests/wpt/web-platform-tests/common/dummy.xhtml
new file mode 100644
index 00000000000..5b208d74450
--- /dev/null
+++ b/tests/wpt/web-platform-tests/common/dummy.xhtml
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<html><head><title>Dummy XHTML document</title></head><body /></html>
diff --git a/tests/wpt/web-platform-tests/common/dummy.xml b/tests/wpt/web-platform-tests/common/dummy.xml
new file mode 100644
index 00000000000..4a60c3035fc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/common/dummy.xml
@@ -0,0 +1 @@
+<foo>Dummy XML document</foo>
diff --git a/tests/wpt/web-platform-tests/common/get-host-info.sub.js b/tests/wpt/web-platform-tests/common/get-host-info.sub.js
index 8d3d61de12a..5e60c49767b 100644
--- a/tests/wpt/web-platform-tests/common/get-host-info.sub.js
+++ b/tests/wpt/web-platform-tests/common/get-host-info.sub.js
@@ -23,3 +23,13 @@ function get_host_info() {
HTTPS_REMOTE_ORIGIN_WITH_CREDS: 'https://foo:bar@' + REMOTE_HOST + ':' + HTTPS_PORT,
};
}
+
+function get_port(loc) {
+ // When a default port is used, location.port returns the empty string.
+ // To compare with wptserve `ports` substitution we need a port...
+ // loc can be Location/<a>/<area>/URL, but assumes http/https only.
+ if (loc.port) {
+ return loc.port;
+ }
+ return loc.protocol === 'https:' ? '443' : '80';
+}
diff --git a/tests/wpt/web-platform-tests/compat/webkit-text-fill-color-currentColor.html b/tests/wpt/web-platform-tests/compat/webkit-text-fill-color-currentColor.html
new file mode 100644
index 00000000000..f4912c93450
--- /dev/null
+++ b/tests/wpt/web-platform-tests/compat/webkit-text-fill-color-currentColor.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<title>Test that currentColor is not affected by -webkit-text-fill-color</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<p id="target" style="text-decoration-color: currentColor; color: blue; -webkit-text-fill-color: red;"></p>
+<script>
+test(function() {
+ var target = document.getElementById("target");
+ var cs = window.getComputedStyle(target, null);
+
+ var textDecorationColor = cs.getPropertyValue('text-decoration-color');
+ var color = cs.getPropertyValue('color');
+ var webkiTextFillColor = cs.getPropertyValue('-webkit-text-fill-color');
+
+ assert_true(textDecorationColor == color);
+ assert_true(textDecorationColor != webkiTextFillColor);
+});
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/config.default.json b/tests/wpt/web-platform-tests/config.default.json
index dd4530b2140..47ad74b7eb5 100644
--- a/tests/wpt/web-platform-tests/config.default.json
+++ b/tests/wpt/web-platform-tests/config.default.json
@@ -22,5 +22,6 @@
"host_cert_path": null
},
"none": {}
- }
+ },
+ "aliases": []
}
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-dom-01-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-dom-01-f-isvalid.html
index a8b0dc56ac9..a8b0dc56ac9 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-dom-01-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-dom-01-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-dom-02-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-dom-02-f-isvalid.html
index 024044443a7..024044443a7 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-dom-02-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-dom-02-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-elem-40-t-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-elem-40-t-isvalid.html
index 0e8682825a7..0e8682825a7 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-elem-40-t-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-elem-40-t-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-script-elem-01-b-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-script-elem-01-b-isvalid.html
index b01dd547594..b01dd547594 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-script-elem-01-b-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-script-elem-01-b-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-struct-dom-01-b-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-struct-dom-01-b-isvalid.html
index 3ca95a754df..3ca95a754df 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-struct-dom-01-b-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/animate-struct-dom-01-b-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/conform-viewers-02-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/conform-viewers-02-f-isvalid.html
index ebde81958d4..ebde81958d4 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/conform-viewers-02-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/conform-viewers-02-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/coords-dom-03-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/coords-dom-03-f-isvalid.html
index 15d373e1e5a..15d373e1e5a 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/coords-dom-03-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/coords-dom-03-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-events-02-b-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-events-02-b-isvalid.html
index e85bd93e7ac..e85bd93e7ac 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-events-02-b-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-events-02-b-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-01-b-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-01-b-isvalid.html
index 851efb65288..851efb65288 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-01-b-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-01-b-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-03-b-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-03-b-isvalid.html
index 7e28b1e9d30..7e28b1e9d30 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-03-b-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-03-b-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-05-b-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-05-b-isvalid.html
index 69d39b6492c..69d39b6492c 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-05-b-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-05-b-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-07-t-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-07-t-isvalid.html
index 0ee3f03d941..0ee3f03d941 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-07-t-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-07-t-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-08-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-08-f-isvalid.html
index 42126ad1fd7..42126ad1fd7 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-08-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-08-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-09-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-09-f-isvalid.html
index fb8d9a82ba3..fb8d9a82ba3 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-09-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pevents-09-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pointer-01-t-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pointer-01-t-isvalid.html
index 5b2da1f4c72..5b2da1f4c72 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pointer-01-t-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pointer-01-t-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pointer-03-t-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pointer-03-t-isvalid.html
index 36e1e46d54f..36e1e46d54f 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pointer-03-t-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/interact-pointer-03-t-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/masking-path-09-b-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/masking-path-09-b-isvalid.html
index d6f44374479..d6f44374479 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/masking-path-09-b-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/masking-path-09-b-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/paths-dom-01-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/paths-dom-01-f-isvalid.html
index 8d071607439..8d071607439 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/paths-dom-01-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/paths-dom-01-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/paths-dom-02-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/paths-dom-02-f-isvalid.html
index 87b11d6a81f..87b11d6a81f 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/paths-dom-02-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/paths-dom-02-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-cond-02-t-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-cond-02-t-haswarn.html
index e33ec280aa6..e33ec280aa6 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-cond-02-t-isvalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-cond-02-t-haswarn.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-07-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-07-f-isvalid.html
index e3688befe99..e3688befe99 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-07-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-07-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-08-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-08-f-isvalid.html
index 6216a6541b7..6216a6541b7 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-08-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-08-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-11-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-11-f-isvalid.html
index 0e9a19b7fd8..0e9a19b7fd8 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-11-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-11-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-13-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-13-f-isvalid.html
index 3d1a44d4f3c..3d1a44d4f3c 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-13-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-13-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-14-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-14-f-isvalid.html
index 94ef4480ea9..94ef4480ea9 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-14-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-14-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-15-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-15-f-isvalid.html
index d84d99c77b3..d84d99c77b3 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-15-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-15-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-20-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-20-f-isvalid.html
index d57ffb8806d..d57ffb8806d 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-20-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-dom-20-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-use-13-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-use-13-f-isvalid.html
index 7bd9b978ceb..7bd9b978ceb 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-use-13-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/struct-use-13-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-dom-02-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-dom-02-f-isvalid.html
index da0d7228b3c..da0d7228b3c 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-dom-02-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-dom-02-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-dom-05-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-dom-05-f-isvalid.html
index af843569ba6..af843569ba6 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-dom-05-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-dom-05-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-tselect-02-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-tselect-02-f-isvalid.html
index bee4bf91dd9..bee4bf91dd9 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-tselect-02-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-tselect-02-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-tselect-03-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-tselect-03-f-isvalid.html
index 6ce8758c73f..6ce8758c73f 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-tselect-03-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/text-tselect-03-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-02-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-02-f-isvalid.html
index 9072bacb932..9072bacb932 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-02-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-02-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-03-b-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-03-b-isvalid.html
index 03623bf3256..03623bf3256 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-03-b-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-03-b-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-05-b-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-05-b-isvalid.html
index 22a540f71b8..22a540f71b8 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-05-b-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-05-b-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-07-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-07-f-isvalid.html
index e5edef0d70b..e5edef0d70b 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-07-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-07-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-08-f-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-08-f-isvalid.html
index 2f46c1cbebc..2f46c1cbebc 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-08-f-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html-svg/types-dom-08-f-isvalid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dd/dd-hgroup-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dd/dd-hgroup-isvalid.html
new file mode 100644
index 00000000000..9db467c3e82
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dd/dd-hgroup-isvalid.html
@@ -0,0 +1,5 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>valid hgroup in dd</title>
+<body>
+<dl><dt>text<dd><hgroup><h1>text</h1></hgroup></dl> <!-- hgroup-in-dd -->
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/article-in-dt-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/article-in-dt-novalid.html
new file mode 100644
index 00000000000..1c2fde9cd6a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/article-in-dt-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid article-in-dt</title>
+<dl><dt><article><h2>text</h2></article><dd>text</dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/aside-in-dt-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/aside-in-dt-novalid.html
new file mode 100644
index 00000000000..b08c05b7f39
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/aside-in-dt-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid aside-in-dt</title>
+<dl><dt><aside><h2>text</h2></aside><dd>text</dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dd-in-template-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dd-in-template-novalid.html
new file mode 100644
index 00000000000..3c4ddbdae19
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dd-in-template-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid dd-in-template</title>
+<dl><dt>1</dt><template><dd>a</dd></template></dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-contains-dl-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-contains-dl-novalid.html
new file mode 100644
index 00000000000..d94258abc01
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-contains-dl-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid div-contains-dl</title>
+<dl><div><dl></dl></div><dt>2<dd>b</div></dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-contains-text-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-contains-text-novalid.html
new file mode 100644
index 00000000000..acb91569e1c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-contains-text-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid div-contains-text</title>
+<dl><div>x</div><dt>2<dd>b</div></dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-multiple-groups-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-multiple-groups-novalid.html
new file mode 100644
index 00000000000..ff0d5bc3017
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-multiple-groups-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid div-multiple-groups</title>
+<dl><div><dt>1<dd>a<dt>2<dd>a<dd>b<dt>3<dt>4<dt>5<dd>a</div></dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-splitting-groups-2-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-splitting-groups-2-novalid.html
new file mode 100644
index 00000000000..f490502118b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-splitting-groups-2-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid div-splitting-groups-2</title>
+<dl><div><dt>1<dd>a</div><div><dd>b</div></dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-splitting-groups-3-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-splitting-groups-3-novalid.html
new file mode 100644
index 00000000000..aa2e4e16058
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-splitting-groups-3-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid div-splitting-groups-3</title>
+<dl><div><dt>1</div><div><dt>2<dd>b</div></dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-splitting-groups-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-splitting-groups-novalid.html
new file mode 100644
index 00000000000..5164e2f268a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/div-splitting-groups-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid div-splitting-groups</title>
+<dl><div><dt>1</div><div><dd>a</div></dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dl-contains-dl-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dl-contains-dl-novalid.html
new file mode 100644
index 00000000000..d893e9beac2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dl-contains-dl-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid dl-contains-dl</title>
+<dl><dt>1<dd>a</dd><dl></dl></dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dl-contains-text-2-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dl-contains-text-2-novalid.html
new file mode 100644
index 00000000000..84847551aa1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dl-contains-text-2-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid dl-contains-text-2</title>
+<dl><dt>1<dd>a</dd>x</dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dl-contains-text-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dl-contains-text-novalid.html
new file mode 100644
index 00000000000..2113207edfb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dl-contains-text-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid dl-contains-text</title>
+<dl><dt>1</dt>x</dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dl-in-p-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dl-in-p-novalid.html
new file mode 100644
index 00000000000..b1053418404
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dl-in-p-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid dl-in-p</title>
+<p><dl><dt>text<dd>text</dl></p> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dl-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dl-isvalid.html
new file mode 100644
index 00000000000..9bd331c9139
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dl-isvalid.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>valid dl</title>
+<template><dl><dt>text<dd>text</dl></template> <!-- parent-template-in-head -->
+<body>
+<dl><dt>text<dd><h1>text</h1></dl> <!-- h1-in-dd -->
+<dl><div><dt>1</dt><template></template><dd>a</div></dl> <!-- div-template-2 -->
+<dl><dt>text<dd><section><h2>text</h2></section></dl> <!-- section-in-dd -->
+<dl><div><dt>1<dd>a</div><script></script></dl> <!-- div-script -->
+<dl><dt>1<dd><dl><dt>2<dd>a</dl></dl> <!-- dl-in-dd -->
+<dl><dt><dd></dl> <!-- empty-dt-dd -->
+<dl><div><dt>1<dd>a</div><template></template></dl> <!-- div-template -->
+<dl><dt>text<dd>text</dl> <!-- basic -->
+<dl><script></script></dl> <!-- script -->
+<dl><div><dt>1<dd>a</div></dl> <!-- div-basic -->
+<dl><dt>1<dd>a<dt>2<dd>a<dd>b<dt>3<dt>4<dt>5<dd>a</dl> <!-- multiple-groups -->
+<dl><dt>text<dd><header>text</header></dl> <!-- header-in-dd -->
+<dl><dt><dl><dt>1<dd>a</dl><dd>b</dl> <!-- dl-in-dt -->
+<dl><dt>1</dt><script></script><dd>a</dl> <!-- dt-script-dd -->
+<dl></dl> <!-- empty -->
+<dl><div><dt>1<dd>a</div><div><dt>2<dd>a<dd>b</div><div><dt>3<dt>4<dt>5<dd>a</div></dl> <!-- div-multiple-groups -->
+<dl><div><dt>1</dt><script></script><dd>a</div></dl> <!-- div-script-2 -->
+<dl><dt>1</dt><template></template><dd>a</dl> <!-- dt-template-dd -->
+<dl><dt>text<dd><h6>text</h6></dl> <!-- h6-in-dd -->
+<dl><dt>text<dd><h2>text</h2></dl> <!-- h2-in-dd -->
+<dl><dt>text<dd><nav><h2>text</h2></nav></dl> <!-- nav-in-dd -->
+<dl><dt><p>1<p>1<dd>a</dl> <!-- p-in-dt -->
+<dl><dt>text<dd><article><h2>text</h2></article></dl> <!-- article-in-dd -->
+<dl><dt>text<dd><footer>text</footer></dl> <!-- footer-in-dd -->
+<dl><dt>text<dd><h4>text</h4></dl> <!-- h4-in-dd -->
+<dl><dt>text<dd><h5>text</h5></dl> <!-- h5-in-dd -->
+<dl><dt>text<dd><aside><h2>text</h2></aside></dl> <!-- aside-in-dd -->
+<dl><dt>text<dd><h3>text</h3></dl> <!-- h3-in-dd -->
+<dl><dt><a href='#'>1</a><dd><a href='#'>a</a></dl> <!-- interactive -->
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dt-in-template-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dt-in-template-novalid.html
new file mode 100644
index 00000000000..da0526906db
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/dt-in-template-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid dt-in-template</title>
+<dl><template><dt>1</dt></template><dd>a</dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/empty-div-2-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/empty-div-2-novalid.html
new file mode 100644
index 00000000000..54d9e68fa19
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/empty-div-2-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid empty-div-2</title>
+<dl><div></div><div><dt>2<dd>b</div></dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/empty-div-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/empty-div-novalid.html
new file mode 100644
index 00000000000..14211f3b015
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/empty-div-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid empty-div</title>
+<dl><div></div></dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/first-dd-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/first-dd-novalid.html
new file mode 100644
index 00000000000..98604399ac6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/first-dd-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid first-dd</title>
+<dl><dd>a<dt>2<dd>b</dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/footer-in-dt-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/footer-in-dt-novalid.html
new file mode 100644
index 00000000000..a24cc0b18de
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/footer-in-dt-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid footer-in-dt</title>
+<dl><dt><footer>text</footer><dd>text</dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h1-in-dt-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h1-in-dt-novalid.html
new file mode 100644
index 00000000000..3e8729cf6e2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h1-in-dt-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid h1-in-dt</title>
+<dl><dt><h1>text</h1><dd>text</dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h2-in-dt-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h2-in-dt-novalid.html
new file mode 100644
index 00000000000..32d5088005d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h2-in-dt-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid h2-in-dt</title>
+<dl><dt><h2>text</h2><dd>text</dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h3-in-dt-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h3-in-dt-novalid.html
new file mode 100644
index 00000000000..ec22819c119
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h3-in-dt-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid h3-in-dt</title>
+<dl><dt><h3>text</h3><dd>text</dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h4-in-dt-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h4-in-dt-novalid.html
new file mode 100644
index 00000000000..5b621b1debd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h4-in-dt-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid h4-in-dt</title>
+<dl><dt><h4>text</h4><dd>text</dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h5-in-dt-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h5-in-dt-novalid.html
new file mode 100644
index 00000000000..21c603a9e3f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h5-in-dt-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid h5-in-dt</title>
+<dl><dt><h5>text</h5><dd>text</dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h6-in-dt-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h6-in-dt-novalid.html
new file mode 100644
index 00000000000..1c97cced77a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/h6-in-dt-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid h6-in-dt</title>
+<dl><dt><h6>text</h6><dd>text</dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/header-in-dt-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/header-in-dt-novalid.html
new file mode 100644
index 00000000000..2bc589b800a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/header-in-dt-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid header-in-dt</title>
+<dl><dt><header>text</header><dd>text</dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/hgroup-in-dt-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/hgroup-in-dt-novalid.html
new file mode 100644
index 00000000000..07165851adc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/hgroup-in-dt-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid hgroup-in-dt</title>
+<dl><dt><hgroup><h1>text</h1></hgroup><dd>text</dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/last-dt-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/last-dt-novalid.html
new file mode 100644
index 00000000000..83e2fec8a24
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/last-dt-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid last-dt</title>
+<dl><dt>1<dd>a<dt>2</dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/mixed-div-dt-dd-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/mixed-div-dt-dd-novalid.html
new file mode 100644
index 00000000000..c02808addb4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/mixed-div-dt-dd-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid mixed-div-dt-dd</title>
+<dl><div><dt>1<dd>a</div><dt>2<dd>b</dd></dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/mixed-dt-dd-div-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/mixed-dt-dd-div-novalid.html
new file mode 100644
index 00000000000..5ed4aedd151
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/mixed-dt-dd-div-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid mixed-dt-dd-div</title>
+<dl><dt>1<dd>a</dd><div><dt>2<dd>b</div></dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/model-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/model-isvalid.html
deleted file mode 100644
index c7a5de96c03..00000000000
--- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/model-isvalid.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset=utf-8>
- <title>Definition List: &lt;dl&gt; &lt;dt&gt; &lt;dd&gt;</title>
-</head>
-<body>
- <!-- is block -->
- <dl class="class" id="id" lang="en">
- <dt class="class" id="id2" lang="en">text</dt>
- <dd class="class" id="id3" lang="en">text</dd>
- </dl>
-
- <!-- can be empty -->
- <dl></dl>
- <dl>
- <dt></dt>
- <dd></dd>
- </dl>
-
- <!-- multiple groups, but always (dt+,dd+) -->
- <dl>
- <dt>text</dt>
- <dd>more text</dd>
- <dt>text</dt>
- <dd>more text</dd>
- <dd>more text</dd>
- <dt>text</dt>
- <dt>text</dt>
- <dt>text</dt>
- <dd>more text</dd>
- </dl>
-
- <!-- dd can contain structured inline, dt strictly inline -->
- <dl>
- <dt>some <em>text</em></dt>
- <dd>more <pre>text</pre></dd>
- </dl>
-
- <!-- dd can contain blocks -->
- <dl>
- <dt>some <em>text</em></dt>
- <dd>
- <p>more</p>
- <p>text</p>
- </dd>
- </dl>
-
- <!-- can contain interactive -->
- <dl>
- <dt>some <a>text</a></dt>
- <dd>more <a>text</a></dd>
- </dl>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/model-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/model-novalid.html
deleted file mode 100644
index 0eacdf8dbff..00000000000
--- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/model-novalid.html
+++ /dev/null
@@ -1,75 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset=utf-8>
- <title>Definition List: &lt;dl&gt; &lt;dt&gt; &lt;dd&gt;</title>
-</head>
-<body>
- <!-- is block -->
- <dl class="class" id="id" lang="en">
- <dt class="class" id="id" lang="en">text</dt>
- <dd class="class" id="id" lang="en">text</dd>
- </dl>
-
- <!-- is structured inline -->
- <p>paragraph
- <dl class="class" id="id" lang="en">
- <dt class="class" id="id" lang="en">text</dt>
- <dd class="class" id="id" lang="en">text</dd>
- </dl>
- </p>
-
- <!-- can be empty -->
- <dl></dl>
- <dl>
- <dt></dt>
- <dd></dd>
- </dl>
-
- <!-- multiple groups, but always (dt+,dd+) -->
- <dl>
- <dt>text</dt>
- <dd>more text</dd>
- <dt>text</dt>
- <dd>more text</dd>
- <dd>more text</dd>
- <dt>text</dt>
- <dt>text</dt>
- <dt>text</dt>
- <dd>more text</dd>
- </dl>
-
- <!-- dd can contain structured inline, dt strictly inline -->
- <dl>
- <dt>some <em>text</em></dt>
- <dd>more <pre>text</pre></dd>
- </dl>
- <p>paragraph
- <dl>
- <dt>some <em>text</em></dt>
- <dd>more <pre>text</pre></dd>
- </dl>
- </p>
-
- <!-- dd can contain blocks -->
- <dl>
- <dt>some <em>text</em></dt>
- <dd>
- <p>more</p>
- <p>text</p>
- </dd>
- </dl>
-
- <!-- can contain interactive -->
- <dl>
- <dt>some <a>text</a></dt>
- <dd>more <a>text</a></dd>
- </dl>
- <p>paragraph
- <dl>
- <dt>some <a>text</a></dt>
- <dd>more <a>text</a></dd>
- </dl>
- </p>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/nav-in-dt-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/nav-in-dt-novalid.html
new file mode 100644
index 00000000000..64e137d5156
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/nav-in-dt-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid nav-in-dt</title>
+<dl><dt><nav><h2>text</h2></nav><dd>text</dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/nested-divs-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/nested-divs-novalid.html
new file mode 100644
index 00000000000..ef3446d3a16
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/nested-divs-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid nested-divs</title>
+<dl><div><div><dt>1<dd>a</div></div></dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/only-dd-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/only-dd-novalid.html
new file mode 100644
index 00000000000..017795cc093
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/only-dd-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid only-dd</title>
+<dl><dd>a</dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/only-dt-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/only-dt-novalid.html
new file mode 100644
index 00000000000..7445214efe1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/only-dt-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid only-dt</title>
+<dl><dt>1</dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/section-in-dt-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/section-in-dt-novalid.html
new file mode 100644
index 00000000000..846ebbe35a3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/dl/section-in-dt-novalid.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>invalid section-in-dt</title>
+<dl><dt><section><h2>text</h2></section><dd>text</dl> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/messages.json b/tests/wpt/web-platform-tests/conformance-checkers/messages.json
index 70841a3f4f8..0ec6b541ff8 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/messages.json
+++ b/tests/wpt/web-platform-tests/conformance-checkers/messages.json
@@ -41,6 +41,46 @@
"html-rdfalite/0074-novalid.html": "Bad value \u201cdc:creator\u201d for attribute \u201crel\u201d on element \u201ca\u201d: Bad list of link-type keywords: The string \u201cdc:creator\u201d is not a registered keyword.",
"html-rdfalite/0147.novalid.html": "Attribute \u201cxmlns:xmlzzz\u201d not allowed here.",
"html-rdfalite/0319-novalid.html": "Attribute \u201cxmlns:xpr\u201d not allowed here.",
+ "html-svg/animate-elem-24-t-novalid.html": "Duplicate ID \u201cMyFont\u201d.",
+ "html-svg/animate-elem-77-t-novalid.html": "Element \u201ca\u201d is missing required attribute \u201chref\u201d.",
+ "html-svg/animate-pservers-grad-01-b-novalid.html": "Duplicate ID \u201ca7\u201d.",
+ "html-svg/conform-viewers-03-f-novalid.html": "Bad value \u201chttp://example.net/bar\u201d for the attribute \u201cxmlns:link\u201d (only \u201chttp://www.w3.org/1999/xlink\u201d permitted here).",
+ "html-svg/coords-dom-01-f-novalid.html": "Attribute \u201cxml:id\u201d not allowed on element \u201crect\u201d in this context.",
+ "html-svg/coords-dom-02-f-novalid.html": "Attribute \u201cxml:id\u201d not allowed on element \u201crect\u201d in this context.",
+ "html-svg/coords-transformattr-01-f-novalid.html": "A numeric character reference expanded to carriage return.",
+ "html-svg/extend-namespace-01-f-novalid.html": "Attribute \u201cxmlns:bd\u201d not allowed here.",
+ "html-svg/filters-color-02-b-novalid.html": "Element \u201cfeFuncR\u201d not allowed in this context. (The parent was element \u201cfeComponentTransfer\u201d.) Suppressing further errors from this subtree.",
+ "html-svg/filters-conv-02-f-novalid.html": "Element \u201cfeConvolveMatrix\u201d is missing required attribute \u201corder\u201d.",
+ "html-svg/filters-conv-04-f-novalid.html": "Element \u201cfeConvolveMatrix\u201d is missing required attribute \u201corder\u201d.",
+ "html-svg/filters-conv-05-f-novalid.html": "Element \u201cfeConvolveMatrix\u201d is missing required attribute \u201corder\u201d.",
+ "html-svg/filters-light-05-f-novalid.html": "Duplicate ID \u201cc1\u201d.",
+ "html-svg/fonts-glyph-04-t-novalid.html": "Element \u201cfont\u201d is missing required child element \u201cmissing-glyph\u201d.",
+ "html-svg/fonts-overview-201-t-novalid.html": "Attribute \u201cxmlns:xe\u201d not allowed here.",
+ "html-svg/interact-pointer-02-t-novalid.html": "Attribute \u201cx\u201d not allowed on element \u201cclipPath\u201d in this context.",
+ "html-svg/linking-a-09-b-novalid.html": "Element \u201ctspan\u201d not allowed in this context. (The parent was element \u201ca\u201d.) Suppressing further errors from this subtree.",
+ "html-svg/linking-a-10-f-novalid.html": "Element \u201ca\u201d is missing required attribute \u201chref\u201d.",
+ "html-svg/masking-filter-01-f-novalid.html": "Attribute \u201cfilterprimitiveunits\u201d not allowed on element \u201cfilter\u201d in this context.",
+ "html-svg/masking-intro-01-f-novalid.html": "Duplicate ID \u201ctest-title\u201d.",
+ "html-svg/metadata-example-01-t-novalid.html": "Attribute \u201cxmlns:prism\u201d not allowed here.",
+ "html-svg/painting-marker-04-f-novalid.html": "Attribute \u201cmarker\u201d not allowed on element \u201cg\u201d in this context.",
+ "html-svg/paths-data-18-f-novalid.html": "Bad value \u201cM 20 100 H 40#90\u201d for attribute \u201cd\u201d on element \u201cpath\u201d: Bad SVG path data: Expected command but found \u201c#\u201d (context: \u201cM 20 100 H 40#\u201d).",
+ "html-svg/paths-data-20-f-novalid.html": "Bad value \u201cM280,120 h25 a25,25 0 6 0 -25,25 z\u201d for attribute \u201cd\u201d on element \u201cpath\u201d: Bad SVG path data: Expected \u201c0\u201d or \u201c1\u201d for large-arc-flag for \u201ca\u201d command but found \u201c6\u201d instead (context: \u201c0,120 h25 a25,25 0 6\u201d).",
+ "html-svg/pservers-grad-23-f-novalid.html": "Attribute \u201cstop-color\u201d not allowed on element \u201crect\u201d in this context.",
+ "html-svg/script-specify-01-f-novalid.html": "Attribute \u201ccontentscripttype\u201d not allowed on element \u201csvg\u201d in this context.",
+ "html-svg/shapes-rect-03-t-novalid.html": "Attribute \u201cxml:id\u201d not allowed on element \u201crect\u201d in this context.",
+ "html-svg/struct-cond-02-t-haswarn.html": "Text run is not in Unicode Normalization Form C.",
+ "html-svg/struct-dom-17-f-novalid.html": "Element \u201crect\u201d is missing required attribute \u201cheight\u201d.",
+ "html-svg/struct-dom-19-f-novalid.html": "Element \u201crect\u201d is missing required attribute \u201cheight\u201d.",
+ "html-svg/struct-frag-05-t-novalid.html": "Bad value \u201chttp://www.example.org/notsvg\u201d for the attribute \u201cxmlns\u201d (only \u201chttp://www.w3.org/2000/svg\u201d permitted here).",
+ "html-svg/struct-image-12-b-novalid.html": "Duplicate ID \u201cimageSVG\u201d.",
+ "html-svg/struct-use-11-f-novalid.html": "Attribute \u201cfoo\u201d not allowed on element \u201ccircle\u201d in this context.",
+ "html-svg/struct-use-12-f-novalid.html": "Element \u201cuse\u201d not allowed in this context. (The parent was element \u201cuse\u201d.) Suppressing further errors from this subtree.",
+ "html-svg/styling-pres-02-f-novalid.html": "Attribute \u201cfill\u201d not allowed on element \u201cimage\u201d in this context.",
+ "html-svg/svgdom-over-01-f-novalid.html": "Element \u201cstop\u201d not allowed in this context. (The parent was element \u201cdefs\u201d.) Suppressing further errors from this subtree.",
+ "html-svg/text-dom-03-f-novalid.html": "Element \u201cfont\u201d is missing required child element \u201cmissing-glyph\u201d.",
+ "html-svg/text-fonts-03-t-novalid.html": "Element \u201cfont\u201d is missing required attribute \u201choriz-adv-x\u201d.",
+ "html-svg/text-fonts-05-f-novalid.html": "Attribute \u201cline-height\u201d not allowed on element \u201ctspan\u201d in this context.",
+ "html-svg/types-dom-04-b-novalid.html": "Attribute \u201cexternalresourcesrequired\u201d not allowed on element \u201csvg\u201d in this context.",
"html/attributes/accesskey/duplicate-key-labels-novalid.html": "Bad value \u201ca b \u306c c \u306c\u201d for attribute \u201caccesskey\u201d on element \u201ca\u201d: Bad key label list: Duplicate key label. Each key label must be unique.",
"html/attributes/accesskey/multi-character-key-label-novalid.html": "Bad value \u201ca b \u307b\u3052\u201d for attribute \u201caccesskey\u201d on element \u201ca\u201d: Bad key label list: Key label has multiple characters. Each key label must be a single character.",
"html/attributes/data/no-characters-after-hyphen-novalid.html": "Attribute \u201cdata-\u201d not allowed on element \u201cp\u201d in this context.",
@@ -618,7 +658,40 @@
"html/elements/dfn/model-novalid.html": "End tag \u201cp\u201d implied, but there were open elements.",
"html/elements/dialog/model-novalid.html": "Element \u201cdt\u201d not allowed in this context. (The parent was element \u201cdialog\u201d.) Suppressing further errors from this subtree.",
"html/elements/div/model-novalid.html": "End tag \u201cp\u201d implied, but there were open elements.",
- "html/elements/dl/model-novalid.html": "Duplicate ID \u201cid\u201d.",
+ "html/elements/dl/article-in-dt-novalid.html": "The element \u201carticle\u201d must not appear as a descendant of the \u201cdt\u201d element.",
+ "html/elements/dl/aside-in-dt-novalid.html": "The element \u201caside\u201d must not appear as a descendant of the \u201cdt\u201d element.",
+ "html/elements/dl/dd-in-template-novalid.html": "Element \u201ctemplate\u201d is missing a required child element.",
+ "html/elements/dl/div-contains-dl-novalid.html": "Element \u201cdl\u201d not allowed in this context. (The parent was element \u201cdiv\u201d.) Suppressing further errors from this subtree.",
+ "html/elements/dl/div-contains-text-novalid.html": "Text not allowed in element \u201cdiv\u201d in this context.",
+ "html/elements/dl/div-multiple-groups-novalid.html": "Element \u201cdt\u201d not allowed in this context. (The parent was element \u201cdiv\u201d.) Suppressing further errors from this subtree.",
+ "html/elements/dl/div-splitting-groups-2-novalid.html": "Element \u201cdiv\u201d is missing required child element \u201cdt\u201d.",
+ "html/elements/dl/div-splitting-groups-3-novalid.html": "Element \u201cdiv\u201d is missing required child element \u201cdd\u201d.",
+ "html/elements/dl/div-splitting-groups-novalid.html": "Element \u201cdiv\u201d is missing required child element \u201cdd\u201d.",
+ "html/elements/dl/dl-contains-dl-novalid.html": "Element \u201cdl\u201d not allowed in this context. (The parent was element \u201cdl\u201d.) Suppressing further errors from this subtree.",
+ "html/elements/dl/dl-contains-text-2-novalid.html": "Text not allowed in element \u201cdl\u201d in this context.",
+ "html/elements/dl/dl-contains-text-novalid.html": "Text not allowed in element \u201cdl\u201d in this context.",
+ "html/elements/dl/dl-in-p-novalid.html": "No \u201cp\u201d element in scope but a \u201cp\u201d end tag seen.",
+ "html/elements/dl/dt-in-template-novalid.html": "Element \u201ctemplate\u201d is missing required child element \u201cdd\u201d.",
+ "html/elements/dl/empty-div-2-novalid.html": "Element \u201cdiv\u201d is missing required child element \u201cdd\u201d.",
+ "html/elements/dl/empty-div-novalid.html": "Element \u201cdiv\u201d is missing required child element \u201cdd\u201d.",
+ "html/elements/dl/first-dd-novalid.html": "Element \u201cdl\u201d is missing a required child element.",
+ "html/elements/dl/footer-in-dt-novalid.html": "The element \u201cfooter\u201d must not appear as a descendant of the \u201cdt\u201d element.",
+ "html/elements/dl/h1-in-dt-novalid.html": "The element \u201ch1\u201d must not appear as a descendant of the \u201cdt\u201d element.",
+ "html/elements/dl/h2-in-dt-novalid.html": "The element \u201ch2\u201d must not appear as a descendant of the \u201cdt\u201d element.",
+ "html/elements/dl/h3-in-dt-novalid.html": "The element \u201ch3\u201d must not appear as a descendant of the \u201cdt\u201d element.",
+ "html/elements/dl/h4-in-dt-novalid.html": "The element \u201ch4\u201d must not appear as a descendant of the \u201cdt\u201d element.",
+ "html/elements/dl/h5-in-dt-novalid.html": "The element \u201ch5\u201d must not appear as a descendant of the \u201cdt\u201d element.",
+ "html/elements/dl/h6-in-dt-novalid.html": "The element \u201ch6\u201d must not appear as a descendant of the \u201cdt\u201d element.",
+ "html/elements/dl/header-in-dt-novalid.html": "The element \u201cheader\u201d must not appear as a descendant of the \u201cdt\u201d element.",
+ "html/elements/dl/hgroup-in-dt-novalid.html": "The element \u201chgroup\u201d must not appear as a descendant of the \u201cdt\u201d element.",
+ "html/elements/dl/last-dt-novalid.html": "Element \u201cdl\u201d is missing required child element \u201cdd\u201d.",
+ "html/elements/dl/mixed-div-dt-dd-novalid.html": "Element \u201cdt\u201d not allowed in this context. (The parent was element \u201cdl\u201d.) Suppressing further errors from this subtree.",
+ "html/elements/dl/mixed-dt-dd-div-novalid.html": "Element \u201cdiv\u201d not allowed in this context. (The parent was element \u201cdl\u201d.) Suppressing further errors from this subtree.",
+ "html/elements/dl/nav-in-dt-novalid.html": "The element \u201cnav\u201d must not appear as a descendant of the \u201cdt\u201d element.",
+ "html/elements/dl/nested-divs-novalid.html": "Element \u201cdiv\u201d not allowed in this context. (The parent was element \u201cdiv\u201d.) Suppressing further errors from this subtree.",
+ "html/elements/dl/only-dd-novalid.html": "Element \u201cdl\u201d is missing a required child element.",
+ "html/elements/dl/only-dt-novalid.html": "Element \u201cdl\u201d is missing required child element \u201cdd\u201d.",
+ "html/elements/dl/section-in-dt-novalid.html": "The element \u201csection\u201d must not appear as a descendant of the \u201cdt\u201d element.",
"html/elements/em/model-novalid.html": "End tag \u201cp\u201d implied, but there were open elements.",
"html/elements/embed/height-novalid.html": "Bad value \u201c20%\u201d for attribute \u201cheight\u201d on element \u201cembed\u201d: Bad non-negative integer: Expected a digit but saw \u201c%\u201d instead.",
"html/elements/embed/src-empty-novalid.html": "Bad value \u201c\u201d for attribute \u201csrc\u201d on element \u201cembed\u201d: Bad URL: Must be non-empty.",
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/tools/build-svg-tests.py b/tests/wpt/web-platform-tests/conformance-checkers/tools/build-svg-tests.py
index c212e78896b..3986a8dca41 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/tools/build-svg-tests.py
+++ b/tests/wpt/web-platform-tests/conformance-checkers/tools/build-svg-tests.py
@@ -21,9 +21,9 @@
# DEALINGS IN THE SOFTWARE.
"""build_svg_tests.py.
-
+
This script builds a set of SVG-in-HTML test files for the Nu Html Checker
-based on the SVG 1.1 Second Edition Test Suite
+based on the SVG 1.1 Second Edition Test Suite
http://www.w3.org/Graphics/SVG/Test/20110816/archives/W3C_SVG_11_TestSuite.tar.gz
"""
@@ -38,7 +38,7 @@ import urllib2
valid_svg_files = dict([
# these entries manually added after cross checking behaviour with spec
-
+
# VNU warns about text not in Unicode Normalization Form C, but it's not an error
('struct-cond-02-t-manual.svg', 'Source text is not in Unicode Normalization Form C'),
# FiLl, fill and FILL are all valid in case-insensitive HTML (but SVG DTD is case-sensitive)
@@ -46,22 +46,17 @@ valid_svg_files = dict([
])
# some files in the SVG 1.1 test suite don't validate against the SVG 1.1 DTD
-# and some files are marked as version='SVG 1.2'.
+# and some files are marked as version='SVG 1.2'.
# this is used to toggle between -isvalid.html and -novalid.html output
-
+
invalid_svg_files = dict([
# 'DTD Invalid' entries are produced by calling validate_svg_dtd (see below)
- ('animate-dom-01-f-manual.svg', 'DTD Invalid'),
- ('animate-dom-02-f-manual.svg', 'DTD Invalid'),
('animate-elem-24-t-manual.svg', 'DTD Invalid'),
('animate-elem-77-t-manual.svg', 'DTD Invalid'),
('animate-pservers-grad-01-b-manual.svg', 'DTD Invalid'),
- ('animate-script-elem-01-b-manual.svg', 'DTD Invalid'),
- ('animate-struct-dom-01-b-manual.svg', 'DTD Invalid'),
('conform-viewers-03-f-manual.svg', 'DTD Invalid'),
('coords-dom-01-f-manual.svg', 'DTD Invalid'),
('coords-dom-02-f-manual.svg', 'DTD Invalid'),
- ('coords-dom-03-f-manual.svg', 'DTD Invalid'),
('extend-namespace-01-f-manual.svg', 'DTD Invalid'),
('filters-color-02-b-manual.svg', 'DTD Invalid'),
('filters-conv-02-f-manual.svg', 'DTD Invalid'),
@@ -69,66 +64,36 @@ invalid_svg_files = dict([
('filters-conv-05-f-manual.svg', 'DTD Invalid'),
('filters-light-05-f-manual.svg', 'DTD Invalid'),
('fonts-glyph-04-t-manual.svg', 'DTD Invalid'),
- ('interact-events-02-b-manual.svg', 'DTD Invalid'),
- ('interact-pevents-01-b-manual.svg', 'DTD Invalid'),
- ('interact-pevents-03-b-manual.svg', 'DTD Invalid'),
- ('interact-pevents-05-b-manual.svg', 'DTD Invalid'),
- ('interact-pevents-07-t-manual.svg', 'DTD Invalid'),
- ('interact-pevents-08-f-manual.svg', 'DTD Invalid'),
- ('interact-pevents-09-f-manual.svg', 'DTD Invalid'),
- ('interact-pointer-01-t-manual.svg', 'DTD Invalid'),
('interact-pointer-02-t-manual.svg', 'DTD Invalid'),
- ('interact-pointer-03-t-manual.svg', 'DTD Invalid'),
('linking-a-09-b-manual.svg', 'DTD Invalid'),
('linking-a-10-f-manual.svg', 'DTD Invalid'),
('masking-filter-01-f-manual.svg', 'DTD Invalid'),
('masking-intro-01-f-manual.svg', 'DTD Invalid'),
- ('masking-path-09-b-manual.svg', 'DTD Invalid'),
('painting-marker-04-f-manual.svg', 'DTD Invalid'),
('paths-data-18-f-manual.svg', 'DTD Invalid'),
('paths-data-20-f-manual.svg', 'DTD Invalid'),
- ('paths-dom-01-f-manual.svg', 'DTD Invalid'),
- ('paths-dom-02-f-manual.svg', 'DTD Invalid'),
('pservers-grad-23-f-manual.svg', 'DTD Invalid'),
('render-elems-03-t-manual.svg', 'DTD Invalid'),
('shapes-rect-03-t-manual.svg', 'DTD Invalid'),
('struct-cond-02-t-manual.svg', 'DTD Invalid'),
- ('struct-dom-07-f-manual.svg', 'DTD Invalid'),
- ('struct-dom-08-f-manual.svg', 'DTD Invalid'),
- ('struct-dom-11-f-manual.svg', 'DTD Invalid'),
- ('struct-dom-13-f-manual.svg', 'DTD Invalid'),
- ('struct-dom-14-f-manual.svg', 'DTD Invalid'),
- ('struct-dom-15-f-manual.svg', 'DTD Invalid'),
('struct-dom-17-f-manual.svg', 'DTD Invalid'),
('struct-dom-19-f-manual.svg', 'DTD Invalid'),
- ('struct-dom-20-f-manual.svg', 'DTD Invalid'),
('struct-frag-05-t-manual.svg', 'DTD Invalid'),
('struct-image-12-b-manual.svg', 'DTD Invalid'),
('struct-use-11-f-manual.svg', 'DTD Invalid'),
('struct-use-12-f-manual.svg', 'DTD Invalid'),
- ('struct-use-13-f-manual.svg', 'DTD Invalid'),
('styling-css-10-f-manual.svg', 'DTD Invalid'),
('styling-pres-02-f-manual.svg', 'DTD Invalid'),
('svgdom-over-01-f-manual.svg', 'DTD Invalid'),
- ('text-dom-02-f-manual.svg', 'DTD Invalid'),
('text-dom-03-f-manual.svg', 'DTD Invalid'),
- ('text-dom-05-f-manual.svg', 'DTD Invalid'),
('text-fonts-03-t-manual.svg', 'DTD Invalid'),
('text-fonts-05-f-manual.svg', 'DTD Invalid'),
('text-tref-02-b-manual.svg', 'DTD Invalid'),
- ('text-tselect-02-f-manual.svg', 'DTD Invalid'),
- ('text-tselect-03-f-manual.svg', 'DTD Invalid'),
- ('types-dom-02-f-manual.svg', 'DTD Invalid'),
- ('types-dom-03-b-manual.svg', 'DTD Invalid'),
('types-dom-04-b-manual.svg', 'DTD Invalid'),
- ('types-dom-05-b-manual.svg', 'DTD Invalid'),
- ('types-dom-07-f-manual.svg', 'DTD Invalid'),
- ('types-dom-08-f-manual.svg', 'DTD Invalid'),
-
+
# these entries manually added after cross checking behaviour with spec
# note there are some confusing differences between w:iri-ref (used in HTML for img/@src)
# and xsd:anyURI (used in SVG for image/@xlink:href)
- ('animate-elem-40-t-manual.svg', 'Spaces in data: URI - not allowed by URL Standard or RFC 2397.'),
('conform-viewers-02-f-manual.svg', 'Newlines in data: URI - not allowed by URL Standard or RFC 2397.'),
('coords-transformattr-01-f-manual.svg', 'Numeric character reference expanded to carriage return - not allowed in HTML5 - see 8.1.4'),
('fonts-overview-201-t-manual.svg', 'Unsupported SVG version specified - specifies SVG 1.2'),
@@ -140,59 +105,30 @@ invalid_svg_files = dict([
# TODO Github Issue #216 MathML and SVG uses xsd:anyURI, HTML URLs use URL Standard
# TODO Github Issue #217 NU has script/@type optional for HTML, but not SVG-in-HTML
-def build_html_testfiles(svgdirectory,htmldirectory):
+def build_html_testfiles(svgdirectory,htmldirectory):
"""Builds HTML test files from SVG test suite folder."""
logging.debug('build_html_testfiles: IN')
-
+
testfiles = []
-
+
for filename in os.listdir(svgdirectory):
#logging.debug(filename)
- if filename.endswith(".svg"):
+ if filename.endswith(".svg"):
htmlpathname = build_html_test_file(filename, svgdirectory, htmldirectory)
if htmlpathname:
testfiles.append(htmlpathname)
pass
pass
- indexpathname = "index-isvalid.html"
- build_html_index_file(indexpathname, testfiles)
-
-
-def build_html_index_file(indexpathname, testfiles):
- """Builds HTML test index."""
-
- htmlfile = open(indexpathname, "w")
-
- htmlfile.write("<!DOCTYPE html>\n")
- htmlfile.write("<html lang='en'>\n")
-
- htmlfile.write("<head>\n")
- htmlfile.write(" <title>SVG in HTML Test Index</title>\n")
- htmlfile.write(" <meta charset='utf-8'>\n")
- htmlfile.write("</head>\n")
-
- htmlfile.write("<body>\n")
- htmlfile.write("<h1>SVG in HTML Test Index</h1>\n")
-
- for filename in testfiles:
- if filename.find("-isvalid") > 0:
- htmlfile.write(" <p><a href='%s'>%s</a></p>\n" % (filename, filename))
-
- htmlfile.write("</body>\n")
- htmlfile.write("</html>\n")
- htmlfile.close()
-
-
-def build_html_test_file(filename, svgdirectory, htmldirectory):
+def build_html_test_file(filename, svgdirectory, htmldirectory):
"""Builds HTML test file by wrapping input SVG in boilerplate HTML."""
svgpathname = svgdirectory + "/" + filename
# valid_svg_file overrides invalid_svg_files (may invalid in case-sensitive XML but valid in case-insensitive HTML)
- if invalid_svg_files.has_key(filename) and not valid_svg_files.has_key(filename):
+ if invalid_svg_files.has_key(filename) and not valid_svg_files.has_key(filename):
htmlpathname = htmldirectory + "/" + filename.replace( "-manual.svg", "-novalid.html")
else:
htmlpathname = htmldirectory + "/" + filename.replace( "-manual.svg", "-isvalid.html")
@@ -201,7 +137,7 @@ def build_html_test_file(filename, svgdirectory, htmldirectory):
logging.debug(htmlpathname)
# read SVG data
- svgfile = open(svgpathname, "r")
+ svgfile = open(svgpathname, "rU")
svg = svgfile.read()
svgfile.close()
@@ -210,11 +146,11 @@ def build_html_test_file(filename, svgdirectory, htmldirectory):
svgbefore = svg.split("<d:SVGTestCase")[0];
svgafter = svg.split("</d:SVGTestCase>")[1];
svg = svgbefore + svgafter
-
+
# ignore files with SVG DOCTYPE and !ENTITY declarations (unsupported in HTML)
if svg.find( "<!DOCTYPE" ) != -1:
return
-
+
# uncomment these 2 lines to generate 'DTD Invalid' entries for invalid_svg_files dict above
# very slow operation - only needs done if the SVG test suite ever changes
# when uncommented expect to see AttributeError: 'NoneType' object has no attribute 'find'
@@ -233,30 +169,30 @@ def build_html_test_file(filename, svgdirectory, htmldirectory):
htmlfile.write("<body>\n")
htmlfile.write(" <h1>Source SVG: %s</h1>\n" % os.path.basename(svgpathname) )
-
+
# insert SVG without any XML processing to avoid unexpected transformations on
# encoding and entity refs, but remove <d:SVGTestCase> from file (not valid in HTML)
htmlfile.write(svgbefore)
htmlfile.write(svgafter)
-
+
htmlfile.write("</body>\n")
htmlfile.write("</html>\n")
htmlfile.close()
-
+
return htmlpathname
def create_dir_if_missing(directory):
"""Create the given directory if it doesn't exist"""
-
+
d = os.path.dirname(directory)
if not os.path.exists(directory):
os.makedirs(directory)
-
-
+
+
def validate_svg_dtd(filename,svg):
"""Prints legacy DTD markup validation status to stdout in a format suitable for pasting into invalid_svg_files dict above."""
-
+
# setup multipart/form-data POST body
body = ''
body = body + '--AaB03x\r\n'
@@ -271,17 +207,17 @@ def validate_svg_dtd(filename,svg):
body = body + '\r\n'
body = body + '--AaB03x--\r\n'
- # send request to W3 DTD validator for SVG 1.1 validation
- headers = { "Content-type" : "multipart/form-data; boundary=AaB03x", "Content-length" : len(body) }
+ # send request to W3 DTD validator for SVG 1.1 validation
+ headers = { "Content-type" : "multipart/form-data; boundary=AaB03x", "Content-length" : len(body) }
request = urllib2.Request("http://validator.w3.org/check?charset=utf-8&doctype=SVG+1.1&output=json", data=body, headers=headers)
response = urllib2.urlopen(request, timeout=60)
-
+
status = response.info().getheader('X-W3C-Validator-Status')
logging.debug(status)
-
+
if status == "Valid":
return True
-
+
print " ('%s', 'DTD %s')," % (filename, status)
return False
@@ -290,15 +226,16 @@ def main():
#logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logging.debug('main: IN')
-
- svgdirectory = "../../svg/import"
- htmldirectory = "../html-svg"
+
+ ccdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+ svgdirectory = os.path.join(os.path.dirname(ccdir), "svg", "import")
+ htmldirectory = os.path.join(ccdir, "html-svg")
try:
opts, args = getopt.getopt(sys.argv[1:],"",["svgdir=","outdir="])
except getopt.GetoptError:
print 'build-svg-tests.py --svgdir <indir> --outdir <outdir>'
- sys.exit(2)
+ sys.exit(2)
for opt, arg in opts:
print opt, arg
@@ -306,10 +243,10 @@ def main():
svgdirectory = arg
elif opt in ("-o", "--outdir"):
htmldirectory = arg
-
-
+
+
create_dir_if_missing(htmldirectory)
build_html_testfiles(svgdirectory, htmldirectory)
-
-
-main() \ No newline at end of file
+
+
+main()
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/tools/dl.py b/tests/wpt/web-platform-tests/conformance-checkers/tools/dl.py
new file mode 100644
index 00000000000..7b6beeb97e6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/conformance-checkers/tools/dl.py
@@ -0,0 +1,99 @@
+# -*- coding: utf-8 -*-
+import os
+ccdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+template = """<!DOCTYPE html>
+<meta charset=utf-8>
+"""
+
+errors = {
+ "dl-in-p": "<p><dl><dt>text<dd>text</dl></p>",
+ "header-in-dt": "<dl><dt><header>text</header><dd>text</dl>",
+ "footer-in-dt": "<dl><dt><footer>text</footer><dd>text</dl>",
+ "article-in-dt": "<dl><dt><article><h2>text</h2></article><dd>text</dl>",
+ "aside-in-dt": "<dl><dt><aside><h2>text</h2></aside><dd>text</dl>",
+ "nav-in-dt": "<dl><dt><nav><h2>text</h2></nav><dd>text</dl>",
+ "section-in-dt": "<dl><dt><section><h2>text</h2></section><dd>text</dl>",
+ "h1-in-dt": "<dl><dt><h1>text</h1><dd>text</dl>",
+ "h2-in-dt": "<dl><dt><h2>text</h2><dd>text</dl>",
+ "h3-in-dt": "<dl><dt><h3>text</h3><dd>text</dl>",
+ "h4-in-dt": "<dl><dt><h4>text</h4><dd>text</dl>",
+ "h5-in-dt": "<dl><dt><h5>text</h5><dd>text</dl>",
+ "h6-in-dt": "<dl><dt><h6>text</h6><dd>text</dl>",
+ "hgroup-in-dt": "<dl><dt><hgroup><h1>text</h1></hgroup><dd>text</dl>",
+ "only-dt": "<dl><dt>1</dl>",
+ "only-dd": "<dl><dd>a</dl>",
+ "first-dd": "<dl><dd>a<dt>2<dd>b</dl>",
+ "last-dt": "<dl><dt>1<dd>a<dt>2</dl>",
+ "dd-in-template": "<dl><dt>1</dt><template><dd>a</dd></template></dl>",
+ "dt-in-template": "<dl><template><dt>1</dt></template><dd>a</dl>",
+ "dl-contains-text": "<dl><dt>1</dt>x</dl>",
+ "dl-contains-text-2": "<dl><dt>1<dd>a</dd>x</dl>",
+ "dl-contains-dl": "<dl><dt>1<dd>a</dd><dl></dl></dl>",
+ # div
+ "empty-div": "<dl><div></div></dl>",
+ "empty-div-2": "<dl><div></div><div><dt>2<dd>b</div></dl>",
+ "mixed-dt-dd-div": "<dl><dt>1<dd>a</dd><div><dt>2<dd>b</div></dl>",
+ "mixed-div-dt-dd": "<dl><div><dt>1<dd>a</div><dt>2<dd>b</dd></dl>",
+ "nested-divs": "<dl><div><div><dt>1<dd>a</div></div></dl>",
+ "div-splitting-groups": "<dl><div><dt>1</div><div><dd>a</div></dl>",
+ "div-splitting-groups-2": "<dl><div><dt>1<dd>a</div><div><dd>b</div></dl>",
+ "div-splitting-groups-3": "<dl><div><dt>1</div><div><dt>2<dd>b</div></dl>",
+ "div-contains-text": "<dl><div>x</div><dt>2<dd>b</div></dl>",
+ "div-contains-dl": "<dl><div><dl></dl></div><dt>2<dd>b</div></dl>",
+ "div-multiple-groups": "<dl><div><dt>1<dd>a<dt>2<dd>a<dd>b<dt>3<dt>4<dt>5<dd>a</div></dl>",
+}
+
+non_errors_in_head = {
+ "parent-template-in-head": "<template><dl><dt>text<dd>text</dl></template>",
+}
+
+non_errors = {
+ "basic": "<dl><dt>text<dd>text</dl>",
+ "empty": "<dl></dl>",
+ "empty-dt-dd": "<dl><dt><dd></dl>",
+ "multiple-groups": "<dl><dt>1<dd>a<dt>2<dd>a<dd>b<dt>3<dt>4<dt>5<dd>a</dl>",
+ "header-in-dd": "<dl><dt>text<dd><header>text</header></dl>",
+ "footer-in-dd": "<dl><dt>text<dd><footer>text</footer></dl>",
+ "article-in-dd": "<dl><dt>text<dd><article><h2>text</h2></article></dl>",
+ "aside-in-dd": "<dl><dt>text<dd><aside><h2>text</h2></aside></dl>",
+ "nav-in-dd": "<dl><dt>text<dd><nav><h2>text</h2></nav></dl>",
+ "section-in-dd": "<dl><dt>text<dd><section><h2>text</h2></section></dl>",
+ "h1-in-dd": "<dl><dt>text<dd><h1>text</h1></dl>",
+ "h2-in-dd": "<dl><dt>text<dd><h2>text</h2></dl>",
+ "h3-in-dd": "<dl><dt>text<dd><h3>text</h3></dl>",
+ "h4-in-dd": "<dl><dt>text<dd><h4>text</h4></dl>",
+ "h5-in-dd": "<dl><dt>text<dd><h5>text</h5></dl>",
+ "h6-in-dd": "<dl><dt>text<dd><h6>text</h6></dl>",
+ "p-in-dt": "<dl><dt><p>1<p>1<dd>a</dl>",
+ "dl-in-dt": "<dl><dt><dl><dt>1<dd>a</dl><dd>b</dl>",
+ "dl-in-dd": "<dl><dt>1<dd><dl><dt>2<dd>a</dl></dl>",
+ "interactive": "<dl><dt><a href='#'>1</a><dd><a href='#'>a</a></dl>",
+ "script": "<dl><script></script></dl>",
+ "dt-script-dd": "<dl><dt>1</dt><script></script><dd>a</dl>",
+ "dt-template-dd": "<dl><dt>1</dt><template></template><dd>a</dl>",
+ # div
+ "div-basic": "<dl><div><dt>1<dd>a</div></dl>",
+ "div-script": "<dl><div><dt>1<dd>a</div><script></script></dl>",
+ "div-script-2": "<dl><div><dt>1</dt><script></script><dd>a</div></dl>",
+ "div-template": "<dl><div><dt>1<dd>a</div><template></template></dl>",
+ "div-template-2": "<dl><div><dt>1</dt><template></template><dd>a</div></dl>",
+ "div-multiple-groups": "<dl><div><dt>1<dd>a</div><div><dt>2<dd>a<dd>b</div><div><dt>3<dt>4<dt>5<dd>a</div></dl>",
+}
+
+for key in errors.keys():
+ template_error = template
+ template_error += '<title>invalid %s</title>\n' % key
+ template_error += errors[key]
+ file = open(os.path.join(ccdir, "html/elements/dl/%s-novalid.html" % key), 'wb')
+ file.write(template_error)
+ file.close()
+
+file = open(os.path.join(ccdir, "html/elements/dl/dl-isvalid.html"), 'wb')
+file.write(template + '<title>valid dl</title>\n')
+for key in non_errors_in_head.keys():
+ file.write('%s <!-- %s -->\n' % (non_errors_in_head[key], key))
+file.write('<body>\n')
+for key in non_errors.keys():
+ file.write('%s <!-- %s -->\n' % (non_errors[key], key))
+file.close()
+# vim: ts=4:sw=4
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/tools/index-isvalid.html b/tests/wpt/web-platform-tests/conformance-checkers/tools/index-isvalid.html
deleted file mode 100644
index 5f3e02fc0ba..00000000000
--- a/tests/wpt/web-platform-tests/conformance-checkers/tools/index-isvalid.html
+++ /dev/null
@@ -1,451 +0,0 @@
-<!DOCTYPE html>
-<html lang='en'>
-<head>
- <title>SVG in HTML Test Index</title>
- <meta charset='utf-8'>
-</head>
-<body>
-<h1>SVG in HTML Test Index</h1>
- <p><a href='../html-svg/animate-elem-02-t-isvalid.html'>../html-svg/animate-elem-02-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-03-t-isvalid.html'>../html-svg/animate-elem-03-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-04-t-isvalid.html'>../html-svg/animate-elem-04-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-05-t-isvalid.html'>../html-svg/animate-elem-05-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-06-t-isvalid.html'>../html-svg/animate-elem-06-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-07-t-isvalid.html'>../html-svg/animate-elem-07-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-08-t-isvalid.html'>../html-svg/animate-elem-08-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-09-t-isvalid.html'>../html-svg/animate-elem-09-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-10-t-isvalid.html'>../html-svg/animate-elem-10-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-11-t-isvalid.html'>../html-svg/animate-elem-11-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-12-t-isvalid.html'>../html-svg/animate-elem-12-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-13-t-isvalid.html'>../html-svg/animate-elem-13-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-14-t-isvalid.html'>../html-svg/animate-elem-14-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-15-t-isvalid.html'>../html-svg/animate-elem-15-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-17-t-isvalid.html'>../html-svg/animate-elem-17-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-19-t-isvalid.html'>../html-svg/animate-elem-19-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-20-t-isvalid.html'>../html-svg/animate-elem-20-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-21-t-isvalid.html'>../html-svg/animate-elem-21-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-22-b-isvalid.html'>../html-svg/animate-elem-22-b-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-23-t-isvalid.html'>../html-svg/animate-elem-23-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-25-t-isvalid.html'>../html-svg/animate-elem-25-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-26-t-isvalid.html'>../html-svg/animate-elem-26-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-27-t-isvalid.html'>../html-svg/animate-elem-27-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-28-t-isvalid.html'>../html-svg/animate-elem-28-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-29-b-isvalid.html'>../html-svg/animate-elem-29-b-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-30-t-isvalid.html'>../html-svg/animate-elem-30-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-31-t-isvalid.html'>../html-svg/animate-elem-31-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-32-t-isvalid.html'>../html-svg/animate-elem-32-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-33-t-isvalid.html'>../html-svg/animate-elem-33-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-34-t-isvalid.html'>../html-svg/animate-elem-34-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-35-t-isvalid.html'>../html-svg/animate-elem-35-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-36-t-isvalid.html'>../html-svg/animate-elem-36-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-37-t-isvalid.html'>../html-svg/animate-elem-37-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-38-t-isvalid.html'>../html-svg/animate-elem-38-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-39-t-isvalid.html'>../html-svg/animate-elem-39-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-41-t-isvalid.html'>../html-svg/animate-elem-41-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-44-t-isvalid.html'>../html-svg/animate-elem-44-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-46-t-isvalid.html'>../html-svg/animate-elem-46-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-52-t-isvalid.html'>../html-svg/animate-elem-52-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-53-t-isvalid.html'>../html-svg/animate-elem-53-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-60-t-isvalid.html'>../html-svg/animate-elem-60-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-61-t-isvalid.html'>../html-svg/animate-elem-61-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-62-t-isvalid.html'>../html-svg/animate-elem-62-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-63-t-isvalid.html'>../html-svg/animate-elem-63-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-64-t-isvalid.html'>../html-svg/animate-elem-64-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-65-t-isvalid.html'>../html-svg/animate-elem-65-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-66-t-isvalid.html'>../html-svg/animate-elem-66-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-67-t-isvalid.html'>../html-svg/animate-elem-67-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-68-t-isvalid.html'>../html-svg/animate-elem-68-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-69-t-isvalid.html'>../html-svg/animate-elem-69-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-70-t-isvalid.html'>../html-svg/animate-elem-70-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-78-t-isvalid.html'>../html-svg/animate-elem-78-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-80-t-isvalid.html'>../html-svg/animate-elem-80-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-81-t-isvalid.html'>../html-svg/animate-elem-81-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-82-t-isvalid.html'>../html-svg/animate-elem-82-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-83-t-isvalid.html'>../html-svg/animate-elem-83-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-84-t-isvalid.html'>../html-svg/animate-elem-84-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-85-t-isvalid.html'>../html-svg/animate-elem-85-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-86-t-isvalid.html'>../html-svg/animate-elem-86-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-87-t-isvalid.html'>../html-svg/animate-elem-87-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-88-t-isvalid.html'>../html-svg/animate-elem-88-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-89-t-isvalid.html'>../html-svg/animate-elem-89-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-90-b-isvalid.html'>../html-svg/animate-elem-90-b-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-91-t-isvalid.html'>../html-svg/animate-elem-91-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-elem-92-t-isvalid.html'>../html-svg/animate-elem-92-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-interact-events-01-t-isvalid.html'>../html-svg/animate-interact-events-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-interact-pevents-01-t-isvalid.html'>../html-svg/animate-interact-pevents-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-interact-pevents-02-t-isvalid.html'>../html-svg/animate-interact-pevents-02-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-interact-pevents-03-t-isvalid.html'>../html-svg/animate-interact-pevents-03-t-isvalid.html</a></p>
- <p><a href='../html-svg/animate-interact-pevents-04-t-isvalid.html'>../html-svg/animate-interact-pevents-04-t-isvalid.html</a></p>
- <p><a href='../html-svg/color-prof-01-f-isvalid.html'>../html-svg/color-prof-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/color-prop-01-b-isvalid.html'>../html-svg/color-prop-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/color-prop-02-f-isvalid.html'>../html-svg/color-prop-02-f-isvalid.html</a></p>
- <p><a href='../html-svg/color-prop-03-t-isvalid.html'>../html-svg/color-prop-03-t-isvalid.html</a></p>
- <p><a href='../html-svg/color-prop-04-t-isvalid.html'>../html-svg/color-prop-04-t-isvalid.html</a></p>
- <p><a href='../html-svg/color-prop-05-t-isvalid.html'>../html-svg/color-prop-05-t-isvalid.html</a></p>
- <p><a href='../html-svg/coords-coord-01-t-isvalid.html'>../html-svg/coords-coord-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/coords-coord-02-t-isvalid.html'>../html-svg/coords-coord-02-t-isvalid.html</a></p>
- <p><a href='../html-svg/coords-dom-04-f-isvalid.html'>../html-svg/coords-dom-04-f-isvalid.html</a></p>
- <p><a href='../html-svg/coords-trans-01-b-isvalid.html'>../html-svg/coords-trans-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/coords-trans-02-t-isvalid.html'>../html-svg/coords-trans-02-t-isvalid.html</a></p>
- <p><a href='../html-svg/coords-trans-03-t-isvalid.html'>../html-svg/coords-trans-03-t-isvalid.html</a></p>
- <p><a href='../html-svg/coords-trans-04-t-isvalid.html'>../html-svg/coords-trans-04-t-isvalid.html</a></p>
- <p><a href='../html-svg/coords-trans-05-t-isvalid.html'>../html-svg/coords-trans-05-t-isvalid.html</a></p>
- <p><a href='../html-svg/coords-trans-06-t-isvalid.html'>../html-svg/coords-trans-06-t-isvalid.html</a></p>
- <p><a href='../html-svg/coords-trans-07-t-isvalid.html'>../html-svg/coords-trans-07-t-isvalid.html</a></p>
- <p><a href='../html-svg/coords-trans-08-t-isvalid.html'>../html-svg/coords-trans-08-t-isvalid.html</a></p>
- <p><a href='../html-svg/coords-trans-09-t-isvalid.html'>../html-svg/coords-trans-09-t-isvalid.html</a></p>
- <p><a href='../html-svg/coords-trans-10-f-isvalid.html'>../html-svg/coords-trans-10-f-isvalid.html</a></p>
- <p><a href='../html-svg/coords-trans-11-f-isvalid.html'>../html-svg/coords-trans-11-f-isvalid.html</a></p>
- <p><a href='../html-svg/coords-trans-12-f-isvalid.html'>../html-svg/coords-trans-12-f-isvalid.html</a></p>
- <p><a href='../html-svg/coords-trans-13-f-isvalid.html'>../html-svg/coords-trans-13-f-isvalid.html</a></p>
- <p><a href='../html-svg/coords-trans-14-f-isvalid.html'>../html-svg/coords-trans-14-f-isvalid.html</a></p>
- <p><a href='../html-svg/coords-transformattr-02-f-isvalid.html'>../html-svg/coords-transformattr-02-f-isvalid.html</a></p>
- <p><a href='../html-svg/coords-transformattr-03-f-isvalid.html'>../html-svg/coords-transformattr-03-f-isvalid.html</a></p>
- <p><a href='../html-svg/coords-transformattr-04-f-isvalid.html'>../html-svg/coords-transformattr-04-f-isvalid.html</a></p>
- <p><a href='../html-svg/coords-transformattr-05-f-isvalid.html'>../html-svg/coords-transformattr-05-f-isvalid.html</a></p>
- <p><a href='../html-svg/coords-units-01-b-isvalid.html'>../html-svg/coords-units-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/coords-units-02-b-isvalid.html'>../html-svg/coords-units-02-b-isvalid.html</a></p>
- <p><a href='../html-svg/coords-units-03-b-isvalid.html'>../html-svg/coords-units-03-b-isvalid.html</a></p>
- <p><a href='../html-svg/coords-viewattr-03-b-isvalid.html'>../html-svg/coords-viewattr-03-b-isvalid.html</a></p>
- <p><a href='../html-svg/filters-background-01-f-isvalid.html'>../html-svg/filters-background-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/filters-blend-01-b-isvalid.html'>../html-svg/filters-blend-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/filters-color-01-b-isvalid.html'>../html-svg/filters-color-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/filters-composite-02-b-isvalid.html'>../html-svg/filters-composite-02-b-isvalid.html</a></p>
- <p><a href='../html-svg/filters-composite-03-f-isvalid.html'>../html-svg/filters-composite-03-f-isvalid.html</a></p>
- <p><a href='../html-svg/filters-composite-04-f-isvalid.html'>../html-svg/filters-composite-04-f-isvalid.html</a></p>
- <p><a href='../html-svg/filters-composite-05-f-isvalid.html'>../html-svg/filters-composite-05-f-isvalid.html</a></p>
- <p><a href='../html-svg/filters-comptran-01-b-isvalid.html'>../html-svg/filters-comptran-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/filters-conv-01-f-isvalid.html'>../html-svg/filters-conv-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/filters-conv-03-f-isvalid.html'>../html-svg/filters-conv-03-f-isvalid.html</a></p>
- <p><a href='../html-svg/filters-diffuse-01-f-isvalid.html'>../html-svg/filters-diffuse-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/filters-displace-01-f-isvalid.html'>../html-svg/filters-displace-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/filters-displace-02-f-isvalid.html'>../html-svg/filters-displace-02-f-isvalid.html</a></p>
- <p><a href='../html-svg/filters-example-01-b-isvalid.html'>../html-svg/filters-example-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/filters-felem-01-b-isvalid.html'>../html-svg/filters-felem-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/filters-felem-02-f-isvalid.html'>../html-svg/filters-felem-02-f-isvalid.html</a></p>
- <p><a href='../html-svg/filters-gauss-01-b-isvalid.html'>../html-svg/filters-gauss-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/filters-gauss-02-f-isvalid.html'>../html-svg/filters-gauss-02-f-isvalid.html</a></p>
- <p><a href='../html-svg/filters-gauss-03-f-isvalid.html'>../html-svg/filters-gauss-03-f-isvalid.html</a></p>
- <p><a href='../html-svg/filters-image-01-b-isvalid.html'>../html-svg/filters-image-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/filters-image-02-b-isvalid.html'>../html-svg/filters-image-02-b-isvalid.html</a></p>
- <p><a href='../html-svg/filters-image-03-f-isvalid.html'>../html-svg/filters-image-03-f-isvalid.html</a></p>
- <p><a href='../html-svg/filters-image-04-f-isvalid.html'>../html-svg/filters-image-04-f-isvalid.html</a></p>
- <p><a href='../html-svg/filters-image-05-f-isvalid.html'>../html-svg/filters-image-05-f-isvalid.html</a></p>
- <p><a href='../html-svg/filters-light-01-f-isvalid.html'>../html-svg/filters-light-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/filters-light-02-f-isvalid.html'>../html-svg/filters-light-02-f-isvalid.html</a></p>
- <p><a href='../html-svg/filters-light-03-f-isvalid.html'>../html-svg/filters-light-03-f-isvalid.html</a></p>
- <p><a href='../html-svg/filters-light-04-f-isvalid.html'>../html-svg/filters-light-04-f-isvalid.html</a></p>
- <p><a href='../html-svg/filters-morph-01-f-isvalid.html'>../html-svg/filters-morph-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/filters-offset-01-b-isvalid.html'>../html-svg/filters-offset-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/filters-offset-02-b-isvalid.html'>../html-svg/filters-offset-02-b-isvalid.html</a></p>
- <p><a href='../html-svg/filters-overview-01-b-isvalid.html'>../html-svg/filters-overview-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/filters-overview-02-b-isvalid.html'>../html-svg/filters-overview-02-b-isvalid.html</a></p>
- <p><a href='../html-svg/filters-overview-03-b-isvalid.html'>../html-svg/filters-overview-03-b-isvalid.html</a></p>
- <p><a href='../html-svg/filters-specular-01-f-isvalid.html'>../html-svg/filters-specular-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/filters-tile-01-b-isvalid.html'>../html-svg/filters-tile-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/filters-turb-01-f-isvalid.html'>../html-svg/filters-turb-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/filters-turb-02-f-isvalid.html'>../html-svg/filters-turb-02-f-isvalid.html</a></p>
- <p><a href='../html-svg/fonts-desc-01-t-isvalid.html'>../html-svg/fonts-desc-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/fonts-desc-02-t-isvalid.html'>../html-svg/fonts-desc-02-t-isvalid.html</a></p>
- <p><a href='../html-svg/fonts-desc-03-t-isvalid.html'>../html-svg/fonts-desc-03-t-isvalid.html</a></p>
- <p><a href='../html-svg/fonts-desc-04-t-isvalid.html'>../html-svg/fonts-desc-04-t-isvalid.html</a></p>
- <p><a href='../html-svg/fonts-desc-05-t-isvalid.html'>../html-svg/fonts-desc-05-t-isvalid.html</a></p>
- <p><a href='../html-svg/fonts-elem-01-t-isvalid.html'>../html-svg/fonts-elem-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/fonts-elem-02-t-isvalid.html'>../html-svg/fonts-elem-02-t-isvalid.html</a></p>
- <p><a href='../html-svg/fonts-elem-03-b-isvalid.html'>../html-svg/fonts-elem-03-b-isvalid.html</a></p>
- <p><a href='../html-svg/fonts-elem-04-b-isvalid.html'>../html-svg/fonts-elem-04-b-isvalid.html</a></p>
- <p><a href='../html-svg/fonts-elem-05-t-isvalid.html'>../html-svg/fonts-elem-05-t-isvalid.html</a></p>
- <p><a href='../html-svg/fonts-elem-06-t-isvalid.html'>../html-svg/fonts-elem-06-t-isvalid.html</a></p>
- <p><a href='../html-svg/fonts-elem-07-b-isvalid.html'>../html-svg/fonts-elem-07-b-isvalid.html</a></p>
- <p><a href='../html-svg/fonts-glyph-02-t-isvalid.html'>../html-svg/fonts-glyph-02-t-isvalid.html</a></p>
- <p><a href='../html-svg/fonts-glyph-03-t-isvalid.html'>../html-svg/fonts-glyph-03-t-isvalid.html</a></p>
- <p><a href='../html-svg/fonts-kern-01-t-isvalid.html'>../html-svg/fonts-kern-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/imp-path-01-f-isvalid.html'>../html-svg/imp-path-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/interact-cursor-01-f-isvalid.html'>../html-svg/interact-cursor-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/interact-dom-01-b-isvalid.html'>../html-svg/interact-dom-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/interact-events-01-b-isvalid.html'>../html-svg/interact-events-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/interact-events-202-f-isvalid.html'>../html-svg/interact-events-202-f-isvalid.html</a></p>
- <p><a href='../html-svg/interact-events-203-t-isvalid.html'>../html-svg/interact-events-203-t-isvalid.html</a></p>
- <p><a href='../html-svg/interact-order-01-b-isvalid.html'>../html-svg/interact-order-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/interact-order-02-b-isvalid.html'>../html-svg/interact-order-02-b-isvalid.html</a></p>
- <p><a href='../html-svg/interact-order-03-b-isvalid.html'>../html-svg/interact-order-03-b-isvalid.html</a></p>
- <p><a href='../html-svg/interact-pevents-04-t-isvalid.html'>../html-svg/interact-pevents-04-t-isvalid.html</a></p>
- <p><a href='../html-svg/interact-pevents-10-f-isvalid.html'>../html-svg/interact-pevents-10-f-isvalid.html</a></p>
- <p><a href='../html-svg/interact-pointer-04-f-isvalid.html'>../html-svg/interact-pointer-04-f-isvalid.html</a></p>
- <p><a href='../html-svg/interact-zoom-01-t-isvalid.html'>../html-svg/interact-zoom-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/interact-zoom-02-t-isvalid.html'>../html-svg/interact-zoom-02-t-isvalid.html</a></p>
- <p><a href='../html-svg/interact-zoom-03-t-isvalid.html'>../html-svg/interact-zoom-03-t-isvalid.html</a></p>
- <p><a href='../html-svg/linking-a-01-b-isvalid.html'>../html-svg/linking-a-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/linking-a-03-b-isvalid.html'>../html-svg/linking-a-03-b-isvalid.html</a></p>
- <p><a href='../html-svg/linking-a-04-t-isvalid.html'>../html-svg/linking-a-04-t-isvalid.html</a></p>
- <p><a href='../html-svg/linking-a-05-t-isvalid.html'>../html-svg/linking-a-05-t-isvalid.html</a></p>
- <p><a href='../html-svg/linking-a-07-t-isvalid.html'>../html-svg/linking-a-07-t-isvalid.html</a></p>
- <p><a href='../html-svg/linking-a-08-t-isvalid.html'>../html-svg/linking-a-08-t-isvalid.html</a></p>
- <p><a href='../html-svg/linking-frag-01-f-isvalid.html'>../html-svg/linking-frag-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/linking-uri-01-b-isvalid.html'>../html-svg/linking-uri-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/linking-uri-02-b-isvalid.html'>../html-svg/linking-uri-02-b-isvalid.html</a></p>
- <p><a href='../html-svg/linking-uri-03-t-isvalid.html'>../html-svg/linking-uri-03-t-isvalid.html</a></p>
- <p><a href='../html-svg/masking-mask-01-b-isvalid.html'>../html-svg/masking-mask-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/masking-mask-02-f-isvalid.html'>../html-svg/masking-mask-02-f-isvalid.html</a></p>
- <p><a href='../html-svg/masking-opacity-01-b-isvalid.html'>../html-svg/masking-opacity-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/masking-path-01-b-isvalid.html'>../html-svg/masking-path-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/masking-path-02-b-isvalid.html'>../html-svg/masking-path-02-b-isvalid.html</a></p>
- <p><a href='../html-svg/masking-path-03-b-isvalid.html'>../html-svg/masking-path-03-b-isvalid.html</a></p>
- <p><a href='../html-svg/masking-path-04-b-isvalid.html'>../html-svg/masking-path-04-b-isvalid.html</a></p>
- <p><a href='../html-svg/masking-path-05-f-isvalid.html'>../html-svg/masking-path-05-f-isvalid.html</a></p>
- <p><a href='../html-svg/masking-path-06-b-isvalid.html'>../html-svg/masking-path-06-b-isvalid.html</a></p>
- <p><a href='../html-svg/masking-path-07-b-isvalid.html'>../html-svg/masking-path-07-b-isvalid.html</a></p>
- <p><a href='../html-svg/masking-path-08-b-isvalid.html'>../html-svg/masking-path-08-b-isvalid.html</a></p>
- <p><a href='../html-svg/masking-path-10-b-isvalid.html'>../html-svg/masking-path-10-b-isvalid.html</a></p>
- <p><a href='../html-svg/masking-path-11-b-isvalid.html'>../html-svg/masking-path-11-b-isvalid.html</a></p>
- <p><a href='../html-svg/masking-path-12-f-isvalid.html'>../html-svg/masking-path-12-f-isvalid.html</a></p>
- <p><a href='../html-svg/masking-path-13-f-isvalid.html'>../html-svg/masking-path-13-f-isvalid.html</a></p>
- <p><a href='../html-svg/masking-path-14-f-isvalid.html'>../html-svg/masking-path-14-f-isvalid.html</a></p>
- <p><a href='../html-svg/painting-control-01-f-isvalid.html'>../html-svg/painting-control-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/painting-control-02-f-isvalid.html'>../html-svg/painting-control-02-f-isvalid.html</a></p>
- <p><a href='../html-svg/painting-control-03-f-isvalid.html'>../html-svg/painting-control-03-f-isvalid.html</a></p>
- <p><a href='../html-svg/painting-control-04-f-isvalid.html'>../html-svg/painting-control-04-f-isvalid.html</a></p>
- <p><a href='../html-svg/painting-control-05-f-isvalid.html'>../html-svg/painting-control-05-f-isvalid.html</a></p>
- <p><a href='../html-svg/painting-control-06-f-isvalid.html'>../html-svg/painting-control-06-f-isvalid.html</a></p>
- <p><a href='../html-svg/painting-fill-01-t-isvalid.html'>../html-svg/painting-fill-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/painting-fill-02-t-isvalid.html'>../html-svg/painting-fill-02-t-isvalid.html</a></p>
- <p><a href='../html-svg/painting-fill-03-t-isvalid.html'>../html-svg/painting-fill-03-t-isvalid.html</a></p>
- <p><a href='../html-svg/painting-fill-04-t-isvalid.html'>../html-svg/painting-fill-04-t-isvalid.html</a></p>
- <p><a href='../html-svg/painting-fill-05-b-isvalid.html'>../html-svg/painting-fill-05-b-isvalid.html</a></p>
- <p><a href='../html-svg/painting-marker-01-f-isvalid.html'>../html-svg/painting-marker-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/painting-marker-02-f-isvalid.html'>../html-svg/painting-marker-02-f-isvalid.html</a></p>
- <p><a href='../html-svg/painting-marker-03-f-isvalid.html'>../html-svg/painting-marker-03-f-isvalid.html</a></p>
- <p><a href='../html-svg/painting-marker-05-f-isvalid.html'>../html-svg/painting-marker-05-f-isvalid.html</a></p>
- <p><a href='../html-svg/painting-marker-06-f-isvalid.html'>../html-svg/painting-marker-06-f-isvalid.html</a></p>
- <p><a href='../html-svg/painting-marker-07-f-isvalid.html'>../html-svg/painting-marker-07-f-isvalid.html</a></p>
- <p><a href='../html-svg/painting-marker-properties-01-f-isvalid.html'>../html-svg/painting-marker-properties-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/painting-render-01-b-isvalid.html'>../html-svg/painting-render-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/painting-render-02-b-isvalid.html'>../html-svg/painting-render-02-b-isvalid.html</a></p>
- <p><a href='../html-svg/painting-stroke-01-t-isvalid.html'>../html-svg/painting-stroke-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/painting-stroke-02-t-isvalid.html'>../html-svg/painting-stroke-02-t-isvalid.html</a></p>
- <p><a href='../html-svg/painting-stroke-03-t-isvalid.html'>../html-svg/painting-stroke-03-t-isvalid.html</a></p>
- <p><a href='../html-svg/painting-stroke-04-t-isvalid.html'>../html-svg/painting-stroke-04-t-isvalid.html</a></p>
- <p><a href='../html-svg/painting-stroke-05-t-isvalid.html'>../html-svg/painting-stroke-05-t-isvalid.html</a></p>
- <p><a href='../html-svg/painting-stroke-06-t-isvalid.html'>../html-svg/painting-stroke-06-t-isvalid.html</a></p>
- <p><a href='../html-svg/painting-stroke-07-t-isvalid.html'>../html-svg/painting-stroke-07-t-isvalid.html</a></p>
- <p><a href='../html-svg/painting-stroke-08-t-isvalid.html'>../html-svg/painting-stroke-08-t-isvalid.html</a></p>
- <p><a href='../html-svg/painting-stroke-09-t-isvalid.html'>../html-svg/painting-stroke-09-t-isvalid.html</a></p>
- <p><a href='../html-svg/painting-stroke-10-t-isvalid.html'>../html-svg/painting-stroke-10-t-isvalid.html</a></p>
- <p><a href='../html-svg/paths-data-01-t-isvalid.html'>../html-svg/paths-data-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/paths-data-02-t-isvalid.html'>../html-svg/paths-data-02-t-isvalid.html</a></p>
- <p><a href='../html-svg/paths-data-03-f-isvalid.html'>../html-svg/paths-data-03-f-isvalid.html</a></p>
- <p><a href='../html-svg/paths-data-04-t-isvalid.html'>../html-svg/paths-data-04-t-isvalid.html</a></p>
- <p><a href='../html-svg/paths-data-05-t-isvalid.html'>../html-svg/paths-data-05-t-isvalid.html</a></p>
- <p><a href='../html-svg/paths-data-06-t-isvalid.html'>../html-svg/paths-data-06-t-isvalid.html</a></p>
- <p><a href='../html-svg/paths-data-07-t-isvalid.html'>../html-svg/paths-data-07-t-isvalid.html</a></p>
- <p><a href='../html-svg/paths-data-08-t-isvalid.html'>../html-svg/paths-data-08-t-isvalid.html</a></p>
- <p><a href='../html-svg/paths-data-09-t-isvalid.html'>../html-svg/paths-data-09-t-isvalid.html</a></p>
- <p><a href='../html-svg/paths-data-10-t-isvalid.html'>../html-svg/paths-data-10-t-isvalid.html</a></p>
- <p><a href='../html-svg/paths-data-12-t-isvalid.html'>../html-svg/paths-data-12-t-isvalid.html</a></p>
- <p><a href='../html-svg/paths-data-13-t-isvalid.html'>../html-svg/paths-data-13-t-isvalid.html</a></p>
- <p><a href='../html-svg/paths-data-14-t-isvalid.html'>../html-svg/paths-data-14-t-isvalid.html</a></p>
- <p><a href='../html-svg/paths-data-15-t-isvalid.html'>../html-svg/paths-data-15-t-isvalid.html</a></p>
- <p><a href='../html-svg/paths-data-16-t-isvalid.html'>../html-svg/paths-data-16-t-isvalid.html</a></p>
- <p><a href='../html-svg/paths-data-17-f-isvalid.html'>../html-svg/paths-data-17-f-isvalid.html</a></p>
- <p><a href='../html-svg/paths-data-19-f-isvalid.html'>../html-svg/paths-data-19-f-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-01-b-isvalid.html'>../html-svg/pservers-grad-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-02-b-isvalid.html'>../html-svg/pservers-grad-02-b-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-03-b-isvalid.html'>../html-svg/pservers-grad-03-b-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-04-b-isvalid.html'>../html-svg/pservers-grad-04-b-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-05-b-isvalid.html'>../html-svg/pservers-grad-05-b-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-06-b-isvalid.html'>../html-svg/pservers-grad-06-b-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-07-b-isvalid.html'>../html-svg/pservers-grad-07-b-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-08-b-isvalid.html'>../html-svg/pservers-grad-08-b-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-09-b-isvalid.html'>../html-svg/pservers-grad-09-b-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-10-b-isvalid.html'>../html-svg/pservers-grad-10-b-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-11-b-isvalid.html'>../html-svg/pservers-grad-11-b-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-12-b-isvalid.html'>../html-svg/pservers-grad-12-b-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-13-b-isvalid.html'>../html-svg/pservers-grad-13-b-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-14-b-isvalid.html'>../html-svg/pservers-grad-14-b-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-15-b-isvalid.html'>../html-svg/pservers-grad-15-b-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-16-b-isvalid.html'>../html-svg/pservers-grad-16-b-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-17-b-isvalid.html'>../html-svg/pservers-grad-17-b-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-18-b-isvalid.html'>../html-svg/pservers-grad-18-b-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-20-b-isvalid.html'>../html-svg/pservers-grad-20-b-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-21-b-isvalid.html'>../html-svg/pservers-grad-21-b-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-22-b-isvalid.html'>../html-svg/pservers-grad-22-b-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-24-f-isvalid.html'>../html-svg/pservers-grad-24-f-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-grad-stops-01-f-isvalid.html'>../html-svg/pservers-grad-stops-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-pattern-01-b-isvalid.html'>../html-svg/pservers-pattern-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-pattern-02-f-isvalid.html'>../html-svg/pservers-pattern-02-f-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-pattern-03-f-isvalid.html'>../html-svg/pservers-pattern-03-f-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-pattern-04-f-isvalid.html'>../html-svg/pservers-pattern-04-f-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-pattern-05-f-isvalid.html'>../html-svg/pservers-pattern-05-f-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-pattern-06-f-isvalid.html'>../html-svg/pservers-pattern-06-f-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-pattern-07-f-isvalid.html'>../html-svg/pservers-pattern-07-f-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-pattern-08-f-isvalid.html'>../html-svg/pservers-pattern-08-f-isvalid.html</a></p>
- <p><a href='../html-svg/pservers-pattern-09-f-isvalid.html'>../html-svg/pservers-pattern-09-f-isvalid.html</a></p>
- <p><a href='../html-svg/render-elems-01-t-isvalid.html'>../html-svg/render-elems-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/render-elems-02-t-isvalid.html'>../html-svg/render-elems-02-t-isvalid.html</a></p>
- <p><a href='../html-svg/render-elems-06-t-isvalid.html'>../html-svg/render-elems-06-t-isvalid.html</a></p>
- <p><a href='../html-svg/render-elems-07-t-isvalid.html'>../html-svg/render-elems-07-t-isvalid.html</a></p>
- <p><a href='../html-svg/render-elems-08-t-isvalid.html'>../html-svg/render-elems-08-t-isvalid.html</a></p>
- <p><a href='../html-svg/render-groups-01-b-isvalid.html'>../html-svg/render-groups-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/render-groups-03-t-isvalid.html'>../html-svg/render-groups-03-t-isvalid.html</a></p>
- <p><a href='../html-svg/script-handle-01-b-isvalid.html'>../html-svg/script-handle-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/script-handle-02-b-isvalid.html'>../html-svg/script-handle-02-b-isvalid.html</a></p>
- <p><a href='../html-svg/script-handle-03-b-isvalid.html'>../html-svg/script-handle-03-b-isvalid.html</a></p>
- <p><a href='../html-svg/script-handle-04-b-isvalid.html'>../html-svg/script-handle-04-b-isvalid.html</a></p>
- <p><a href='../html-svg/script-specify-02-f-isvalid.html'>../html-svg/script-specify-02-f-isvalid.html</a></p>
- <p><a href='../html-svg/shapes-circle-01-t-isvalid.html'>../html-svg/shapes-circle-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/shapes-circle-02-t-isvalid.html'>../html-svg/shapes-circle-02-t-isvalid.html</a></p>
- <p><a href='../html-svg/shapes-ellipse-01-t-isvalid.html'>../html-svg/shapes-ellipse-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/shapes-ellipse-02-t-isvalid.html'>../html-svg/shapes-ellipse-02-t-isvalid.html</a></p>
- <p><a href='../html-svg/shapes-ellipse-03-f-isvalid.html'>../html-svg/shapes-ellipse-03-f-isvalid.html</a></p>
- <p><a href='../html-svg/shapes-grammar-01-f-isvalid.html'>../html-svg/shapes-grammar-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/shapes-intro-01-t-isvalid.html'>../html-svg/shapes-intro-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/shapes-intro-02-f-isvalid.html'>../html-svg/shapes-intro-02-f-isvalid.html</a></p>
- <p><a href='../html-svg/shapes-line-01-t-isvalid.html'>../html-svg/shapes-line-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/shapes-line-02-f-isvalid.html'>../html-svg/shapes-line-02-f-isvalid.html</a></p>
- <p><a href='../html-svg/shapes-polygon-01-t-isvalid.html'>../html-svg/shapes-polygon-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/shapes-polygon-02-t-isvalid.html'>../html-svg/shapes-polygon-02-t-isvalid.html</a></p>
- <p><a href='../html-svg/shapes-polygon-03-t-isvalid.html'>../html-svg/shapes-polygon-03-t-isvalid.html</a></p>
- <p><a href='../html-svg/shapes-polyline-01-t-isvalid.html'>../html-svg/shapes-polyline-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/shapes-polyline-02-t-isvalid.html'>../html-svg/shapes-polyline-02-t-isvalid.html</a></p>
- <p><a href='../html-svg/shapes-rect-01-t-isvalid.html'>../html-svg/shapes-rect-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/shapes-rect-02-t-isvalid.html'>../html-svg/shapes-rect-02-t-isvalid.html</a></p>
- <p><a href='../html-svg/shapes-rect-04-f-isvalid.html'>../html-svg/shapes-rect-04-f-isvalid.html</a></p>
- <p><a href='../html-svg/shapes-rect-05-f-isvalid.html'>../html-svg/shapes-rect-05-f-isvalid.html</a></p>
- <p><a href='../html-svg/shapes-rect-06-f-isvalid.html'>../html-svg/shapes-rect-06-f-isvalid.html</a></p>
- <p><a href='../html-svg/shapes-rect-07-f-isvalid.html'>../html-svg/shapes-rect-07-f-isvalid.html</a></p>
- <p><a href='../html-svg/struct-cond-01-t-isvalid.html'>../html-svg/struct-cond-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/struct-cond-02-t-isvalid.html'>../html-svg/struct-cond-02-t-isvalid.html</a></p>
- <p><a href='../html-svg/struct-cond-03-t-isvalid.html'>../html-svg/struct-cond-03-t-isvalid.html</a></p>
- <p><a href='../html-svg/struct-cond-overview-02-f-isvalid.html'>../html-svg/struct-cond-overview-02-f-isvalid.html</a></p>
- <p><a href='../html-svg/struct-cond-overview-03-f-isvalid.html'>../html-svg/struct-cond-overview-03-f-isvalid.html</a></p>
- <p><a href='../html-svg/struct-cond-overview-04-f-isvalid.html'>../html-svg/struct-cond-overview-04-f-isvalid.html</a></p>
- <p><a href='../html-svg/struct-cond-overview-05-f-isvalid.html'>../html-svg/struct-cond-overview-05-f-isvalid.html</a></p>
- <p><a href='../html-svg/struct-defs-01-t-isvalid.html'>../html-svg/struct-defs-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/struct-dom-01-b-isvalid.html'>../html-svg/struct-dom-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/struct-dom-02-b-isvalid.html'>../html-svg/struct-dom-02-b-isvalid.html</a></p>
- <p><a href='../html-svg/struct-dom-03-b-isvalid.html'>../html-svg/struct-dom-03-b-isvalid.html</a></p>
- <p><a href='../html-svg/struct-dom-04-b-isvalid.html'>../html-svg/struct-dom-04-b-isvalid.html</a></p>
- <p><a href='../html-svg/struct-dom-05-b-isvalid.html'>../html-svg/struct-dom-05-b-isvalid.html</a></p>
- <p><a href='../html-svg/struct-dom-06-b-isvalid.html'>../html-svg/struct-dom-06-b-isvalid.html</a></p>
- <p><a href='../html-svg/struct-dom-12-b-isvalid.html'>../html-svg/struct-dom-12-b-isvalid.html</a></p>
- <p><a href='../html-svg/struct-dom-16-f-isvalid.html'>../html-svg/struct-dom-16-f-isvalid.html</a></p>
- <p><a href='../html-svg/struct-dom-18-f-isvalid.html'>../html-svg/struct-dom-18-f-isvalid.html</a></p>
- <p><a href='../html-svg/struct-frag-01-t-isvalid.html'>../html-svg/struct-frag-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/struct-frag-02-t-isvalid.html'>../html-svg/struct-frag-02-t-isvalid.html</a></p>
- <p><a href='../html-svg/struct-frag-03-t-isvalid.html'>../html-svg/struct-frag-03-t-isvalid.html</a></p>
- <p><a href='../html-svg/struct-frag-04-t-isvalid.html'>../html-svg/struct-frag-04-t-isvalid.html</a></p>
- <p><a href='../html-svg/struct-frag-06-t-isvalid.html'>../html-svg/struct-frag-06-t-isvalid.html</a></p>
- <p><a href='../html-svg/struct-group-01-t-isvalid.html'>../html-svg/struct-group-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/struct-group-02-b-isvalid.html'>../html-svg/struct-group-02-b-isvalid.html</a></p>
- <p><a href='../html-svg/struct-group-03-t-isvalid.html'>../html-svg/struct-group-03-t-isvalid.html</a></p>
- <p><a href='../html-svg/struct-image-01-t-isvalid.html'>../html-svg/struct-image-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/struct-image-02-b-isvalid.html'>../html-svg/struct-image-02-b-isvalid.html</a></p>
- <p><a href='../html-svg/struct-image-03-t-isvalid.html'>../html-svg/struct-image-03-t-isvalid.html</a></p>
- <p><a href='../html-svg/struct-image-04-t-isvalid.html'>../html-svg/struct-image-04-t-isvalid.html</a></p>
- <p><a href='../html-svg/struct-image-05-b-isvalid.html'>../html-svg/struct-image-05-b-isvalid.html</a></p>
- <p><a href='../html-svg/struct-image-06-t-isvalid.html'>../html-svg/struct-image-06-t-isvalid.html</a></p>
- <p><a href='../html-svg/struct-image-07-t-isvalid.html'>../html-svg/struct-image-07-t-isvalid.html</a></p>
- <p><a href='../html-svg/struct-image-08-t-isvalid.html'>../html-svg/struct-image-08-t-isvalid.html</a></p>
- <p><a href='../html-svg/struct-image-09-t-isvalid.html'>../html-svg/struct-image-09-t-isvalid.html</a></p>
- <p><a href='../html-svg/struct-image-10-t-isvalid.html'>../html-svg/struct-image-10-t-isvalid.html</a></p>
- <p><a href='../html-svg/struct-image-11-b-isvalid.html'>../html-svg/struct-image-11-b-isvalid.html</a></p>
- <p><a href='../html-svg/struct-image-13-f-isvalid.html'>../html-svg/struct-image-13-f-isvalid.html</a></p>
- <p><a href='../html-svg/struct-image-14-f-isvalid.html'>../html-svg/struct-image-14-f-isvalid.html</a></p>
- <p><a href='../html-svg/struct-image-15-f-isvalid.html'>../html-svg/struct-image-15-f-isvalid.html</a></p>
- <p><a href='../html-svg/struct-image-16-f-isvalid.html'>../html-svg/struct-image-16-f-isvalid.html</a></p>
- <p><a href='../html-svg/struct-image-17-b-isvalid.html'>../html-svg/struct-image-17-b-isvalid.html</a></p>
- <p><a href='../html-svg/struct-image-18-f-isvalid.html'>../html-svg/struct-image-18-f-isvalid.html</a></p>
- <p><a href='../html-svg/struct-image-19-f-isvalid.html'>../html-svg/struct-image-19-f-isvalid.html</a></p>
- <p><a href='../html-svg/struct-svg-01-f-isvalid.html'>../html-svg/struct-svg-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/struct-svg-02-f-isvalid.html'>../html-svg/struct-svg-02-f-isvalid.html</a></p>
- <p><a href='../html-svg/struct-svg-03-f-isvalid.html'>../html-svg/struct-svg-03-f-isvalid.html</a></p>
- <p><a href='../html-svg/struct-symbol-01-b-isvalid.html'>../html-svg/struct-symbol-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/struct-use-01-t-isvalid.html'>../html-svg/struct-use-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/struct-use-03-t-isvalid.html'>../html-svg/struct-use-03-t-isvalid.html</a></p>
- <p><a href='../html-svg/struct-use-04-b-isvalid.html'>../html-svg/struct-use-04-b-isvalid.html</a></p>
- <p><a href='../html-svg/struct-use-05-b-isvalid.html'>../html-svg/struct-use-05-b-isvalid.html</a></p>
- <p><a href='../html-svg/struct-use-06-b-isvalid.html'>../html-svg/struct-use-06-b-isvalid.html</a></p>
- <p><a href='../html-svg/struct-use-07-b-isvalid.html'>../html-svg/struct-use-07-b-isvalid.html</a></p>
- <p><a href='../html-svg/struct-use-08-b-isvalid.html'>../html-svg/struct-use-08-b-isvalid.html</a></p>
- <p><a href='../html-svg/struct-use-09-b-isvalid.html'>../html-svg/struct-use-09-b-isvalid.html</a></p>
- <p><a href='../html-svg/struct-use-10-f-isvalid.html'>../html-svg/struct-use-10-f-isvalid.html</a></p>
- <p><a href='../html-svg/struct-use-14-f-isvalid.html'>../html-svg/struct-use-14-f-isvalid.html</a></p>
- <p><a href='../html-svg/struct-use-15-f-isvalid.html'>../html-svg/struct-use-15-f-isvalid.html</a></p>
- <p><a href='../html-svg/styling-class-01-f-isvalid.html'>../html-svg/styling-class-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/styling-css-01-b-isvalid.html'>../html-svg/styling-css-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/styling-css-02-b-isvalid.html'>../html-svg/styling-css-02-b-isvalid.html</a></p>
- <p><a href='../html-svg/styling-css-03-b-isvalid.html'>../html-svg/styling-css-03-b-isvalid.html</a></p>
- <p><a href='../html-svg/styling-css-04-f-isvalid.html'>../html-svg/styling-css-04-f-isvalid.html</a></p>
- <p><a href='../html-svg/styling-css-05-b-isvalid.html'>../html-svg/styling-css-05-b-isvalid.html</a></p>
- <p><a href='../html-svg/styling-css-06-b-isvalid.html'>../html-svg/styling-css-06-b-isvalid.html</a></p>
- <p><a href='../html-svg/styling-css-07-f-isvalid.html'>../html-svg/styling-css-07-f-isvalid.html</a></p>
- <p><a href='../html-svg/styling-css-08-f-isvalid.html'>../html-svg/styling-css-08-f-isvalid.html</a></p>
- <p><a href='../html-svg/styling-css-09-f-isvalid.html'>../html-svg/styling-css-09-f-isvalid.html</a></p>
- <p><a href='../html-svg/styling-css-10-f-isvalid.html'>../html-svg/styling-css-10-f-isvalid.html</a></p>
- <p><a href='../html-svg/styling-elem-01-b-isvalid.html'>../html-svg/styling-elem-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/styling-inherit-01-b-isvalid.html'>../html-svg/styling-inherit-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/styling-pres-01-t-isvalid.html'>../html-svg/styling-pres-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/styling-pres-03-f-isvalid.html'>../html-svg/styling-pres-03-f-isvalid.html</a></p>
- <p><a href='../html-svg/styling-pres-04-f-isvalid.html'>../html-svg/styling-pres-04-f-isvalid.html</a></p>
- <p><a href='../html-svg/styling-pres-05-f-isvalid.html'>../html-svg/styling-pres-05-f-isvalid.html</a></p>
- <p><a href='../html-svg/text-align-01-b-isvalid.html'>../html-svg/text-align-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-align-02-b-isvalid.html'>../html-svg/text-align-02-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-align-03-b-isvalid.html'>../html-svg/text-align-03-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-align-04-b-isvalid.html'>../html-svg/text-align-04-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-align-05-b-isvalid.html'>../html-svg/text-align-05-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-align-06-b-isvalid.html'>../html-svg/text-align-06-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-align-07-t-isvalid.html'>../html-svg/text-align-07-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-align-08-b-isvalid.html'>../html-svg/text-align-08-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-altglyph-01-b-isvalid.html'>../html-svg/text-altglyph-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-altglyph-02-b-isvalid.html'>../html-svg/text-altglyph-02-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-altglyph-03-b-isvalid.html'>../html-svg/text-altglyph-03-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-bidi-01-t-isvalid.html'>../html-svg/text-bidi-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-deco-01-b-isvalid.html'>../html-svg/text-deco-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-dom-01-f-isvalid.html'>../html-svg/text-dom-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/text-dom-04-f-isvalid.html'>../html-svg/text-dom-04-f-isvalid.html</a></p>
- <p><a href='../html-svg/text-fonts-01-t-isvalid.html'>../html-svg/text-fonts-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-fonts-02-t-isvalid.html'>../html-svg/text-fonts-02-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-fonts-04-t-isvalid.html'>../html-svg/text-fonts-04-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-fonts-202-t-isvalid.html'>../html-svg/text-fonts-202-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-fonts-203-t-isvalid.html'>../html-svg/text-fonts-203-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-fonts-204-t-isvalid.html'>../html-svg/text-fonts-204-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-intro-01-t-isvalid.html'>../html-svg/text-intro-01-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-intro-02-b-isvalid.html'>../html-svg/text-intro-02-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-intro-03-b-isvalid.html'>../html-svg/text-intro-03-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-intro-04-t-isvalid.html'>../html-svg/text-intro-04-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-intro-05-t-isvalid.html'>../html-svg/text-intro-05-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-intro-06-t-isvalid.html'>../html-svg/text-intro-06-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-intro-07-t-isvalid.html'>../html-svg/text-intro-07-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-intro-09-b-isvalid.html'>../html-svg/text-intro-09-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-intro-10-f-isvalid.html'>../html-svg/text-intro-10-f-isvalid.html</a></p>
- <p><a href='../html-svg/text-intro-11-t-isvalid.html'>../html-svg/text-intro-11-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-intro-12-t-isvalid.html'>../html-svg/text-intro-12-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-path-01-b-isvalid.html'>../html-svg/text-path-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-path-02-b-isvalid.html'>../html-svg/text-path-02-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-spacing-01-b-isvalid.html'>../html-svg/text-spacing-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-text-01-b-isvalid.html'>../html-svg/text-text-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-text-03-b-isvalid.html'>../html-svg/text-text-03-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-text-04-t-isvalid.html'>../html-svg/text-text-04-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-text-05-t-isvalid.html'>../html-svg/text-text-05-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-text-06-t-isvalid.html'>../html-svg/text-text-06-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-text-07-t-isvalid.html'>../html-svg/text-text-07-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-text-08-b-isvalid.html'>../html-svg/text-text-08-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-text-09-t-isvalid.html'>../html-svg/text-text-09-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-text-10-t-isvalid.html'>../html-svg/text-text-10-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-text-11-t-isvalid.html'>../html-svg/text-text-11-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-text-12-t-isvalid.html'>../html-svg/text-text-12-t-isvalid.html</a></p>
- <p><a href='../html-svg/text-tref-01-b-isvalid.html'>../html-svg/text-tref-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-tselect-01-b-isvalid.html'>../html-svg/text-tselect-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-tspan-01-b-isvalid.html'>../html-svg/text-tspan-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/text-tspan-02-b-isvalid.html'>../html-svg/text-tspan-02-b-isvalid.html</a></p>
- <p><a href='../html-svg/types-basic-01-f-isvalid.html'>../html-svg/types-basic-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/types-basic-02-f-isvalid.html'>../html-svg/types-basic-02-f-isvalid.html</a></p>
- <p><a href='../html-svg/types-dom-01-b-isvalid.html'>../html-svg/types-dom-01-b-isvalid.html</a></p>
- <p><a href='../html-svg/types-dom-06-f-isvalid.html'>../html-svg/types-dom-06-f-isvalid.html</a></p>
- <p><a href='../html-svg/types-dom-svgfittoviewbox-01-f-isvalid.html'>../html-svg/types-dom-svgfittoviewbox-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/types-dom-svglengthlist-01-f-isvalid.html'>../html-svg/types-dom-svglengthlist-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/types-dom-svgnumberlist-01-f-isvalid.html'>../html-svg/types-dom-svgnumberlist-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/types-dom-svgstringlist-01-f-isvalid.html'>../html-svg/types-dom-svgstringlist-01-f-isvalid.html</a></p>
- <p><a href='../html-svg/types-dom-svgtransformable-01-f-isvalid.html'>../html-svg/types-dom-svgtransformable-01-f-isvalid.html</a></p>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/tools/ins-del-datetime.py b/tests/wpt/web-platform-tests/conformance-checkers/tools/ins-del-datetime.py
index 3767a7d709f..88ccc443d80 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/tools/ins-del-datetime.py
+++ b/tests/wpt/web-platform-tests/conformance-checkers/tools/ins-del-datetime.py
@@ -106,7 +106,6 @@ non_errors = {
"date-1968-02-29": "1968-02-29",
"date-1900-02-28": "1900-02-28",
"date-2100-02-28": "2100-02-28",
- "date-2100-02-28": "2100-02-28",
"date-2200-02-28": "2200-02-28",
"date-2014-02-28": "2014-02-28",
"date-day-01-31": "2002-01-31",
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/tools/url.py b/tests/wpt/web-platform-tests/conformance-checkers/tools/url.py
index f97d428abe9..21fd27e3e41 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/tools/url.py
+++ b/tests/wpt/web-platform-tests/conformance-checkers/tools/url.py
@@ -3,9 +3,6 @@ import os
ccdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# based on https://github.com/w3c/web-platform-tests/blob/275544eab54a0d0c7f74ccc2baae9711293d8908/url/urltestdata.txt
invalid = {
- "scheme-trailing-tab": "a:\tfoo.com",
- "scheme-trailing-newline": "a:\nfoo.com",
- "scheme-trailing-cr": "a:\rfoo.com",
"scheme-trailing-space": "a: foo.com",
"scheme-trailing-tab": "a:\tfoo.com",
"scheme-trailing-newline": "a:\nfoo.com",
@@ -105,7 +102,6 @@ valid_absolute = {
"port-0": "http://f:0/c",
"port-00000000000000": "http://f:00000000000000/c",
"port-00000000000000000000080": "http://f:00000000000000000000080/c",
- "port-00000000000000000000080": "http://f:00000000000000000000080/c",
"userinfo-host-port-path": "http://a:b@c:29/d",
"userinfo-username-non-alpha": "http://foo.com:b@d/",
"query-contains-question-mark": "http://foo/abcd?efgh?ijkl",
diff --git a/tests/wpt/web-platform-tests/console/OWNERS b/tests/wpt/web-platform-tests/console/OWNERS
new file mode 100644
index 00000000000..6ff90b755fc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/console/OWNERS
@@ -0,0 +1,2 @@
+@domenic
+@pwnall
diff --git a/tests/wpt/web-platform-tests/console/console-is-a-namespace.any.js b/tests/wpt/web-platform-tests/console/console-is-a-namespace.any.js
new file mode 100644
index 00000000000..a4aae7ffce8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/console/console-is-a-namespace.any.js
@@ -0,0 +1,27 @@
+"use strict";
+// https://heycam.github.io/webidl/#es-namespaces
+// https://console.spec.whatwg.org/#console-namespace
+
+test(() => {
+ assert_true(self.hasOwnProperty("console"));
+}, "console exists on the global object");
+
+test(() => {
+ const propDesc = Object.getOwnPropertyDescriptor(self, "console");
+ assert_equals(propDesc.writable, true, "must be writable");
+ assert_equals(propDesc.enumerable, false, "must not be enumerable");
+ assert_equals(propDesc.configurable, true, "must be configurable");
+ assert_equals(propDesc.value, console, "must have the right value");
+}, "console has the right property descriptors");
+
+test(() => {
+ assert_false("Console" in self);
+}, "Console (uppercase, as if it were an interface) must not exist");
+
+test(() => {
+ const prototype1 = Object.getPrototypeOf(console);
+ const prototype2 = Object.getPrototypeOf(prototype1);
+
+ assert_equals(Object.getOwnPropertyNames(prototype1).length, 0, "The [[Prototype]] must have no properties");
+ assert_equals(prototype2, Object.prototype, "The [[Prototype]]'s [[Prototype]] must be %ObjectPrototype%");
+}, "The prototype chain must be correct");
diff --git a/tests/wpt/web-platform-tests/content-security-policy/OWNERS b/tests/wpt/web-platform-tests/content-security-policy/OWNERS
index 27348607493..1df5d1ae68f 100644
--- a/tests/wpt/web-platform-tests/content-security-policy/OWNERS
+++ b/tests/wpt/web-platform-tests/content-security-policy/OWNERS
@@ -1,2 +1 @@
-@sideshowbarker
@hillbrad
diff --git a/tests/wpt/web-platform-tests/content-security-policy/font-src/font-blacklisted-ref.html b/tests/wpt/web-platform-tests/content-security-policy/font-src/font-blacklisted-ref.html
new file mode 100644
index 00000000000..fdfbdd93de3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/font-src/font-blacklisted-ref.html
@@ -0,0 +1,6 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>csp font-src: blacklisted</title>
+<link href="fonts.css" rel="stylesheet" type="text/css">
+         
+<p>The test passes if the line above are boxes in the test and glyphs in the reference.</p> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/font-src/font-blacklisted.html b/tests/wpt/web-platform-tests/content-security-policy/font-src/font-blacklisted.html
new file mode 100644
index 00000000000..a430a417d8d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/font-src/font-blacklisted.html
@@ -0,0 +1,9 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta http-equiv="Content-Security-Policy" content="font-src 'none'">
+<title>csp font-src: blacklisted</title>
+<link rel="mismatch" href="font-blacklisted-ref.html">
+<link rel="help" href="https://www.w3.org/TR/CSP2/#directive-font-src">
+<link href="fonts.css" rel="stylesheet" type="text/css">
+         
+<p>The test passes if the line above are boxes in the test and glyphs in the reference.</p> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/font-src/font-whitelisted-ref.html b/tests/wpt/web-platform-tests/content-security-policy/font-src/font-whitelisted-ref.html
new file mode 100644
index 00000000000..25ad3bd75cf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/font-src/font-whitelisted-ref.html
@@ -0,0 +1,6 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>csp font-src: whitelisted</title>
+<link href="fonts.css" rel="stylesheet" type="text/css">
+         
+<p>The test passes if the line above shows the same glyphs in the reference.</p> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/font-src/font-whitelisted.html b/tests/wpt/web-platform-tests/content-security-policy/font-src/font-whitelisted.html
new file mode 100644
index 00000000000..f3558f76639
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/font-src/font-whitelisted.html
@@ -0,0 +1,9 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta http-equiv="Content-Security-Policy" content="font-src 'self'">
+<title>csp font-src: whitelisted</title>
+<link rel="match" href="font-whitelisted-ref.html">
+<link rel="help" href="https://www.w3.org/TR/CSP2/#directive-font-src">
+<link href="fonts.css" rel="stylesheet" type="text/css">
+         
+<p>The test passes if the line above shows the same glyphs in the reference.</p> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/font-src/fonts.css b/tests/wpt/web-platform-tests/content-security-policy/font-src/fonts.css
new file mode 100644
index 00000000000..30dd02cdb73
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/font-src/fonts.css
@@ -0,0 +1,8 @@
+@font-face {
+ font-family: 'Halflings';
+ src: url('/tools/runner/fonts/glyphicons-halflings-regular.woff') format('woff');
+}
+
+body {
+ font-family: 'Halflings', Fallback, sans-serif;
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/navigation/to-javascript-url.html b/tests/wpt/web-platform-tests/content-security-policy/navigation/to-javascript-url.html
new file mode 100644
index 00000000000..d882330cece
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/navigation/to-javascript-url.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<meta http-equiv="Content-Security-Policy" content="script-src 'nonce-abc'">
+<body>
+<script nonce="abc">
+ function assert_csp_event_for_element(test, element) {
+ document.addEventListener("securitypolicyviolation", test.step_func(e => {
+ if (e.target != element)
+ return;
+ assert_equals(e.blockedURI, "inline");
+ assert_equals(e.effectiveDirective, "script-src");
+ assert_equals(element.contentDocument.body.innerText, "");
+ element.parentNode.removeChild(element);
+ test.done();
+ }));
+ }
+
+ async_test(t => {
+ var i = document.createElement("iframe");
+
+ assert_csp_event_for_element(t, i);
+
+ i.src = "javascript:'Fail.'";
+ document.body.appendChild(i);
+ }, "<iframe src='javascript:'> blocked without 'unsafe-inline'.");
+
+ async_test(t => {
+ var i = document.createElement("iframe");
+
+ assert_csp_event_for_element(t, i);
+
+ i.onload = _ => { i.src = "javascript:'Fail.'"; }
+ document.body.appendChild(i);
+ }, "<iframe> navigated to 'javascript:' blocked without 'unsafe-inline'.");
+
+ async_test(t => {
+ var i = document.createElement("iframe");
+
+ assert_csp_event_for_element(t, i);
+
+ i.src = "../support/echo-policy.py?policy=" + encodeURIComponent("script-src 'unsafe-inline'");
+ i.onload = _ => { i.src = "javascript:'Fail.'"; }
+ document.body.appendChild(i);
+ }, "<iframe src='...'> with 'unsafe-inline' navigated to 'javascript:' blocked in this document");
+
+ async_test(t => {
+ var i = document.createElement("iframe");
+
+ assert_csp_event_for_element(t, i);
+
+ i.src = "../support/echo-policy.py?policy=" + encodeURIComponent("script-src 'none'");
+ i.onload = _ => { i.src = "javascript:'Fail.'"; }
+ document.body.appendChild(i);
+ }, "<iframe src='...'> without 'unsafe-inline' navigated to 'javascript:' blocked in this document.");
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_and_unsafe_eval_eval.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_and_unsafe_eval_eval.html
new file mode 100755
index 00000000000..96ef2496b5b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_and_unsafe_eval_eval.html
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML>
+<html>
+
+<head>
+ <title>Scripts injected via `eval` are allowed with `strict-dynamic` with `unsafe-eval`.</title>
+ <script src='/resources/testharness.js' nonce='dummy'></script>
+ <script src='/resources/testharnessreport.js' nonce='dummy'></script>
+
+ <!-- CSP served: script-src 'strict-dynamic' 'nonce-dummy' 'unsafe-eval' -->
+</head>
+
+<body>
+ <h1>Scripts injected via `eval` are allowed with `strict-dynamic` with `unsafe-eval`.</h1>
+ <div id='log'></div>
+
+ <script nonce='dummy'>
+ var evalScriptRan = false;
+ async_test(function(t) {
+ window.addEventListener('securitypolicyviolation', t.unreached_func('No CSP violation report has fired.'));
+ try {
+ eval("evalScriptRan = true;");
+ } catch (e) {
+ assert_unreached("`eval` should be allowed with `strict-dynamic` with `unsafe-eval`.");
+ }
+ assert_true(evalScriptRan);
+ t.done();
+ }, "Script injected via `eval` is allowed with `strict-dynamic` with `unsafe-eval`.");
+ </script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_and_unsafe_eval_eval.html.headers b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_and_unsafe_eval_eval.html.headers
new file mode 100755
index 00000000000..dc5f30a03a3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_and_unsafe_eval_eval.html.headers
@@ -0,0 +1,5 @@
+Expires: Mon, 26 Jul 1997 05:00:00 GMT
+Cache-Control: no-store, no-cache, must-revalidate
+Cache-Control: post-check=0, pre-check=0, false
+Pragma: no-cache
+Content-Security-Policy: script-src 'strict-dynamic' 'nonce-dummy' 'unsafe-eval'
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_and_unsafe_eval_new_function.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_and_unsafe_eval_new_function.html
new file mode 100755
index 00000000000..3041db056f2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_and_unsafe_eval_new_function.html
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML>
+<html>
+
+<head>
+ <title>Scripts injected via `new Function()` are allowed with `strict-dynamic` with `unsafe-eval`.</title>
+ <script src='/resources/testharness.js' nonce='dummy'></script>
+ <script src='/resources/testharnessreport.js' nonce='dummy'></script>
+
+ <!-- CSP served: script-src 'strict-dynamic' 'nonce-dummy' 'unsafe-eval' -->
+</head>
+
+<body>
+ <h1>Scripts injected via `new Function()` are allowed with `strict-dynamic` with `unsafe-eval`.</h1>
+ <div id='log'></div>
+
+ <script nonce='dummy'>
+ var newFunctionScriptRan = false;
+ async_test(function(t) {
+ window.addEventListener('securitypolicyviolation', t.unreached_func('No CSP violation report has fired.'));
+ try {
+ new Function('newFunctionScriptRan = true;')();
+ } catch (e) {
+ assert_unreached("`new Function()` should be allowed with `strict-dynamic` with `unsafe-eval`.");
+ }
+ assert_true(newFunctionScriptRan);
+ t.done();
+ }, "Script injected via `new Function()` is allowed with `strict-dynamic` with `unsafe-eval`.");
+ </script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_and_unsafe_eval_new_function.html.headers b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_and_unsafe_eval_new_function.html.headers
new file mode 100755
index 00000000000..dc5f30a03a3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_and_unsafe_eval_new_function.html.headers
@@ -0,0 +1,5 @@
+Expires: Mon, 26 Jul 1997 05:00:00 GMT
+Cache-Control: no-store, no-cache, must-revalidate
+Cache-Control: post-check=0, pre-check=0, false
+Pragma: no-cache
+Content-Security-Policy: script-src 'strict-dynamic' 'nonce-dummy' 'unsafe-eval'
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_discard_whitelist.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_discard_whitelist.html
new file mode 100755
index 00000000000..4e194468304
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_discard_whitelist.html
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML>
+<html>
+
+<head>
+ <title>Whitelists are discarded with `strict-dynamic` in the script-src directive.</title>
+ <script src='/resources/testharness.js' nonce='dummy'></script>
+ <script src='/resources/testharnessreport.js' nonce='dummy'></script>
+
+ <!-- CSP served: script-src 'self' 'strict-dynamic' 'nonce-dummy' -->
+</head>
+
+<body>
+ <h1>Whitelists are discarded with `strict-dynamic` in the script-src directive.</h1>
+ <div id='log'></div>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'whitelistedScript') {
+ assert_unreached('Whitelisted script without a correct nonce is not allowed with `strict-dynamic`.');
+ }
+ }));
+ window.addEventListener('securitypolicyviolation', t.step_func_done(function(e) {
+ assert_equals(e.effectiveDirective, 'script-src');
+ }));
+ }, 'Whitelisted script without a correct nonce is not allowed with `strict-dynamic`.');
+ </script>
+ <script id='whitelistedScript' src='simpleSourcedScript.js'></script>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_discard_whitelist.html.headers b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_discard_whitelist.html.headers
new file mode 100755
index 00000000000..8499eb0559d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_discard_whitelist.html.headers
@@ -0,0 +1,5 @@
+Expires: Mon, 26 Jul 1997 05:00:00 GMT
+Cache-Control: no-store, no-cache, must-revalidate
+Cache-Control: post-check=0, pre-check=0, false
+Pragma: no-cache
+Content-Security-Policy: script-src 'self' 'strict-dynamic' 'nonce-dummy'
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_different_nonce.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_different_nonce.html
new file mode 100755
index 00000000000..cd2ae8c16c0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_different_nonce.html
@@ -0,0 +1,68 @@
+<!DOCTYPE HTML>
+<html>
+
+<head>
+ <title>A separate policy with more nonces works correctly with `strict-dynamic` in the script-src directive.</title>
+ <script src='/resources/testharness.js' nonce='dummy'></script>
+ <script src='/resources/testharnessreport.js' nonce='dummy'></script>
+
+ <!-- CSP served:
+ 1) Content-Security-Policy: script-src 'strict-dynamic' 'nonce-dummy'
+ 2) Content-Security-Policy: script-src 'nonce-dummy' 'nonce-dummy2'
+ -->
+</head>
+
+<body>
+ <h1>A separate policy with more nonces works correctly with `strict-dynamic` in the script-src directive.</h1>
+ <div id='log'></div>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'unNonced-appendChild') {
+ assert_unreached('Unnonced script injected via `appendChild` is not allowed with `strict-dynamic` + a nonce-only double policy.');
+ }
+ }));
+
+ window.addEventListener('securitypolicyviolation', t.step_func(function(violation) {
+ if (violation.blockedURI.split('?')[1] !== 'unNonced-appendChild') {
+ return;
+ }
+ assert_equals(violation.effectiveDirective, 'script-src');
+ t.done();
+ }));
+
+ var e = document.createElement('script');
+ e.id = 'unNonced-appendChild';
+ e.src = 'simpleSourcedScript.js?' + e.id;
+ e.onload = t.unreached_func('OnLoad should not be triggered.');
+ document.body.appendChild(e);
+ }, 'Unnonced script injected via `appendChild` is not allowed with `strict-dynamic` + a nonce-only double policy.');
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'nonced-appendChild') {
+ t.done();
+ }
+ }));
+
+ window.addEventListener('securitypolicyviolation', t.step_func(function(violation) {
+ if (violation.blockedURI.split('?')[1] !== 'nonced-appendChild') {
+ return;
+ }
+ assert_unreached('No CSP violation report has fired.');
+ }));
+
+ var e = document.createElement('script');
+ e.setAttribute('nonce', 'dummy2');
+ e.id = 'nonced-appendChild';
+ e.src = 'simpleSourcedScript.js?' + e.id;
+ e.onerror = t.unreached_func('Error should not be triggered.');
+ document.body.appendChild(e);
+ }, 'Script injected via `appendChild` with a correct nonce is allowed with `strict-dynamic` + a nonce-only double policy.');
+ </script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_different_nonce.html.headers b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_different_nonce.html.headers
new file mode 100755
index 00000000000..63d96aaf1ee
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_different_nonce.html.headers
@@ -0,0 +1,6 @@
+Expires: Mon, 26 Jul 1997 05:00:00 GMT
+Cache-Control: no-store, no-cache, must-revalidate
+Cache-Control: post-check=0, pre-check=0, false
+Pragma: no-cache
+Content-Security-Policy: script-src 'strict-dynamic' 'nonce-dummy'
+Content-Security-Policy: script-src 'nonce-dummy' 'nonce-dummy2'
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_honor_whitelist.sub.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_honor_whitelist.sub.html
new file mode 100755
index 00000000000..94490de1b46
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_honor_whitelist.sub.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML>
+<html>
+
+<head>
+ <title>Whitelists in a separate policy are honored with `strict-dynamic` in the script-src directive.</title>
+ <script src='/resources/testharness.js' nonce='dummy'></script>
+ <script src='/resources/testharnessreport.js' nonce='dummy'></script>
+
+ <!-- CSP served:
+ 1) Content-Security-Policy: script-src 'strict-dynamic' 'nonce-dummy'
+ 2) Content-Security-Policy: script-src 'self' 'nonce-dummy'
+ -->
+</head>
+
+<body>
+ <h1>Whitelists in a separate policy are honored with `strict-dynamic` in the script-src directive.</h1>
+ <div id='log'></div>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'whitelisted-appendChild') {
+ t.done();
+ }
+ }));
+ window.addEventListener('securitypolicyviolation', t.step_func(function(violation) {
+ if (violation.blockedURI.split('?')[1] !== 'whitelisted-appendChild') {
+ return;
+ }
+ assert_unreached('Script injected via `appendChild` is allowed with `strict-dynamic` + a nonce+whitelist double policy.');
+ }));
+
+ var e = document.createElement('script');
+ e.id = 'whitelisted-appendChild';
+ e.src = 'simpleSourcedScript.js?' + e.id;
+ e.onerror = t.unreached_func('Error should not be triggered.');
+ document.body.appendChild(e);
+ }, 'Script injected via `appendChild` is allowed with `strict-dynamic` + a nonce+whitelist double policy.');
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('securitypolicyviolation', t.step_func(function(violation) {
+ if (violation.blockedURI.split('?')[1] !== 'nonWhitelisted-appendChild') {
+ return;
+ }
+ assert_equals(violation.effectiveDirective, 'script-src');
+ assert_equals(violation.originalPolicy, "script-src 'self' 'nonce-dummy'");
+ t.done();
+ }));
+
+ var e = document.createElement('script');
+ e.id = 'nonWhitelisted-appendChild';
+ e.src = '{{location[scheme]}}://{{domains[www2]}}:{{ports[http][0]}}/nonexisting.js?' + e.id;
+ e.onload = t.unreached_func('OnLoad should not be triggered.');
+ document.body.appendChild(e);
+ }, 'Non-whitelisted script injected via `appendChild` is not allowed with `strict-dynamic` + a nonce+whitelist double policy.');
+ </script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_honor_whitelist.sub.html.headers b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_honor_whitelist.sub.html.headers
new file mode 100755
index 00000000000..5b4078efd37
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_honor_whitelist.sub.html.headers
@@ -0,0 +1,6 @@
+Expires: Mon, 26 Jul 1997 05:00:00 GMT
+Cache-Control: no-store, no-cache, must-revalidate
+Cache-Control: post-check=0, pre-check=0, false
+Pragma: no-cache
+Content-Security-Policy: script-src 'strict-dynamic' 'nonce-dummy'
+Content-Security-Policy: script-src 'self' 'nonce-dummy'
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_report_only.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_report_only.html
new file mode 100755
index 00000000000..1e057ba947e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_report_only.html
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML>
+<html>
+
+<head>
+ <title>A separate Report-Only policy does not influence `strict-dynamic` in the script-src directive.</title>
+ <script src='/resources/testharness.js' nonce='dummy'></script>
+ <script src='/resources/testharnessreport.js' nonce='dummy'></script>
+
+ <!-- CSP served:
+ 1) Content-Security-Policy: script-src 'strict-dynamic' 'nonce-dummy'
+ 2) Content-Security-Policy-Report-Only: script-src 'none'
+ -->
+</head>
+
+<body>
+ <h1>A separate Report-Only policy does not influence `strict-dynamic` in the script-src directive.</h1>
+ <div id='log'></div>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'appendChild-reportOnly') {
+ t.done();
+ }
+ }));
+ window.addEventListener('securitypolicyviolation', t.step_func(function(violation) {
+ if (violation.blockedURI.split('?')[1] !== 'appendChild-reportOnly') {
+ return;
+ }
+ assert_equals(violation.effectiveDirective, 'script-src');
+ // Check that the violation comes from the Report-Only policy.
+ assert_equals(violation.originalPolicy, "script-src 'none'");
+ t.done();
+ }));
+ var e = document.createElement('script');
+ e.id = 'appendChild-reportOnly';
+ e.src = 'simpleSourcedScript.js?' + e.id;
+ e.onerror = t.unreached_func('Error should not be triggered.');
+ document.body.appendChild(e);
+ }, 'Script injected via `appendChild` is allowed with `strict-dynamic` + Report-Only `script-src \'none\'` policy.');
+ </script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_report_only.html.headers b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_report_only.html.headers
new file mode 100755
index 00000000000..7883f80ef61
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_double_policy_report_only.html.headers
@@ -0,0 +1,6 @@
+Expires: Mon, 26 Jul 1997 05:00:00 GMT
+Cache-Control: no-store, no-cache, must-revalidate
+Cache-Control: post-check=0, pre-check=0, false
+Pragma: no-cache
+Content-Security-Policy: script-src 'strict-dynamic' 'nonce-dummy'
+Content-Security-Policy-Report-Only: script-src 'none'
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_eval.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_eval.html
new file mode 100755
index 00000000000..62fda4f3d23
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_eval.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML>
+<html>
+
+<head>
+ <title>Scripts injected via `eval` are not allowed with `strict-dynamic` without `unsafe-eval`.</title>
+ <script src='/resources/testharness.js' nonce='dummy'></script>
+ <script src='/resources/testharnessreport.js' nonce='dummy'></script>
+
+ <!-- CSP served: script-src 'strict-dynamic' 'nonce-dummy' -->
+</head>
+
+<body>
+ <h1>Scripts injected via `eval` are not allowed with `strict-dynamic` without `unsafe-eval`.</h1>
+ <div id='log'></div>
+
+ <script nonce='dummy'>
+ var evalScriptRan = false;
+
+ async_test(function(t) {
+ window.addEventListener('securitypolicyviolation', t.step_func_done(function(e) {
+ assert_false(evalScriptRan);
+ assert_equals(e.effectiveDirective, 'script-src');
+ }));
+
+ assert_throws(new Error(),
+ function() {
+ try {
+ eval("evalScriptRan = true;");
+ } catch (e) {
+ throw new Error();
+ }
+ });
+ }, "Script injected via `eval` is not allowed with `strict-dynamic` without `unsafe-eval`.");
+ </script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_eval.html.headers b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_eval.html.headers
new file mode 100755
index 00000000000..b7918c93323
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_eval.html.headers
@@ -0,0 +1,5 @@
+Expires: Mon, 26 Jul 1997 05:00:00 GMT
+Cache-Control: no-store, no-cache, must-revalidate
+Cache-Control: post-check=0, pre-check=0, false
+Pragma: no-cache
+Content-Security-Policy: script-src 'strict-dynamic' 'nonce-dummy'
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_hashes.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_hashes.html
new file mode 100755
index 00000000000..acb9f00d808
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_hashes.html
@@ -0,0 +1,52 @@
+<!DOCTYPE HTML>
+<html>
+
+<head>
+ <title>`strict-dynamic` allows scripts matching hashes present in the policy.</title>
+ <script src='/resources/testharness.js' nonce='dummy'></script>
+ <script src='/resources/testharnessreport.js' nonce='dummy'></script>
+
+ <!-- CSP served: script-src 'strict-dynamic' 'nonce-dummy' 'sha256-yU6Q7nD1TCBB9JvY06iIJ8ONLOPU4g8ml5JCDgXkv+M=' 'sha256-IFt1v6itHgqlrtInbPm/y7qyWcAlDbPgZM+92C5EZ5o=' -->
+</head>
+
+<body>
+ <h1>`strict-dynamic` allows scripts matching hashes present in the policy.</h1>
+ <div id='log'></div>
+
+ <script nonce='dummy'>
+ var hashScriptRan = false;
+ window.addEventListener('securitypolicyviolation', function(e) {
+ assert_unreached('No CSP violation report has fired.');
+ });
+ </script>
+
+ <!-- Hash: 'sha256-yU6Q7nD1TCBB9JvY06iIJ8ONLOPU4g8ml5JCDgXkv+M=' -->
+ <script>
+ hashScriptRan = true;
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ assert_true(hashScriptRan);
+ t.done();
+ }, "Script matching SHA256 hash is allowed with `strict-dynamic`.");
+ </script>
+
+ <!-- Hash: 'sha256-IFt1v6itHgqlrtInbPm/y7qyWcAlDbPgZM+92C5EZ5o=' -->
+ <script>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'hashScript') {
+ t.done();
+ }
+ }));
+ var e = document.createElement('script');
+ e.id = 'hashScript';
+ e.src = 'simpleSourcedScript.js?' + e.id;
+ e.onerror = t.unreached_func('Error should not be triggered.');
+ document.body.appendChild(e);
+ }, 'Script injected via `appendChild` from a script matching SHA256 hash is allowed with `strict-dynamic`.');
+ </script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_hashes.html.headers b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_hashes.html.headers
new file mode 100755
index 00000000000..f48fca3ec49
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_hashes.html.headers
@@ -0,0 +1,5 @@
+Expires: Mon, 26 Jul 1997 05:00:00 GMT
+Cache-Control: no-store, no-cache, must-revalidate
+Cache-Control: post-check=0, pre-check=0, false
+Pragma: no-cache
+Content-Security-Policy: script-src 'strict-dynamic' 'nonce-dummy' 'sha256-yU6Q7nD1TCBB9JvY06iIJ8ONLOPU4g8ml5JCDgXkv+M=' 'sha256-IFt1v6itHgqlrtInbPm/y7qyWcAlDbPgZM+92C5EZ5o='
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_in_img-src.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_in_img-src.html
new file mode 100644
index 00000000000..d640421cb74
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_in_img-src.html
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML>
+<html>
+
+<head>
+ <title>`strict-dynamic` does not drop whitelists in `img-src`.</title>
+ <script src='/resources/testharness.js' nonce='dummy'></script>
+ <script src='/resources/testharnessreport.js' nonce='dummy'></script>
+
+ <!-- CSP served: img-src 'strict-dynamic' 'self' -->
+</head>
+
+<body>
+ <h1>`strict-dynamic` does not drop whitelists in `img-src`.</h1>
+ <div id='log'></div>
+
+ <script nonce='dummy'>
+ window.addEventListener('securitypolicyviolation', function(e) {
+ assert_unreached('No CSP violation report has fired.');
+ });
+
+ async_test(function(t) {
+ var e = document.createElement('img');
+ e.id = 'whitelistedImage';
+ e.src = '/content-security-policy/support/pass.png';
+ e.onerror = t.unreached_func('Error should not be triggered.');
+ e.onload = t.step_func_done();
+ document.body.appendChild(e);
+ }, '`strict-dynamic` does not drop whitelists in `img-src`.');
+ </script>
+</body>
+
+</html>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_in_img-src.html.headers b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_in_img-src.html.headers
new file mode 100644
index 00000000000..75a41c9e251
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_in_img-src.html.headers
@@ -0,0 +1,5 @@
+Expires: Mon, 26 Jul 1997 05:00:00 GMT
+Cache-Control: no-store, no-cache, must-revalidate
+Cache-Control: post-check=0, pre-check=0, false
+Pragma: no-cache
+Content-Security-Policy: img-src 'strict-dynamic' 'self'
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_meta_tag.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_meta_tag.html
new file mode 100755
index 00000000000..fa38b65a238
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_meta_tag.html
@@ -0,0 +1,76 @@
+<!DOCTYPE HTML>
+<html>
+
+<head>
+ <title>A `strict-dynamic` policy can be served in a META tag.</title>
+ <meta http-equiv="Content-Security-Policy" content="script-src 'strict-dynamic' 'nonce-dummy'">
+ <script src='/resources/testharness.js' nonce='dummy'></script>
+ <script src='/resources/testharnessreport.js' nonce='dummy'></script>
+
+ <!-- CSP served: script-src 'strict-dynamic' 'nonce-dummy' -->
+</head>
+
+<body>
+ <h1>A `strict-dynamic` policy can be served in a META tag.</h1>
+ <div id='log'></div>
+
+ <script nonce='dummy'>
+ window.addEventListener('securitypolicyviolation', function(e) {
+ assert_unreached('No CSP violation report has fired.');
+ });
+
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'appendChild') {
+ t.done();
+ }
+ }));
+ var e = document.createElement('script');
+ e.id = 'appendChild';
+ e.src = 'simpleSourcedScript.js?' + e.id;
+ e.onerror = t.unreached_func('Error should not be triggered.');
+ document.body.appendChild(e);
+ }, 'Script injected via `appendChild` is allowed with `strict-dynamic`.');
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'appendChild-incorrectNonce') {
+ t.done();
+ }
+ }));
+ var e = document.createElement('script');
+ e.id = 'appendChild-incorrectNonce';
+ e.src = 'simpleSourcedScript.js?' + e.id;
+ e.setAttribute('nonce', 'wrong');
+ e.onerror = t.unreached_func('Error should not be triggered.');
+ document.body.appendChild(e);
+ }, 'Script injected via `appendChild` is allowed with `strict-dynamic`, even if it carries an incorrect nonce.');
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.appendChildViaTextContent = t.step_func_done();
+ var e = document.createElement('script');
+ e.id = 'appendChild-textContent';
+ e.textContent = "appendChildViaTextContent();";
+ e.onerror = t.unreached_func('Error should not be triggered.');
+ document.body.appendChild(e);
+ }, 'Script injected via `appendChild` populated via `textContent` is allowed with `strict-dynamic`.');
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.appendChildViaTextContentIncorrectNonce = t.step_func_done();
+ var e = document.createElement('script');
+ e.id = 'appendChild-textContent-incorrectNonce';
+ e.setAttribute('nonce', 'wrong');
+ e.textContent = "appendChildViaTextContentIncorrectNonce();";
+ e.onerror = t.unreached_func('Error should not be triggered.');
+ document.body.appendChild(e);
+ }, 'Script injected via `appendChild` populated via `textContent` is allowed with `strict-dynamic`, even if it carries an incorrect nonce.');
+ </script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_meta_tag.html.headers b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_meta_tag.html.headers
new file mode 100755
index 00000000000..519dcaacb1f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_meta_tag.html.headers
@@ -0,0 +1,4 @@
+Expires: Mon, 26 Jul 1997 05:00:00 GMT
+Cache-Control: no-store, no-cache, must-revalidate
+Cache-Control: post-check=0, pre-check=0, false
+Pragma: no-cache
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_new_function.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_new_function.html
new file mode 100755
index 00000000000..2b75276588f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_new_function.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML>
+<html>
+
+<head>
+ <title>Scripts injected via `new Function()` are not allowed with `strict-dynamic` without `unsafe-eval`.</title>
+ <script src='/resources/testharness.js' nonce='dummy'></script>
+ <script src='/resources/testharnessreport.js' nonce='dummy'></script>
+
+ <!-- CSP served: script-src 'strict-dynamic' 'nonce-dummy' -->
+</head>
+
+<body>
+ <h1>Scripts injected via `new Function()` are not allowed with `strict-dynamic` without `unsafe-eval`.</h1>
+ <div id='log'></div>
+
+ <script nonce='dummy'>
+ var newFunctionScriptRan = false;
+
+ async_test(function(t) {
+ window.addEventListener('securitypolicyviolation', t.step_func_done(function(e) {
+ assert_false(newFunctionScriptRan);
+ assert_equals(e.effectiveDirective, 'script-src');
+ }));
+
+ assert_throws(new Error(),
+ function() {
+ try {
+ new Function('newFunctionScriptRan = true;')();
+ } catch (e) {
+ throw new Error();
+ }
+ });
+ }, "Script injected via 'eval' is not allowed with 'strict-dynamic' without 'unsafe-eval'.");
+ </script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_new_function.html.headers b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_new_function.html.headers
new file mode 100755
index 00000000000..b7918c93323
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_new_function.html.headers
@@ -0,0 +1,5 @@
+Expires: Mon, 26 Jul 1997 05:00:00 GMT
+Cache-Control: no-store, no-cache, must-revalidate
+Cache-Control: post-check=0, pre-check=0, false
+Pragma: no-cache
+Content-Security-Policy: script-src 'strict-dynamic' 'nonce-dummy'
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted.html
new file mode 100755
index 00000000000..63b7a612470
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted.html
@@ -0,0 +1,76 @@
+<!DOCTYPE HTML>
+<html>
+
+<head>
+ <title>Nonced and non parser-inserted scripts should run with `strict-dynamic` in the script-src directive.</title>
+ <script src='/resources/testharness.js' nonce='dummy'></script>
+ <script src='/resources/testharnessreport.js' nonce='dummy'></script>
+
+ <!-- CSP served: script-src 'strict-dynamic' 'nonce-dummy' -->
+</head>
+
+<body>
+ <h1>Nonced and non parser-inserted scripts should run with `strict-dynamic` in the script-src directive.</h1>
+ <div id='log'></div>
+
+ <script nonce='dummy'>
+ window.addEventListener('securitypolicyviolation', function(e) {
+ assert_unreached('No CSP violation report has fired.');
+ });
+
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'appendChild') {
+ t.done();
+ }
+ }));
+ var e = document.createElement('script');
+ e.id = 'appendChild';
+ e.src = 'simpleSourcedScript.js?' + e.id;
+ e.onerror = t.unreached_func('Error should not be triggered.');
+ document.body.appendChild(e);
+ }, 'Script injected via `appendChild` is allowed with `strict-dynamic`.');
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'appendChild-incorrectNonce') {
+ t.done();
+ }
+ }));
+ var e = document.createElement('script');
+ e.id = 'appendChild-incorrectNonce';
+ e.src = 'simpleSourcedScript.js?' + e.id;
+ e.setAttribute('nonce', 'wrong');
+ e.onerror = t.unreached_func('Error should not be triggered.');
+ document.body.appendChild(e);
+ }, 'Script injected via `appendChild` is allowed with `strict-dynamic`, even if it carries an incorrect nonce.');
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.appendChildViaTextContent = t.step_func_done();
+ var e = document.createElement('script');
+ e.id = 'appendChild-textContent';
+ e.textContent = "appendChildViaTextContent();";
+ e.onerror = t.unreached_func('Error should not be triggered.');
+ document.body.appendChild(e);
+ }, 'Script injected via `appendChild` populated via `textContent` is allowed with `strict-dynamic`.');
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.appendChildViaTextContentIncorrectNonce = t.step_func_done();
+ var e = document.createElement('script');
+ e.id = 'appendChild-textContent-incorrectNonce';
+ e.setAttribute('nonce', 'wrong');
+ e.textContent = "appendChildViaTextContentIncorrectNonce();";
+ e.onerror = t.unreached_func('Error should not be triggered.');
+ document.body.appendChild(e);
+ }, 'Script injected via `appendChild` populated via `textContent` is allowed with `strict-dynamic`, even if it carries an incorrect nonce.');
+ </script>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted.html.headers b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted.html.headers
new file mode 100755
index 00000000000..b7918c93323
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted.html.headers
@@ -0,0 +1,5 @@
+Expires: Mon, 26 Jul 1997 05:00:00 GMT
+Cache-Control: no-store, no-cache, must-revalidate
+Cache-Control: post-check=0, pre-check=0, false
+Pragma: no-cache
+Content-Security-Policy: script-src 'strict-dynamic' 'nonce-dummy'
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted_incorrect_nonce.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted_incorrect_nonce.html
new file mode 100755
index 00000000000..19d2ae1acc7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted_incorrect_nonce.html
@@ -0,0 +1,29 @@
+<!DOCTYPE HTML>
+<html>
+
+<head>
+ <title>Scripts without a correct nonce should not run with `strict-dynamic` in the script-src directive.</title>
+ <script src='/resources/testharness.js' nonce='dummy'></script>
+ <script src='/resources/testharnessreport.js' nonce='dummy'></script>
+
+ <!-- CSP served: script-src 'strict-dynamic' 'nonce-dummy' -->
+</head>
+
+<body>
+ <h1>Scripts without a correct nonce should not run with `strict-dynamic` in the script-src directive.</h1>
+ <div id='log'></div>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('securitypolicyviolation', t.step_func_done(function(e) {
+ assert_equals(e.effectiveDirective, 'script-src');
+ }));
+ }, 'All the expected CSP violation reports have been fired.');
+ </script>
+
+ <script nonce='wrong'>
+ assert_unreached('Inline script with an incorrect nonce should not be executed.');
+ </script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted_incorrect_nonce.html.headers b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted_incorrect_nonce.html.headers
new file mode 100755
index 00000000000..b7918c93323
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_non_parser_inserted_incorrect_nonce.html.headers
@@ -0,0 +1,5 @@
+Expires: Mon, 26 Jul 1997 05:00:00 GMT
+Cache-Control: no-store, no-cache, must-revalidate
+Cache-Control: post-check=0, pre-check=0, false
+Pragma: no-cache
+Content-Security-Policy: script-src 'strict-dynamic' 'nonce-dummy'
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_parser_inserted.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_parser_inserted.html
new file mode 100755
index 00000000000..c167e5ef625
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_parser_inserted.html
@@ -0,0 +1,205 @@
+<!DOCTYPE HTML>
+<html>
+
+<head>
+ <title>Parser-inserted scripts without a correct nonce are not allowed with `strict-dynamic` in the script-src directive.</title>
+ <script src='/resources/testharness.js' nonce='dummy'></script>
+ <script src='/resources/testharnessreport.js' nonce='dummy'></script>
+
+ <!-- CSP served: script-src 'strict-dynamic' 'nonce-dummy' -->
+</head>
+
+<body>
+ <h1>Parser-inserted scripts without a correct nonce are not allowed with `strict-dynamic` in the script-src directive.</h1>
+ <div id='log'></div>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'documentWrite') {
+ assert_unreached('Parser-inserted script via `document.write` without a correct nonce is not allowed with `strict-dynamic`.');
+ }
+ }));
+ window.addEventListener('securitypolicyviolation', t.step_func(function(violation) {
+ if (violation.blockedURI.split('?')[1] !== 'documentWrite') {
+ return;
+ }
+ assert_equals(violation.effectiveDirective, 'script-src');
+ t.done();
+ }));
+
+ document.write('<scr' + 'ipt id="documentWrite" src="simpleSourcedScript.js?documentWrite"></scr' + 'ipt>');
+ }, 'Parser-inserted script via `document.write` without a correct nonce is not allowed with `strict-dynamic`.');
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'documentWriteln') {
+ assert_unreached('Parser-inserted script via `document.writeln` without a correct nonce is not allowed with `strict-dynamic`.');
+ }
+ }));
+ window.addEventListener('securitypolicyviolation', t.step_func(function(violation) {
+ if (violation.blockedURI.split('?')[1] !== 'documentWriteln') {
+ return;
+ }
+ assert_equals(violation.effectiveDirective, 'script-src');
+ t.done();
+ }));
+
+ document.writeln('<scr' + 'ipt id="documentWriteln" src="simpleSourcedScript.js?documentWriteln"></scr' + 'ipt>');
+ }, 'Parser-inserted script via `document.writeln` without a correct nonce is not allowed with `strict-dynamic`.');
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'documentWrite-deferred') {
+ assert_unreached('Parser-inserted deferred script via `document.write` without a correct nonce is not allowed with `strict-dynamic`.');
+ }
+ }));
+ window.addEventListener('securitypolicyviolation', t.step_func(function(violation) {
+ if (violation.blockedURI.split('?')[1] !== 'documentWrite-deferred') {
+ return;
+ }
+ assert_equals(violation.effectiveDirective, 'script-src');
+ t.done();
+ }));
+
+ document.write('<scr' + 'ipt defer id="documentWrite-deferred" src="simpleSourcedScript.js?documentWrite-deferred"></scr' + 'ipt>');
+ }, 'Parser-inserted deferred script via `document.write` without a correct nonce is not allowed with `strict-dynamic`.');
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'documentWriteln-deferred') {
+ assert_unreached('Parser-inserted deferred script via `document.writeln` without a correct nonce is not allowed with `strict-dynamic`.');
+ }
+ }));
+ window.addEventListener('securitypolicyviolation', t.step_func(function(violation) {
+ if (violation.blockedURI.split('?')[1] !== 'documentWriteln-deferred') {
+ return;
+ }
+ assert_equals(violation.effectiveDirective, 'script-src');
+ t.done();
+ }));
+
+ document.writeln('<scr' + 'ipt defer id="documentWriteln-deferred" src="simpleSourcedScript.js?documentWriteln-deferred"></scr' + 'ipt>');
+ }, 'Parser-inserted deferred script via `document.writeln` without a correct nonce is not allowed with `strict-dynamic`.');
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'documentWrite-async') {
+ assert_unreached('Parser-inserted async script via `document.write` without a correct nonce is not allowed with `strict-dynamic`.');
+ }
+ }));
+ window.addEventListener('securitypolicyviolation', t.step_func(function(violation) {
+ if (violation.blockedURI.split('?')[1] !== 'documentWrite-async') {
+ return;
+ }
+ assert_equals(violation.effectiveDirective, 'script-src');
+ t.done();
+ }));
+
+ document.write('<scr' + 'ipt async id="documentWrite-async" src="simpleSourcedScript.js?documentWrite-async"></scr' + 'ipt>');
+ }, 'Parser-inserted async script via `document.write` without a correct nonce is not allowed with `strict-dynamic`.');
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'documentWriteln-async') {
+ assert_unreached('Parser-inserted async script via `document.writeln` without a correct nonce is not allowed with `strict-dynamic`.');
+ }
+ }));
+ window.addEventListener('securitypolicyviolation', t.step_func(function(violation) {
+ if (violation.blockedURI.split('?')[1] !== 'documentWriteln-async') {
+ return;
+ }
+ assert_equals(violation.effectiveDirective, 'script-src');
+ t.done();
+ }));
+
+ document.writeln('<scr' + 'ipt async id="documentWriteln-async" src="simpleSourcedScript.js?documentWriteln-async"></scr' + 'ipt>');
+ }, 'Parser-inserted async script via `document.writeln` without a correct nonce is not allowed with `strict-dynamic`.');
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'documentWrite-deferred-async') {
+ assert_unreached('Parser-inserted deferred async script via `document.write` without a correct nonce is not allowed with `strict-dynamic`.');
+ }
+ }));
+ window.addEventListener('securitypolicyviolation', t.step_func(function(violation) {
+ if (violation.blockedURI.split('?')[1] !== 'documentWrite-deferred-async') {
+ return;
+ }
+ assert_equals(violation.effectiveDirective, 'script-src');
+ t.done();
+ }));
+
+ document.write('<scr' + 'ipt defer async id="documentWrite-deferred-async" src="simpleSourcedScript.js?documentWrite-deferred-async"></scr' + 'ipt>');
+ }, 'Parser-inserted deferred async script via `document.write` without a correct nonce is not allowed with `strict-dynamic`.');
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'documentWriteln-deferred-async') {
+ assert_unreached('Parser-inserted deferred async script via `document.writeln` without a correct nonce is not allowed with `strict-dynamic`.');
+ }
+ }));
+ window.addEventListener('securitypolicyviolation', t.step_func(function(violation) {
+ if (violation.blockedURI.split('?')[1] !== 'documentWriteln-deferred-async') {
+ return;
+ }
+ assert_equals(violation.effectiveDirective, 'script-src');
+ t.done();
+ }));
+
+ document.writeln('<scr' + 'ipt defer async id="documentWriteln-deferred-async " src="simpleSourcedScript.js?documentWriteln-deferred-async "></scr' + 'ipt>');
+ }, 'Parser-inserted deferred async script via `document.writeln` without a correct nonce is not allowed with `strict-dynamic`.');
+ </script>
+
+ <script nonce='dummy'>
+ var innerHTMLScriptRan = false;
+ async_test(function(t) {
+ window.addEventListener('securitypolicyviolation', t.step_func(function(violation) {
+ if (violation.target.id !== 'innerHTML') {
+ return;
+ }
+ assert_false(innerHTMLScriptRan);
+ assert_equals(violation.effectiveDirective, 'script-src');
+ t.done();
+ }));
+
+ var e = document.createElement('div');
+ e.innerHTML = "<img id='innerHTML' src='/nonexisting.jpg' onerror='innerHTMLScriptRan = true;' style='display:none'>";
+ document.body.appendChild(e);
+ }, 'Script injected via `innerHTML` is not allowed with `strict-dynamic`.');
+ </script>
+
+ <script nonce='dummy'>
+ var insertAdjacentHTMLScriptRan = false;
+ async_test(function(t) {
+ window.addEventListener('securitypolicyviolation', t.step_func(function(violation) {
+ if (violation.target.id !== 'insertAdjacentHTML') {
+ return;
+ }
+ assert_false(insertAdjacentHTMLScriptRan);
+ assert_equals(violation.effectiveDirective, 'script-src');
+ t.done();
+ }));
+
+ var e = document.createElement('div');
+ e.insertAdjacentHTML('afterbegin', "<img id='insertAdjacentHTML' src='/nonexisting.jpg' onerror='insertAdjacentHTMLScriptRan = true;' style='display:none'>");
+ document.body.appendChild(e);
+ }, 'Script injected via `insertAdjacentHTML` is not allowed with `strict-dynamic`.');
+ </script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_parser_inserted.html.headers b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_parser_inserted.html.headers
new file mode 100755
index 00000000000..b7918c93323
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_parser_inserted.html.headers
@@ -0,0 +1,5 @@
+Expires: Mon, 26 Jul 1997 05:00:00 GMT
+Cache-Control: no-store, no-cache, must-revalidate
+Cache-Control: post-check=0, pre-check=0, false
+Pragma: no-cache
+Content-Security-Policy: script-src 'strict-dynamic' 'nonce-dummy'
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_parser_inserted_correct_nonce.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_parser_inserted_correct_nonce.html
new file mode 100755
index 00000000000..9368089781d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_parser_inserted_correct_nonce.html
@@ -0,0 +1,110 @@
+<!DOCTYPE HTML>
+<html>
+
+<head>
+ <title>Parser-inserted scripts with a correct nonce are allowed with `strict-dynamic` in the script-src directive.</title>
+ <script src='/resources/testharness.js' nonce='dummy'></script>
+ <script src='/resources/testharnessreport.js' nonce='dummy'></script>
+
+ <!-- CSP served: script-src 'strict-dynamic' 'nonce-dummy' -->
+</head>
+
+<body>
+ <h1>Parser-inserted scripts with a correct nonce are allowed with `strict-dynamic` in the script-src directive.</h1>
+ <div id='log'></div>
+
+ <script nonce='dummy'>
+ window.addEventListener('securitypolicyviolation', function(e) {
+ assert_unreached('No CSP violation report has fired.');
+ });
+
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'documentWrite') {
+ t.done();
+ }
+ }));
+ document.write('<scr' + 'ipt nonce="dummy" id="documentWrite" src="simpleSourcedScript.js"></scr' + 'ipt>');
+ }, 'Parser-inserted script via `document.write` with a correct nonce is allowed with `strict-dynamic`.');
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'documentWriteln') {
+ t.done();
+ }
+ }));
+ document.writeln('<scr' + 'ipt nonce="dummy" id="documentWriteln" src="simpleSourcedScript.js"></scr' + 'ipt>');
+ }, 'Parser-inserted script via `document.writeln` with a correct nonce is allowed with `strict-dynamic`.');
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'documentWrite-defer') {
+ t.done();
+ }
+ }));
+ document.write('<scr' + 'ipt defer nonce="dummy" id="documentWrite-defer" src="simpleSourcedScript.js"></scr' + 'ipt>');
+ }, 'Parser-inserted deferred script via `document.write` with a correct nonce is allowed with `strict-dynamic`.');
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'documentWriteln-defer') {
+ t.done();
+ }
+ }));
+ document.writeln('<scr' + 'ipt defer nonce="dummy" id="documentWriteln-defer" src="simpleSourcedScript.js"></scr' + 'ipt>');
+ }, 'Parser-inserted deferred script via `document.writeln` with a correct nonce is allowed with `strict-dynamic`.');
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'documentWrite-async') {
+ t.done();
+ }
+ }));
+ document.write('<scr' + 'ipt async nonce="dummy" id="documentWrite-async" src="simpleSourcedScript.js"></scr' + 'ipt>');
+ }, 'Parser-inserted async script via `document.write` with a correct nonce is allowed with `strict-dynamic`.');
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'documentWriteln-async') {
+ t.done();
+ }
+ }));
+ document.writeln('<scr' + 'ipt async nonce="dummy" id="documentWriteln-async" src="simpleSourcedScript.js"></scr' + 'ipt>');
+ }, 'Parser-inserted async script via `document.writeln` with a correct nonce is allowed with `strict-dynamic`.');
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'documentWrite-defer-async') {
+ t.done();
+ }
+ }));
+ document.write('<scr' + 'ipt defer async nonce="dummy" id="documentWrite-defer-async" src="simpleSourcedScript.js"></scr' + 'ipt>');
+ }, 'Parser-inserted deferred async script via `document.write` with a correct nonce is allowed with `strict-dynamic`.');
+ </script>
+
+ <script nonce='dummy'>
+ async_test(function(t) {
+ window.addEventListener('message', t.step_func(function(e) {
+ if (e.data === 'documentWriteln-defer-async') {
+ t.done();
+ }
+ }));
+ document.writeln('<scr' + 'ipt defer async nonce="dummy" id="documentWriteln-defer-async" src="simpleSourcedScript.js"></scr' + 'ipt>');
+ }, 'Parser-inserted deferred async script via `document.writeln` with a correct nonce is allowed with `strict-dynamic`.');
+ </script>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_parser_inserted_correct_nonce.html.headers b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_parser_inserted_correct_nonce.html.headers
new file mode 100755
index 00000000000..b7918c93323
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_parser_inserted_correct_nonce.html.headers
@@ -0,0 +1,5 @@
+Expires: Mon, 26 Jul 1997 05:00:00 GMT
+Cache-Control: no-store, no-cache, must-revalidate
+Cache-Control: post-check=0, pre-check=0, false
+Pragma: no-cache
+Content-Security-Policy: script-src 'strict-dynamic' 'nonce-dummy'
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/simpleSourcedScript.js b/tests/wpt/web-platform-tests/content-security-policy/script-src/simpleSourcedScript.js
new file mode 100755
index 00000000000..deca86508ff
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/simpleSourcedScript.js
@@ -0,0 +1 @@
+window.postMessage(document.currentScript.id, "*");
diff --git a/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/blockeduri-eval.html b/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/blockeduri-eval.html
new file mode 100644
index 00000000000..c9d74e623f5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/blockeduri-eval.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline'">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ async_test(t => {
+ var watcher = new EventWatcher(t, document, 'securitypolicyviolation');
+ watcher.wait_for('securitypolicyviolation').then(t.step_func_done(e => {
+ assert_equals(e.blockedURI, "eval");
+ assert_equals(e.lineNumber, 14);
+ }));
+
+ try {
+ eval("assert_unreached('eval() should be blocked.");
+ } catch (e) {
+ assert_equals(e.name, 'EvalError');
+ }
+ }, "Eval violations have a blockedURI of 'eval'");
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/blockeduri-inline.html b/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/blockeduri-inline.html
new file mode 100644
index 00000000000..c4862337407
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/blockeduri-inline.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<meta http-equiv="Content-Security-Policy" content="script-src 'nonce-abc'">
+<script nonce="abc" src="/resources/testharness.js"></script>
+<script nonce="abc" src="/resources/testharnessreport.js"></script>
+<script nonce="abc">
+ async_test(t => {
+ var watcher = new EventWatcher(t, document, 'securitypolicyviolation');
+ watcher.wait_for('securitypolicyviolation').then(t.step_func_done(e => {
+ assert_equals(e.blockedURI, "inline");
+ assert_equals(e.lineNumber, 14);
+ }));
+ }, "Inline violations have a blockedURI of 'inline'");
+</script>
+<script>
+ test(t => {
+ assert_unreached();
+ }, "Blocked script shouldn't execute.");
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/idl.html b/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/idl.html
new file mode 100644
index 00000000000..17f492e7344
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/idl.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<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 type="text/plain" id="untested">
+ enum SecurityPolicyViolationEventDisposition {
+ "enforce", "report"
+ };
+
+ dictionary SecurityPolicyViolationEventInit : EventInit {
+ DOMString documentURI;
+ DOMString referrer;
+ DOMString blockedURI;
+ DOMString violatedDirective;
+ DOMString effectiveDirective;
+ DOMString originalPolicy;
+ DOMString sourceFile;
+ SecurityPolicyViolationEventDisposition disposition;
+ unsigned short statusCode;
+ long lineNumber;
+ long columnNumber;
+ };
+</script>
+<script type="text/plain" id="tested">
+ [Constructor(DOMString type, optional SecurityPolicyViolationEventInit eventInitDict)]
+ interface SecurityPolicyViolationEvent : Event {
+ readonly attribute DOMString documentURI;
+ readonly attribute DOMString referrer;
+ readonly attribute DOMString blockedURI;
+ readonly attribute DOMString violatedDirective;
+ readonly attribute DOMString effectiveDirective;
+ readonly attribute DOMString originalPolicy;
+ readonly attribute DOMString sourceFile;
+ readonly attribute SecurityPolicyViolationEventDisposition disposition;
+ readonly attribute unsigned short statusCode;
+ readonly attribute long lineNumber;
+ readonly attribute long columnNumber;
+ };
+</script>
+<script>
+ var idl_array = new IdlArray();
+ idl_array.add_untested_idls(document.querySelector('#untested').textContent);
+ idl_array.add_idls(document.querySelector('#tested').textContent);
+ idl_array.add_objects({
+ SecurityPolicyViolationEvent: ['new SecurityPolicyViolationEvent({})']
+ });
+ idl_array.test();
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/targeting.html b/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/targeting.html
new file mode 100644
index 00000000000..36069a5959d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/targeting.html
@@ -0,0 +1,159 @@
+<!doctype html>
+<meta http-equiv="Content-Security-Policy" content="script-src 'nonce-abc'; style-src 'self'">
+<script nonce="abc" src="/resources/testharness.js"></script>
+<script nonce="abc" src="/resources/testharnessreport.js"></script>
+<script nonce="abc">
+ var unexecuted_test = async_test("These tests should not fail.");
+
+ async_test(t => {
+ var watcher = new EventWatcher(t, document, ['securitypolicyviolation'])
+ watcher.wait_for('securitypolicyviolation')
+ .then(t.step_func(e => {
+ assert_equals(e.blockedURI, "inline");
+ assert_equals(e.target, document.querySelector('#block1'));
+ return watcher.wait_for('securitypolicyviolation');
+ }))
+ .then(t.step_func(e => {
+ assert_equals(e.blockedURI, "inline");
+ assert_equals(e.target, document.querySelector('#block2'));
+ return watcher.wait_for('securitypolicyviolation');
+ }))
+ .then(t.step_func(e => {
+ assert_equals(e.blockedURI, "inline");
+ assert_equals(e.target, document.querySelector('#block3'));
+ return watcher.wait_for('securitypolicyviolation');
+ }))
+ .then(t.step_func(e => {
+ assert_equals(e.blockedURI, "inline");
+ assert_equals(e.target, document.querySelector('#block4'));
+ return watcher.wait_for('securitypolicyviolation');
+ }))
+ .then(t.step_func(e => {
+ assert_equals(e.blockedURI, "inline");
+ assert_equals(e.target, document.querySelector('#block5'));
+ return watcher.wait_for('securitypolicyviolation');
+ }))
+ .then(t.step_func(e => {
+ assert_equals(e.blockedURI, "inline");
+ assert_equals(e.lineNumber, 132);
+ assert_equals(e.target, document, "Disconnected elements target the document");
+ return watcher.wait_for('securitypolicyviolation');
+ }))
+ .then(t.step_func(e => {
+ assert_equals(e.blockedURI, "inline");
+ assert_equals(e.lineNumber, 143);
+ assert_equals(e.target, document, "Elements disconnected after triggering target the document.");
+ return watcher.wait_for('securitypolicyviolation');
+ }))
+ .then(t.step_func(e => {
+ assert_equals(e.blockedURI, "inline");
+ assert_equals(e.lineNumber, 157);
+ assert_equals(e.target, document, "Elements in DocumentFragments target the document");
+ }))
+ .then(t.step_func_done(_ => {
+ unexecuted_test.done();
+ }));
+ }, "Inline violations target the right element.");
+</script>
+<!-- Inline block with no nonce. -->
+<script id="block1">
+ unexecuted_test.assert_unreached("This code block should not execute.");
+</script>
+
+<!-- Inline event handler. -->
+<a id="block2" onclick="void(0)">Click me!</a>
+<script nonce='abc'>document.querySelector('#block2').click();</script>
+
+<!-- Style block. -->
+<style id="block3">
+ p { color: red !important; }
+</style>
+
+<!-- Inline event handler inside Shadow DOM -->
+<div id="block4"></div>
+<script nonce='abc'>
+ async_test(t => {
+ var shadow = document.querySelector('#block4').attachShadow({"mode":"closed"});
+ shadow.innerHTML = "<a id='block4a' onclick='void(0)'>Click!</a>";
+ var a = shadow.querySelector('#block4a');
+ a.addEventListener('securitypolicyviolation', t.step_func_done(e => {
+ assert_equals(e.blockedURI, "inline");
+ assert_equals(e.target, a);
+ }));
+ a.click();
+ }, "Correct targeting inside shadow tree (inline handler).");
+</script>
+
+<!-- Inline event handler inside Shadow DOM -->
+<div id="block5"></div>
+<script nonce='abc'>
+ async_test(t => {
+ var shadow = document.querySelector('#block5').attachShadow({"mode":"closed"});
+ var style = document.createElement('style');
+ style.innerText = 'p { color: red; }';
+ style.addEventListener('securitypolicyviolation', t.step_func_done(e => {
+ assert_equals(e.blockedURI, "inline");
+ assert_equals(e.target, style);
+ }));
+ shadow.appendChild(style);
+ }, "Correct targeting inside shadow tree (style).");
+</script>
+
+<!-- Pushed into a same-origin Document that isn't this Document -->
+<iframe id="block6"></iframe>
+<script nonce="abc">
+ async_test(t => {
+ var d = document.createElement("div");
+ d.setAttribute("onclick", "void(0);");
+ var events = 0;
+ d.addEventListener('securitypolicyviolation', t.step_func(e => {
+ events++;
+ assert_equals(e.blockedURI, "inline");
+ assert_equals(e.target, d);
+ }));
+ document.querySelector('#block6').contentDocument.addEventListener('securitypolicyviolation', t.step_func_done(e => {
+ events++;
+ assert_equals(e.blockedURI, "inline");
+ assert_equals(e.target, d);
+ assert_equals(events, 2);
+ }));
+ document.querySelector('#block6').contentDocument.body.appendChild(d);
+ d.click();
+ }, "Elements created in this document, but pushed into a same-origin frame trigger on that frame's document, not on this frame's document.");
+</script>
+
+<!-- Disconnected inline event handler -->
+<script nonce="abc">
+ async_test(t => {
+ var d = document.createElement("div");
+ d.setAttribute("onclick", "void(0);");
+ d.addEventListener('securitypolicyviolation', t.unreached_func());
+ d.click();
+ t.done();
+ }, "Inline event handlers for disconnected elements target the document.");
+</script>
+
+<!-- Inline event handler, disconnected after click. -->
+<a id="block8" onclick="void(0)">Click me also!</a>
+<script nonce="abc">
+ async_test(t => {
+ var a = document.querySelector('#block8');
+ a.addEventListener('securitypolicyviolation', t.unreached_func());
+ a.click();
+ a.parentNode.removeChild(a);
+ t.done();
+ }, "Inline event handlers for elements disconnected after triggering target the document.");
+</script>
+
+<!-- Disconnected in a DocumentFragment -->
+<script nonce="abc">
+ async_test(t => {
+ var f = new DocumentFragment();
+ var d = document.createElement('div');
+ d.setAttribute('onclick', 'void(0)');
+ d.addEventListener('securitypolicyviolation', t.unreached_func());
+ f.appendChild(d);
+ d.click();
+ t.done();
+ }, "Inline event handlers for elements in a DocumentFragment target the document.");
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/support/echo-policy.py b/tests/wpt/web-platform-tests/content-security-policy/support/echo-policy.py
new file mode 100644
index 00000000000..ebde3dc5a4b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/support/echo-policy.py
@@ -0,0 +1,3 @@
+def main(request, response):
+ policy = request.GET.first("policy");
+ return [("Content-Type", "text/html"), ("Content-Security-Policy", policy)], "<!DOCTYPE html><title>Echo.</title>"
diff --git a/tests/wpt/web-platform-tests/content-security-policy/support/ping.js b/tests/wpt/web-platform-tests/content-security-policy/support/ping.js
new file mode 100644
index 00000000000..750ae45f969
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/support/ping.js
@@ -0,0 +1,12 @@
+if (typeof ServiceWorkerGlobalScope === "function") {
+ self.onmessage = function (e) { e.source.postMessage("ping"); };
+} else if (typeof SharedWorkerGlobalScope === "function") {
+ onconnect = function (e) {
+ var port = e.ports[0];
+
+ port.onmessage = function () { port.postMessage("ping"); }
+ port.postMessage("ping");
+ };
+} else if (typeof DedicatedWorkerGlobalScope === "function") {
+ self.postMessage("ping");
+}
diff --git a/tests/wpt/web-platform-tests/content-security-policy/support/testharness-helper.js b/tests/wpt/web-platform-tests/content-security-policy/support/testharness-helper.js
new file mode 100644
index 00000000000..a1eaa891e03
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/support/testharness-helper.js
@@ -0,0 +1,131 @@
+function assert_no_csp_event_for_url(test, url) {
+ document.addEventListener("securitypolicyviolation", test.step_func(e => {
+ if (e.blockedURI !== url)
+ return;
+ assert_unreached("SecurityPolicyViolation event fired for " + url);
+ }));
+}
+
+function assert_no_event(test, obj, name) {
+ obj.addEventListener(name, test.unreached_func("The '" + name + "' event should not have fired."));
+}
+
+function waitUntilCSPEventForURL(test, url) {
+ return new Promise((resolve, reject) => {
+ document.addEventListener("securitypolicyviolation", test.step_func(e => {
+ if (e.blockedURI == url)
+ resolve(e);
+ }));
+ });
+}
+
+function waitUntilEvent(obj, name) {
+ return new Promise((resolve, reject) => {
+ obj.addEventListener(name, resolve);
+ });
+}
+
+// Given the URL of a worker that pings its opener upon load, this
+// function builds a test that asserts that the ping is received,
+// and that no CSP event fires.
+function assert_worker_is_loaded(url, description) {
+ async_test(t => {
+ assert_no_csp_event_for_url(t, url);
+ var w = new Worker(url);
+ assert_no_event(t, w, "error");
+ waitUntilEvent(w, "message")
+ .then(t.step_func_done(e => {
+ assert_equals(e.data, "ping");
+ }));
+ }, description);
+}
+
+function assert_shared_worker_is_loaded(url, description) {
+ async_test(t => {
+ assert_no_csp_event_for_url(t, url);
+ var w = new SharedWorker(url);
+ assert_no_event(t, w, "error");
+ waitUntilEvent(w.port, "message")
+ .then(t.step_func_done(e => {
+ assert_equals(e.data, "ping");
+ }));
+ w.port.start();
+ }, description);
+}
+
+function assert_service_worker_is_loaded(url, description) {
+ promise_test(t => {
+ assert_no_csp_event_for_url(t, url);
+ return Promise.all([
+ waitUntilEvent(navigator.serviceWorker, "message")
+ .then(e => {
+ assert_equals(e.data, "ping");
+ }),
+ navigator.serviceWorker.register(url, { scope: url })
+ .then(r => {
+ var sw = r.active || r.installing || r.waiting;
+ t.add_cleanup(_ => r.unregister());
+ sw.postMessage("pong?");
+ })
+ ]);
+ }, description);
+}
+
+// Given the URL of a worker that pings its opener upon load, this
+// function builds a test that asserts that the constructor throws
+// a SecurityError, and that a CSP event fires.
+function assert_worker_is_blocked(url, description) {
+ async_test(t => {
+ // If |url| is a blob, it will be stripped down to "blob" for reporting.
+ var reportedURL = new URL(url).protocol == "blob:" ? "blob" : url;
+ waitUntilCSPEventForURL(t, reportedURL)
+ .then(t.step_func_done(e => {
+ assert_equals(e.blockedURI, reportedURL);
+ assert_equals(e.violatedDirective, "worker-src");
+ assert_equals(e.effectiveDirective, "worker-src");
+ }));
+
+ // TODO(mkwst): We shouldn't be throwing here. We should be firing an
+ // `error` event on the Worker. https://crbug.com/663298
+ assert_throws("SecurityError", function () {
+ var w = new Worker(url);
+ });
+ }, description);
+}
+
+function assert_shared_worker_is_blocked(url, description) {
+ async_test(t => {
+ // If |url| is a blob, it will be stripped down to "blob" for reporting.
+ var reportedURL = new URL(url).protocol == "blob:" ? "blob" : url;
+ waitUntilCSPEventForURL(t, reportedURL)
+ .then(t.step_func_done(e => {
+ assert_equals(e.blockedURI, reportedURL);
+ assert_equals(e.violatedDirective, "worker-src");
+ assert_equals(e.effectiveDirective, "worker-src");
+ }));
+
+ // TODO(mkwst): We shouldn't be throwing here. We should be firing an
+ // `error` event on the SharedWorker. https://crbug.com/663298
+ assert_throws("SecurityError", function () {
+ var w = new SharedWorker(url);
+ });
+ }, description);
+}
+
+function assert_service_worker_is_blocked(url, description) {
+ promise_test(t => {
+ assert_no_event(t, navigator.serviceWorker, "message");
+ // If |url| is a blob, it will be stripped down to "blob" for reporting.
+ var reportedURL = new URL(url).protocol == "blob:" ? "blob" : url;
+ return Promise.all([
+ waitUntilCSPEventForURL(t, reportedURL)
+ .then(t.step_func_done(e => {
+ assert_equals(e.blockedURI, reportedURL);
+ assert_equals(e.violatedDirective, "worker-src");
+ assert_equals(e.effectiveDirective, "worker-src");
+ })),
+ promise_rejects(t, "SecurityError", navigator.serviceWorker.register(url, { scope: url }))
+ ]);
+ }, description);
+}
+
diff --git a/tests/wpt/web-platform-tests/content-security-policy/worker-src/dedicated-child.sub.html b/tests/wpt/web-platform-tests/content-security-policy/worker-src/dedicated-child.sub.html
new file mode 100644
index 00000000000..cff8f953af1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/worker-src/dedicated-child.sub.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/testharness-helper.js"></script>
+<meta http-equiv="Content-Security-Policy" content="child-src http://{{host}}:{{ports[http][0]}} blob:">
+<script>
+ var url = new URL("../support/ping.js", document.baseURI).toString();
+ assert_worker_is_loaded(url, "Same-origin dedicated worker allowed by host-source expression.");
+
+ var b = new Blob(["postMessage('ping');"], {type: "text/javascript"});
+ var url = URL.createObjectURL(b);
+ assert_worker_is_loaded(url, "blob: dedicated worker allowed by 'blob:'.");
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/worker-src/dedicated-fallback.sub.html b/tests/wpt/web-platform-tests/content-security-policy/worker-src/dedicated-fallback.sub.html
new file mode 100644
index 00000000000..25602573fbd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/worker-src/dedicated-fallback.sub.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/testharness-helper.js"></script>
+<meta http-equiv="Content-Security-Policy" content="worker-src http://{{host}}:{{ports[http][0]}} blob:; child-src 'none'">
+<script>
+ var url = new URL("../support/ping.js", document.baseURI).toString();
+ assert_worker_is_loaded(url, "Same-origin dedicated worker allowed by host-source expression.");
+
+ var b = new Blob(["postMessage('ping');"], {type: "text/javascript"});
+ var url = URL.createObjectURL(b);
+ assert_worker_is_loaded(url, "blob: dedicated worker allowed by 'blob:'.");
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/worker-src/dedicated-list.sub.html b/tests/wpt/web-platform-tests/content-security-policy/worker-src/dedicated-list.sub.html
new file mode 100644
index 00000000000..fc4f9123247
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/worker-src/dedicated-list.sub.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/testharness-helper.js"></script>
+<meta http-equiv="Content-Security-Policy" content="worker-src http://{{host}}:{{ports[http][0]}} blob:">
+<script>
+ var url = new URL("../support/ping.js", document.baseURI).toString();
+ assert_worker_is_loaded(url, "Same-origin dedicated worker allowed by host-source expression.");
+
+ var b = new Blob(["postMessage('ping');"], {type: "text/javascript"});
+ var url = URL.createObjectURL(b);
+ assert_worker_is_loaded(url, "blob: dedicated worker allowed by 'blob:'.");
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/worker-src/dedicated-none.sub.html b/tests/wpt/web-platform-tests/content-security-policy/worker-src/dedicated-none.sub.html
new file mode 100644
index 00000000000..62c550788a2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/worker-src/dedicated-none.sub.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/testharness-helper.js"></script>
+<meta http-equiv="Content-Security-Policy" content="worker-src 'none'">
+<script>
+ var url = new URL("../support/ping.js", document.baseURI).toString();
+ assert_worker_is_blocked(url, "Same-origin dedicated worker blocked by host-source expression.");
+
+ var b = new Blob(["postMessage('ping');"], {type: "text/javascript"});
+ var url = URL.createObjectURL(b);
+ assert_worker_is_blocked(url, "blob: dedicated worker blocked by 'blob:'.");
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/worker-src/dedicated-self.sub.html b/tests/wpt/web-platform-tests/content-security-policy/worker-src/dedicated-self.sub.html
new file mode 100644
index 00000000000..ba0cd1bb43b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/worker-src/dedicated-self.sub.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/testharness-helper.js"></script>
+<meta http-equiv="Content-Security-Policy" content="worker-src 'self'">
+<script>
+ var url = new URL("../support/ping.js", document.baseURI).toString();
+ assert_worker_is_loaded(url, "Same-origin dedicated worker allowed by 'self'.");
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/worker-src/service-child.https.sub.html b/tests/wpt/web-platform-tests/content-security-policy/worker-src/service-child.https.sub.html
new file mode 100644
index 00000000000..5036cae5832
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/worker-src/service-child.https.sub.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/testharness-helper.js"></script>
+<meta http-equiv="Content-Security-Policy" content="child-src http://{{host}}:{{ports[http][0]}}">
+<script>
+ var url = new URL("../support/ping.js", document.baseURI).toString();
+ assert_service_worker_is_loaded(url, "Same-origin service worker allowed by host-source expression.");
+</script>
+
diff --git a/tests/wpt/web-platform-tests/content-security-policy/worker-src/service-fallback.https.sub.html b/tests/wpt/web-platform-tests/content-security-policy/worker-src/service-fallback.https.sub.html
new file mode 100644
index 00000000000..682a805e7c3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/worker-src/service-fallback.https.sub.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/testharness-helper.js"></script>
+<meta http-equiv="Content-Security-Policy" content="worker-src http://{{host}}:{{ports[http][0]}}; child-src 'none'">
+<script>
+ var url = new URL("../support/ping.js", document.baseURI).toString();
+ assert_service_worker_is_loaded(url, "Same-origin service worker allowed by host-source expression.");
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/worker-src/service-list.https.sub.html b/tests/wpt/web-platform-tests/content-security-policy/worker-src/service-list.https.sub.html
new file mode 100644
index 00000000000..251c856d3c1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/worker-src/service-list.https.sub.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/testharness-helper.js"></script>
+<meta http-equiv="Content-Security-Policy" content="worker-src http://{{host}}:{{ports[http][0]}}">
+<script>
+ var url = new URL("../support/ping.js", document.baseURI).toString();
+ assert_service_worker_is_loaded(url, "Same-origin service worker allowed by host-source expression.");
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/worker-src/service-none.https.sub.html b/tests/wpt/web-platform-tests/content-security-policy/worker-src/service-none.https.sub.html
new file mode 100644
index 00000000000..467a8ce2cf4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/worker-src/service-none.https.sub.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/testharness-helper.js"></script>
+<meta http-equiv="Content-Security-Policy" content="worker-src 'none'">
+<script>
+ var url = new URL("../support/ping.js", document.baseURI).toString();
+ assert_service_worker_is_blocked(url, "Same-origin service worker blocked by 'none'.");
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/worker-src/service-self.https.sub.html b/tests/wpt/web-platform-tests/content-security-policy/worker-src/service-self.https.sub.html
new file mode 100644
index 00000000000..d725e730129
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/worker-src/service-self.https.sub.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/testharness-helper.js"></script>
+<meta http-equiv="Content-Security-Policy" content="worker-src 'self'">
+<script>
+ var url = new URL("../support/ping.js", document.baseURI).toString();
+ assert_service_worker_is_loaded(url, "Same-origin service worker allowed by 'self'.");
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/worker-src/shared-child.sub.html b/tests/wpt/web-platform-tests/content-security-policy/worker-src/shared-child.sub.html
new file mode 100644
index 00000000000..93dd38b6f8e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/worker-src/shared-child.sub.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/testharness-helper.js"></script>
+<meta http-equiv="Content-Security-Policy" content="child-src http://{{host}}:{{ports[http][0]}} blob:">
+<script>
+ var url = new URL("../support/ping.js", document.baseURI).toString();
+ assert_shared_worker_is_loaded(url, "Same-origin dedicated worker allowed by 'self'.");
+
+ var b = new Blob(["onconnect = e => { e.ports[0].postMessage('ping'); }"], {type: "text/javascript"});
+ var url = URL.createObjectURL(b);
+ assert_shared_worker_is_loaded(url, "blob: dedicated worker allowed by 'blob:'.");
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/worker-src/shared-fallback.sub.html b/tests/wpt/web-platform-tests/content-security-policy/worker-src/shared-fallback.sub.html
new file mode 100644
index 00000000000..cfe9190a43e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/worker-src/shared-fallback.sub.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/testharness-helper.js"></script>
+<meta http-equiv="Content-Security-Policy" content="worker-src http://{{host}}:{{ports[http][0]}} blob:; child-src 'none'">
+<script>
+ var url = new URL("../support/ping.js", document.baseURI).toString();
+ assert_shared_worker_is_loaded(url, "Same-origin dedicated worker allowed by 'self'.");
+
+ var b = new Blob(["onconnect = e => { e.ports[0].postMessage('ping'); }"], {type: "text/javascript"});
+ var url = URL.createObjectURL(b);
+ assert_shared_worker_is_loaded(url, "blob: dedicated worker allowed by 'blob:'.");
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/worker-src/shared-list.sub.html b/tests/wpt/web-platform-tests/content-security-policy/worker-src/shared-list.sub.html
new file mode 100644
index 00000000000..6c985c76eb6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/worker-src/shared-list.sub.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/testharness-helper.js"></script>
+<meta http-equiv="Content-Security-Policy" content="worker-src http://{{host}}:{{ports[http][0]}} blob:">
+<script>
+ var url = new URL("../support/ping.js", document.baseURI).toString();
+ assert_shared_worker_is_loaded(url, "Same-origin dedicated worker allowed by 'self'.");
+
+ var b = new Blob(["onconnect = e => { e.ports[0].postMessage('ping'); }"], {type: "text/javascript"});
+ var url = URL.createObjectURL(b);
+ assert_shared_worker_is_loaded(url, "blob: dedicated worker allowed by 'blob:'.");
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/worker-src/shared-none.sub.html b/tests/wpt/web-platform-tests/content-security-policy/worker-src/shared-none.sub.html
new file mode 100644
index 00000000000..b443f321d3c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/worker-src/shared-none.sub.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/testharness-helper.js"></script>
+<meta http-equiv="Content-Security-Policy" content="worker-src 'none'">
+<script>
+ var url = new URL("../support/ping.js", document.baseURI).toString();
+ assert_shared_worker_is_blocked(url, "Same-origin shared worker blocked by 'none'.");
+
+ var b = new Blob(["onconnect = e => { e.ports[0].postMessage('ping'); }"], {type: "text/javascript"});
+ var url = URL.createObjectURL(b);
+ assert_shared_worker_is_blocked(url, "blob: shared worker blocked by 'none'.");
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/worker-src/shared-self.sub.html b/tests/wpt/web-platform-tests/content-security-policy/worker-src/shared-self.sub.html
new file mode 100644
index 00000000000..e6b368aab18
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/worker-src/shared-self.sub.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/testharness-helper.js"></script>
+<meta http-equiv="Content-Security-Policy" content="worker-src 'self'">
+<script>
+ var url = new URL("../support/ping.js", document.baseURI).toString();
+ assert_shared_worker_is_loaded(url, "Same-origin dedicated worker allowed by 'self'.");
+</script>
+
diff --git a/tests/wpt/web-platform-tests/cors/OWNERS b/tests/wpt/web-platform-tests/cors/OWNERS
index c8979792445..5080e023134 100644
--- a/tests/wpt/web-platform-tests/cors/OWNERS
+++ b/tests/wpt/web-platform-tests/cors/OWNERS
@@ -1,4 +1,3 @@
-@sideshowbarker
@zqzhang
@Velmont
@hillbrad
diff --git a/tests/wpt/web-platform-tests/cssom/serialize-values.html b/tests/wpt/web-platform-tests/cssom/serialize-values.html
new file mode 100644
index 00000000000..8f6f3d28d03
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom/serialize-values.html
@@ -0,0 +1,596 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSSOM serialize values</title>
+<meta name="author" title="Josh Matthews" href="mailto:josh@joshmatthews.net">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+ <div id="log"></div>
+ <div id="parent"></div>
+ <script>
+ function iterable(values) {
+ var i = 0;
+ return function() {
+ if (i < values.length) {
+ return values[i++];
+ }
+ return null;
+ }
+ }
+
+ function color() {
+ var colors = ['black', 'red', 'rgb(50, 75, 100)', 'rgba(5, 7, 10, 0.5)'];
+ return iterable(colors);
+ }
+
+ function percentage() {
+ var values = ["5%", {actual: ".5%", serialized: "0.5%"}];
+ return iterable(values);
+ }
+
+ function negative_percentage() {
+ var values = ["-5%", {actual: "-.5%", serialized: "-0.5%"}];
+ return iterable(values);
+ }
+
+ function length() {
+ var values = ["0px", "1px", {actual: ".1em", serialized: "0.1em"}];
+ return iterable(values);
+ }
+
+ function negative_length() {
+ var values = [{actual: "-0px", serialized: "0px"},
+ "-1px", {actual: "-.1em", serialized: "-0.1em"}];
+ return iterable(values);
+ }
+
+ function degree() {
+ var values = ["87deg"];
+ return iterable(values);
+ }
+
+ function uri() {
+ var values = ["url(\"http://localhost/\")",
+ {actual: "url(http://localhost/)",
+ serialized: "url(\"http://localhost/\")"}];
+ return iterable(values);
+ }
+
+ function border_style() {
+ var values = ['none', 'hidden', 'dotted', 'dashed', 'solid', 'double', 'groove', 'ridge',
+ 'inset', 'outset'];
+ return iterable(values);
+ }
+
+ function border_style_without_hidden() {
+ var values = ['none', 'dotted', 'dashed', 'solid', 'double', 'groove', 'ridge',
+ 'inset', 'outset'];
+ return iterable(values);
+ }
+
+ function integer() {
+ var values = ['0', '101', '-51'];
+ return iterable(values);
+ }
+
+ function nonzero_positive_integer() {
+ var values = ['101'];
+ return iterable(values);
+ }
+
+ function shape() {
+ var values = ['rect(1em, auto, 0.5px, 2000em)'];
+ return iterable(values);
+ }
+
+ function string() {
+ var values = ['"string"', {actual: "'string'", serialized: '"string"'}];
+ return iterable(values);
+ }
+
+ function counter() {
+ var values = [{actual: 'counter(par-num)',
+ serialized: 'counter(par-num, decimal)'},
+ 'counter(par-num, upper-roman)'];
+ return iterable(values);
+ }
+
+ function attr() {
+ var values = ['attr(foo-bar)', 'attr(foo_bar)'];
+ return iterable(values);
+ }
+
+ function family_name() {
+ var values = ['Arial', {actual: "'Lucida Grande'", serialized: '"Lucida Grande"'}];
+ return iterable(values);
+ }
+
+ function generic_family() {
+ var values = ['serif', 'sans-serif'];
+ return iterable(values);
+ }
+
+ function absolute_size() {
+ var values = ['xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large'];
+ return iterable(values);
+ }
+
+ function relative_size() {
+ var values = ['larger', 'smaller'];
+ return iterable(values);
+ }
+
+ function number() {
+ var values = ['0', {'actual': '-0', serialized: '0'}, '1000', '-5123', '0.9', '-0.09'];
+ return iterable(values);
+ }
+
+ function positive_number() {
+ var values = ['0', {'actual': '-0', serialized: '0'}, '1000', '0.9'];
+ return iterable(values);
+ }
+
+ function generate_inline_style(name, value) {
+ if (value) {
+ return {'declaration': name + ": " + value.actual,
+ 'value': value.actual,
+ 'result': value.expected};
+ }
+ return null;
+ }
+
+ function create_result(actual, expected) {
+ return {actual: actual, expected: expected}
+ }
+
+ function all_values(values) {
+ var results = [];
+ for (var i = 0; i < values.length; i++) {
+ var value = values[i];
+ if (typeof value == "function") {
+ var f = value();
+ var result;
+ while ((result = f()) != null) {
+ if (typeof result == "object" && 'serialized' in result) {
+ results.push(create_result(result.actual, result.serialized));
+ } else {
+ results.push(create_result(result, result));
+ }
+ }
+ } else if (typeof value == "string") {
+ results.push(create_result(value, value));
+ } else if (value instanceof Array) {
+ var subresults = [];
+ for (var j = 0; j < value.length; j++) {
+ var subresult = all_values(value[j], true);
+ if (!(subresult instanceof Array)) {
+ subresult = [subresult];
+ }
+ subresults.push(subresult);
+ }
+ if (subresults.length > 1) {
+ function choose_slices(vecs) {
+ if (vecs.length == 1) {
+ return vecs[0].map(function(v) { return [v]; });
+ }
+ var slice_results = [];
+ var rest = choose_slices(vecs.slice(1, vecs.length));
+ for (var a = 0; a < vecs[0].length; a++) {
+ for (var b = 0; b < rest.length; b++) {
+ var result = vecs[0][a];
+ slice_results.push([result].concat(rest[b]));
+ }
+ }
+ return slice_results;
+ }
+
+ subresults = choose_slices(subresults).map(function (a) {
+ var actual = a.map(function(a) { return a.actual });
+ var expected = a.map(function(a) { return a.expected });
+ return create_result(actual.join(' '), expected.join(' '))
+ });
+ }
+ for (var j = 0; j < subresults.length; j++) {
+ results = results.concat(subresults[j]);
+ }
+ } else if (value instanceof Object && 'serialized' in value) {
+ results.push(create_result(value.actual, value.serialized));
+ } else if (typeof value == "number") {
+ results.push(create_result(value.toString(), value.toString()));
+ } else {
+ throw "unexpected value type: " + typeof(value);
+ }
+ }
+ return results;
+ }
+
+ function create_value_generator(property) {
+ var results = all_values(property.values);
+ return iterable(results);
+ }
+
+ function to_idl(property) {
+ return property.replace(/-\w/g, function(x){return x[1].toUpperCase()});
+ }
+
+ function run_individual_test(property, generator, initial) {
+ var elem = document.createElement('div');
+ document.getElementById('parent').appendChild(elem);
+ var test_data = generator();
+ var style = generate_inline_style(property, test_data);
+ if (!style) {
+ return false;
+ }
+ var t = async_test(style.declaration);
+
+ t.add_cleanup(function() {
+ document.getElementById('parent').removeChild(elem);
+ });
+
+ t.step(function() {
+ elem.setAttribute('style', style.declaration);
+ var expected = style.result;
+ var serialized = elem.style[to_idl(property)];
+ assert_equals(serialized, expected, property + ' raw inline style declaration');
+ elem.setAttribute('style', '');
+ elem.style[to_idl(property)] = style.value;
+ assert_equals(elem.style[to_idl(property)], expected, property + ' style property');
+ });
+ t.done();
+ return true;
+ }
+
+ function test_property(property) {
+ var generator = create_value_generator(property[1]);
+ while (run_individual_test(property[0], generator, property[1].initial)) {
+ }
+ }
+
+ var properties = [
+ ['background-attachment', {
+ 'values': ['scroll', 'fixed', 'inherit'],
+ 'initial': 'scroll',
+ }],
+ ['background-color', {
+ 'values': [color, 'transparent', 'inherit'],
+ 'initial': 'transparent',
+ }],
+ ['background-image', {
+ 'values': [uri, 'none', 'inherit'],
+ 'initial': 'none',
+ }],
+ ['background-position', {
+ 'values': [[[percentage, negative_percentage, length, negative_length,
+ 'left', 'center', 'right'],
+ [percentage, negative_percentage, length, negative_length,
+ 'top', 'center', 'bottom']],
+ 'inherit'],
+ 'initial': '0% 0%',
+ }],
+ ['background-repeat', {
+ 'values': ['repeat', 'repeat-x', 'repeat-y', 'no-repeat', 'inherit'],
+ 'initial': 'repeat',
+ }],
+ //background
+ ['border-collapse', {
+ 'values': ['collapse', 'separate', 'inherit'],
+ 'initial': 'separate',
+ }],
+ //border-color
+ ['border-spacing', {
+ 'values': [length, 'inherit'],
+ 'initial': '0',
+ }],
+ //border-style
+ //border-top, border-right, border-bottom, border-left
+ ['border-top-color', {
+ 'values': [color, 'transparent', 'inherit'],
+ 'initial': 'black', //FIXME
+ }],
+ ['border-right-color', {
+ 'values': [color, 'transparent', 'inherit'],
+ 'initial': 'black', //FIXME
+ }],
+ ['border-bottom-color', {
+ 'values': [color, 'transparent', 'inherit'],
+ 'initial': 'black', //FIXME
+ }],
+ ['border-left-color', {
+ 'values': [color, 'transparent', 'inherit'],
+ 'initial': 'black', //FIXME
+ }],
+ ['border-top-style', {
+ 'values': [border_style, 'inherit'],
+ 'initial': null,
+ }],
+ ['border-right-style', {
+ 'values': [border_style, 'inherit'],
+ 'initial': null,
+ }],
+ ['border-bottom-style', {
+ 'values': [border_style, 'inherit'],
+ 'initial': null,
+ }],
+ ['border-left-style', {
+ 'values': [border_style, 'inherit'],
+ 'initial': null,
+ }],
+ ['border-top-width', {
+ 'values': ['thin', 'medium', 'thick', length, 'inherit'],
+ 'initial': 'medium',
+ }],
+ ['border-right-width', {
+ 'values': ['thin', 'medium', 'thick', length, 'inherit'],
+ 'initial': 'medium',
+ }],
+ ['border-bottom-width', {
+ 'values': ['thin', 'medium', 'thick', length, 'inherit'],
+ 'initial': 'medium',
+ }],
+ ['border-left-width', {
+ 'values': ['thin', 'medium', 'thick', length, 'inherit'],
+ 'initial': 'medium',
+ }],
+ //border-width
+ //border
+ ['bottom', {
+ 'values': [length, percentage, 'auto', 'inherit'],
+ 'initial': 'auto',
+ }],
+ ['caption-side', {
+ 'values': ['top', 'bottom', 'inherit'],
+ 'initial': 'top',
+ }],
+ ['clear', {
+ 'values': ['none', 'left', 'right', 'both', 'inherit'],
+ 'initial': 'none',
+ }],
+ ['clip', {
+ 'values': [shape, 'auto', 'inherit'],
+ 'initial': 'auto',
+ }],
+ ['color', {
+ 'values': [color, 'inherit'],
+ 'initial': 'black', //FIXME depends on user agent
+ }],
+ ['content', {
+ 'values': ['normal', 'none', string, uri, counter, attr, 'inherit'], //FIXME
+ 'initial': 'normal',
+ }],
+ //counter-increment
+ //counter-reset
+ ['cursor', {
+ 'values': [ 'auto', 'crosshair', 'default', 'pointer', 'move', 'e-resize', 'ne-resize',
+ 'nw-resize', 'n-resize', 'se-resize', 'sw-resize', 's-resize', 'w-resize',
+ 'text', 'wait', 'help', 'progress', 'inherit'],
+ 'initial': 'auto',
+ }],
+ ['direction', {
+ 'values': ['ltr', 'rtl', 'inherit'],
+ 'initial': 'ltr',
+ }],
+ ['display', {
+ 'values': ['inline', 'block', 'list-item', 'inline-block', 'table', 'inline-table',
+ 'table-row-group', 'table-header-group', 'table-footer-group', 'table-row',
+ 'table-column-group', 'table-column', 'table-cell', 'table-caption', 'none',
+ 'inherit'],
+ 'initial': 'inline',
+ }],
+ ['empty-cells', {
+ 'values': ['show', 'hide', 'inherit'],
+ 'initial': 'show',
+ }],
+ ['float', {
+ 'values': ['left', 'right', 'none', 'inherit'],
+ 'initial': 'none',
+ 'property': 'cssFloat',
+ }],
+ ['font-family', {
+ 'values': [family_name, generic_family, 'inherit'],
+ 'initial': 'sans-serif', //FIXME depends on user agent
+ }],
+ ['font-size', {
+ 'values': [absolute_size, relative_size, length, percentage, 'inherit'],
+ 'initial': 'medium',
+ }],
+ ['font-style', {
+ 'values': ['normal', 'italic', 'oblique', 'inherit'],
+ 'initial': 'normal',
+ }],
+ ['font-variant', {
+ 'values': ['normal', 'small-caps', 'inherit'],
+ 'initial': 'normal',
+ }],
+ ['font-weight', {
+ 'values': ['normal', 'bold', 'bolder', 'lighter', 100, 200, 300, 400, 500, 600,
+ 700, 800, 900, 'inherit'],
+ 'initial': 'normal',
+ }],
+ //font
+ ['height', {
+ 'values': [length, percentage, 'auto', 'inherit'],
+ 'initial': 'auto',
+ }],
+ ['left', {
+ 'values': [length, percentage, 'auto', 'inherit'],
+ 'initial': 'auto',
+ }],
+ ['letter-spacing', {
+ 'values': ['normal', length, 'inherit'],
+ 'initial': 'normal',
+ }],
+ ['line-height', {
+ 'values': ['normal', positive_number, length, percentage, 'inherit'],
+ 'initial': 'normal',
+ }],
+ ['list-style-image', {
+ 'values': [uri, 'none', 'inherit'],
+ 'initial': 'none',
+ }],
+ ['list-style-position', {
+ 'values': ['inside', 'outside', 'inherit'],
+ 'initial': 'outside',
+ }],
+ ['list-style-type', {
+ 'values': ['disc', 'circle', 'square', 'decimal', 'decimal-leading-zero', 'lower-roman',
+ 'upper-roman', 'lower-greek', 'lower-latin', 'upper-latin', 'armenian', 'georgian',
+ 'lower-alpha', 'upper-alpha', 'none', 'inherit'],
+ 'initial': 'disc',
+ }],
+ //list-style
+ ['margin-right', {
+ 'values': [length, percentage, 'auto', 'inherit'],
+ 'initial': 0,
+ }],
+ ['margin-left', {
+ 'values': [length, percentage, 'auto', 'inherit'],
+ 'initial': 0,
+ }],
+ ['margin-top', {
+ 'values': [length, percentage, 'auto', 'inherit'],
+ 'initial': 0,
+ }],
+ ['margin-bottom', {
+ 'values': [length, percentage, 'auto', 'inherit'],
+ 'initial': 0,
+ }],
+ //margin
+ ['max-height', {
+ 'values': [length, percentage, 'none', 'inherit'],
+ 'initial': 'none',
+ }],
+ ['max-width', {
+ 'values': [length, percentage, 'none', 'inherit'],
+ 'initial': 'none',
+ }],
+ ['min-height', {
+ 'values': [length, percentage, 'inherit'],
+ 'initial': 0,
+ }],
+ ['min-width', {
+ 'values': [length, percentage, 'inherit'],
+ 'initial': 0,
+ }],
+ ['orphans', {
+ 'values': [nonzero_positive_integer, 'inherit'],
+ 'initial': 2,
+ }],
+ ['outline-color', {
+ 'values': [color, 'invert', 'inherit'],
+ 'initial': 'invert',
+ }],
+ ['outline-style', {
+ 'values': [border_style_without_hidden, 'inherit'],
+ 'initial': 'none',
+ }],
+ ['outline-width', {
+ 'values': ['thin', 'medium', 'thick', length, 'inherit'],
+ 'initial': 'medium',
+ }],
+ //outline
+ ['overflow', {
+ 'values': ['visible', 'hidden', 'scroll', 'auto', 'inherit'],
+ 'initial': 'visible',
+ }],
+ ['padding-top', {
+ 'values': [length, percentage, 'inherit'],
+ 'initial': 0,
+ }],
+ ['padding-right', {
+ 'values': [length, percentage, 'inherit'],
+ 'initial': 0,
+ }],
+ ['padding-bottom', {
+ 'values': [length, percentage, 'inherit'],
+ 'initial': 0,
+ }],
+ ['padding-left', {
+ 'values': [length, percentage, 'inherit'],
+ 'initial': 0,
+ }],
+ //padding
+ ['page-break-after', {
+ 'values': ['auto', 'always', 'avoid', 'left', 'right', 'inherit'],
+ 'initial': 'auto',
+ }],
+ ['page-break-before', {
+ 'values': ['auto', 'always', 'avoid', 'left', 'right', 'inherit'],
+ 'initial': 'auto',
+ }],
+ ['page-break-inside', {
+ 'values': ['avoid', 'auto', 'inherit'],
+ 'initial': 'auto',
+ }],
+ ['position', {
+ 'values': ['static', 'relative', 'absolute', 'fixed', 'inherit'],
+ 'initial': 'static',
+ }],
+ //FIXME quotes
+ ['right', {
+ 'values': [length, percentage, 'auto', 'inherit'],
+ 'initial': 'auto',
+ }],
+ ['table-layout', {
+ 'values': ['auto', 'fixed', 'inherit'],
+ 'initial': 'auto',
+ }],
+ ['text-align', {
+ 'values': ['left', 'right', 'center', 'justify', 'inherit'],
+ 'initial': null,
+ }],
+ ['text-decoration', {
+ 'values': ['none', 'underline', 'overline', 'line-through', 'blink', 'inherit'],
+ 'initial': 'none',
+ }],
+ ['text-indent', {
+ 'values': [length, percentage, 'inherit'],
+ 'initial': 0,
+ }],
+ ['text-transform', {
+ 'values': ['capitalize', 'uppercase', 'lowercase', 'none', 'inherit'],
+ 'initial': 'none',
+ }],
+ ['top', {
+ 'values': [length, percentage, 'auto', 'inherit'],
+ 'initial': 'auto',
+ }],
+ ['unicode-bidi', {
+ 'values': ['normal', 'embed', 'bidi-override', 'inherit'],
+ 'initial': 'normal',
+ }],
+ ['vertical-align', {
+ 'values': ['baseline', 'sub', 'super', 'top', 'text-top', 'middle', 'bottom', 'text-bottom',
+ percentage, length, 'inherit'],
+ 'initial': 'baseline',
+ }],
+ ['visibility', {
+ 'values': ['visible', 'hidden', 'collapse', 'inherit'],
+ 'initial': 'visible',
+ }],
+ ['white-space', {
+ 'values': ['normal', 'pre', 'nowrap', 'pre-wrap', 'pre-line', 'inherit'],
+ 'initial': 'normal',
+ }],
+ ['widows', {
+ 'values': [nonzero_positive_integer, 'inherit'],
+ 'initial': 2,
+ }],
+ ['width', {
+ 'values': [length, percentage, 'auto', 'inherit'],
+ 'initial': 'auto',
+ }],
+ ['word-spacing', {
+ 'values': ['normal', length, 'inherit'],
+ 'initial': 'normal',
+ }],
+ ['z-index', {
+ 'values': ['auto', integer, 'inherit'],
+ 'initial': 'auto',
+ }],
+ ]
+
+ for (var index = 0; index < properties.length; index++) {
+ test_property(properties[index]);
+ }
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/custom-elements/CustomElementRegistry.html b/tests/wpt/web-platform-tests/custom-elements/CustomElementRegistry.html
new file mode 100644
index 00000000000..ecc7810e8df
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/CustomElementRegistry.html
@@ -0,0 +1,580 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CustomElementRegistry interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="CustomElementRegistry interface must exist">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+test(function () {
+ assert_true('define' in CustomElementRegistry.prototype, '"define" exists on CustomElementRegistry.prototype');
+ assert_true('define' in customElements, '"define" exists on window.customElements');
+}, 'CustomElementRegistry interface must have define as a method');
+
+test(function () {
+ assert_throws({'name': 'TypeError'}, function () { customElements.define('badname', 1); },
+ 'customElements.define must throw a TypeError when the element interface is a number');
+ assert_throws({'name': 'TypeError'}, function () { customElements.define('badname', '123'); },
+ 'customElements.define must throw a TypeError when the element interface is a string');
+ assert_throws({'name': 'TypeError'}, function () { customElements.define('badname', {}); },
+ 'customElements.define must throw a TypeError when the element interface is an object');
+ assert_throws({'name': 'TypeError'}, function () { customElements.define('badname', []); },
+ 'customElements.define must throw a TypeError when the element interface is an array');
+}, 'customElements.define must throw when the element interface is not a constructor');
+
+test(function () {
+ customElements.define('custom-html-element', HTMLElement);
+}, 'customElements.define must not throw the constructor is HTMLElement');
+
+test(function () {
+ class MyCustomElement extends HTMLElement {};
+
+ assert_throws({'name': 'SyntaxError'}, function () { customElements.define(null, MyCustomElement); },
+ 'customElements.define must throw a SyntaxError if the tag name is null');
+ assert_throws({'name': 'SyntaxError'}, function () { customElements.define('', MyCustomElement); },
+ 'customElements.define must throw a SyntaxError if the tag name is empty');
+ assert_throws({'name': 'SyntaxError'}, function () { customElements.define('abc', MyCustomElement); },
+ 'customElements.define must throw a SyntaxError if the tag name does not contain "-"');
+ assert_throws({'name': 'SyntaxError'}, function () { customElements.define('a-Bc', MyCustomElement); },
+ 'customElements.define must throw a SyntaxError if the tag name contains an upper case letter');
+
+ var builtinTagNames = [
+ 'annotation-xml',
+ 'color-profile',
+ 'font-face',
+ 'font-face-src',
+ 'font-face-uri',
+ 'font-face-format',
+ 'font-face-name',
+ 'missing-glyph'
+ ];
+
+ for (var tagName of builtinTagNames) {
+ assert_throws({'name': 'SyntaxError'}, function () { customElements.define(tagName, MyCustomElement); },
+ 'customElements.define must throw a SyntaxError if the tag name is "' + tagName + '"');
+ }
+
+}, 'customElements.define must throw with an invalid name');
+
+test(function () {
+ class SomeCustomElement extends HTMLElement {};
+
+ var calls = [];
+ var OtherCustomElement = new Proxy(class extends HTMLElement {}, {
+ get: function (target, name) {
+ calls.push(name);
+ return target[name];
+ }
+ })
+
+ customElements.define('some-custom-element', SomeCustomElement);
+ assert_throws({'name': 'NotSupportedError'}, function () { customElements.define('some-custom-element', OtherCustomElement); },
+ 'customElements.define must throw a NotSupportedError if the specified tag name is already used');
+ assert_array_equals(calls, [], 'customElements.define must validate the custom element name before getting the prototype of the constructor');
+
+}, 'customElements.define must throw when there is already a custom element of the same name');
+
+test(function () {
+ class AnotherCustomElement extends HTMLElement {};
+
+ customElements.define('another-custom-element', AnotherCustomElement);
+ assert_throws({'name': 'NotSupportedError'}, function () { customElements.define('some-other-element', AnotherCustomElement); },
+ 'customElements.define must throw a NotSupportedError if the specified class already defines an element');
+
+}, 'customElements.define must throw a NotSupportedError when there is already a custom element with the same class');
+
+test(function () {
+ var outerCalls = [];
+ var OuterCustomElement = new Proxy(class extends HTMLElement { }, {
+ get: function (target, name) {
+ outerCalls.push(name);
+ customElements.define('inner-custom-element', InnerCustomElement);
+ return target[name];
+ }
+ });
+ var innerCalls = [];
+ var InnerCustomElement = new Proxy(class extends HTMLElement { }, {
+ get: function (target, name) {
+ outerCalls.push(name);
+ return target[name];
+ }
+ });
+
+ assert_throws({'name': 'NotSupportedError'}, function () { customElements.define('outer-custom-element', OuterCustomElement); },
+ 'customElements.define must throw a NotSupportedError if the specified class already defines an element');
+ assert_array_equals(outerCalls, ['prototype'], 'customElements.define must get "prototype"');
+ assert_array_equals(innerCalls, [],
+ 'customElements.define must throw a NotSupportedError when element definition is running flag is set'
+ + ' before getting the prototype of the constructor');
+
+}, 'customElements.define must throw a NotSupportedError when element definition is running flag is set');
+
+test(function () {
+ var calls = [];
+ var ElementWithBadInnerConstructor = new Proxy(class extends HTMLElement { }, {
+ get: function (target, name) {
+ calls.push(name);
+ customElements.define('inner-custom-element', 1);
+ return target[name];
+ }
+ });
+
+ assert_throws({'name': 'TypeError'}, function () {
+ customElements.define('element-with-bad-inner-constructor', ElementWithBadInnerConstructor);
+ }, 'customElements.define must throw a NotSupportedError if IsConstructor(constructor) is false');
+
+ assert_array_equals(calls, ['prototype'], 'customElements.define must get "prototype"');
+}, 'customElements.define must check IsConstructor on the constructor before checking the element definition is running flag');
+
+test(function () {
+ var calls = [];
+ var ElementWithBadInnerName = new Proxy(class extends HTMLElement { }, {
+ get: function (target, name) {
+ calls.push(name);
+ customElements.define('badname', class extends HTMLElement {});
+ return target[name];
+ }
+ });
+
+ assert_throws({'name': 'SyntaxError'}, function () {
+ customElements.define('element-with-bad-inner-name', ElementWithBadInnerName);
+ }, 'customElements.define must throw a SyntaxError if the specified name is not a valid custom element name');
+
+ assert_array_equals(calls, ['prototype'], 'customElements.define must get "prototype"');
+}, 'customElements.define must validate the custom element name before checking the element definition is running flag');
+
+test(function () {
+ var unresolvedElement = document.createElement('constructor-calls-define');
+ document.body.appendChild(unresolvedElement);
+ var elementUpgradedDuringUpgrade = document.createElement('defined-during-upgrade');
+ document.body.appendChild(elementUpgradedDuringUpgrade);
+
+ var DefinedDuringUpgrade = class extends HTMLElement { };
+
+ class ConstructorCallsDefine extends HTMLElement {
+ constructor() {
+ customElements.define('defined-during-upgrade', DefinedDuringUpgrade);
+ assert_false(unresolvedElement instanceof ConstructorCallsDefine);
+ assert_true(elementUpgradedDuringUpgrade instanceof DefinedDuringUpgrade);
+ super();
+ assert_true(unresolvedElement instanceof ConstructorCallsDefine);
+ assert_true(elementUpgradedDuringUpgrade instanceof DefinedDuringUpgrade);
+ }
+ }
+
+ assert_false(unresolvedElement instanceof ConstructorCallsDefine);
+ assert_false(elementUpgradedDuringUpgrade instanceof DefinedDuringUpgrade);
+
+ customElements.define('constructor-calls-define', ConstructorCallsDefine);
+}, 'customElements.define unset the element definition is running flag before upgrading custom elements');
+
+(function () {
+ var testCase = async_test('customElements.define must not throw'
+ +' when defining another custom element in a different global object during Get(constructor, "prototype")', {timeout: 100});
+
+ var iframe = document.createElement('iframe');
+ iframe.onload = function () {
+ testCase.step(function () {
+ var InnerCustomElement = class extends iframe.contentWindow.HTMLElement {};
+ var calls = [];
+ var proxy = new Proxy(class extends HTMLElement { }, {
+ get: function (target, name) {
+ calls.push(name);
+ iframe.contentWindow.customElements.define('another-custom-element', InnerCustomElement);
+ return target[name];
+ }
+ })
+ customElements.define('element-with-inner-element-define', proxy);
+ assert_array_equals(calls, ['prototype'], 'customElements.define must get "prototype"');
+ assert_true(iframe.contentDocument.createElement('another-custom-element') instanceof InnerCustomElement);
+ });
+ document.body.removeChild(iframe);
+ testCase.done();
+ }
+
+ document.body.appendChild(iframe);
+})();
+
+test(function () {
+ var calls = [];
+ var ElementWithBadInnerName = new Proxy(class extends HTMLElement { }, {
+ get: function (target, name) {
+ calls.push(name);
+ customElements.define('badname', class extends HTMLElement {});
+ return target[name];
+ }
+ });
+
+ assert_throws({'name': 'SyntaxError'}, function () {
+ customElements.define('element-with-bad-inner-name', ElementWithBadInnerName);
+ }, 'customElements.define must throw a SyntaxError if the specified name is not a valid custom element name');
+
+ assert_array_equals(calls, ['prototype'], 'customElements.define must get "prototype"');
+}, '');
+
+test(function () {
+ var calls = [];
+ var proxy = new Proxy(class extends HTMLElement { }, {
+ get: function (target, name) {
+ calls.push(name);
+ return target[name];
+ }
+ });
+ customElements.define('proxy-element', proxy);
+ assert_array_equals(calls, ['prototype']);
+}, 'customElements.define must get "prototype" property of the constructor');
+
+test(function () {
+ var proxy = new Proxy(class extends HTMLElement { }, {
+ get: function (target, name) {
+ throw {name: 'expectedError'};
+ }
+ });
+ assert_throws({'name': 'expectedError'}, function () { customElements.define('element-with-string-prototype', proxy); });
+}, 'customElements.define must rethrow an exception thrown while getting "prototype" property of the constructor');
+
+test(function () {
+ var returnedValue;
+ var proxy = new Proxy(class extends HTMLElement { }, {
+ get: function (target, name) { return returnedValue; }
+ });
+
+ returnedValue = null;
+ assert_throws({'name': 'TypeError'}, function () { customElements.define('element-with-string-prototype', proxy); },
+ 'customElements.define must throw when "prototype" property of the constructor is null');
+ returnedValue = undefined;
+ assert_throws({'name': 'TypeError'}, function () { customElements.define('element-with-string-prototype', proxy); },
+ 'customElements.define must throw when "prototype" property of the constructor is undefined');
+ returnedValue = 'hello';
+ assert_throws({'name': 'TypeError'}, function () { customElements.define('element-with-string-prototype', proxy); },
+ 'customElements.define must throw when "prototype" property of the constructor is a string');
+ returnedValue = 1;
+ assert_throws({'name': 'TypeError'}, function () { customElements.define('element-with-string-prototype', proxy); },
+ 'customElements.define must throw when "prototype" property of the constructor is a number');
+
+}, 'customElements.define must throw when "prototype" property of the constructor is not an object');
+
+test(function () {
+ var constructor = function () {}
+ var calls = [];
+ constructor.prototype = new Proxy(constructor.prototype, {
+ get: function (target, name) {
+ calls.push(name);
+ return target[name];
+ }
+ });
+ customElements.define('element-with-proxy-prototype', constructor);
+ assert_array_equals(calls, ['connectedCallback', 'disconnectedCallback', 'adoptedCallback', 'attributeChangedCallback']);
+}, 'customElements.define must get callbacks of the constructor prototype');
+
+test(function () {
+ var constructor = function () {}
+ var calls = [];
+ constructor.prototype = new Proxy(constructor.prototype, {
+ get: function (target, name) {
+ calls.push(name);
+ if (name == 'disconnectedCallback')
+ throw {name: 'expectedError'};
+ return target[name];
+ }
+ });
+ assert_throws({'name': 'expectedError'}, function () { customElements.define('element-with-throwing-callback', constructor); });
+ assert_array_equals(calls, ['connectedCallback', 'disconnectedCallback'],
+ 'customElements.define must not get callbacks after one of the get throws');
+}, 'customElements.define must rethrow an exception thrown while getting callbacks on the constructor prototype');
+
+test(function () {
+ var constructor = function () {}
+ var calls = [];
+ constructor.prototype = new Proxy(constructor.prototype, {
+ get: function (target, name) {
+ calls.push(name);
+ if (name == 'adoptedCallback')
+ return 1;
+ return target[name];
+ }
+ });
+ assert_throws({'name': 'TypeError'}, function () { customElements.define('element-with-throwing-callback', constructor); });
+ assert_array_equals(calls, ['connectedCallback', 'disconnectedCallback', 'adoptedCallback'],
+ 'customElements.define must not get callbacks after one of the conversion throws');
+}, 'customElements.define must rethrow an exception thrown while converting a callback value to Function callback type');
+
+test(function () {
+ var constructor = function () {}
+ constructor.prototype.attributeChangedCallback = function () { };
+ var prototypeCalls = [];
+ var callOrder = 0;
+ constructor.prototype = new Proxy(constructor.prototype, {
+ get: function (target, name) {
+ if (name == 'prototype' || name == 'observedAttributes')
+ throw 'Unexpected access to observedAttributes';
+ prototypeCalls.push(callOrder++);
+ prototypeCalls.push(name);
+ return target[name];
+ }
+ });
+ var constructorCalls = [];
+ var proxy = new Proxy(constructor, {
+ get: function (target, name) {
+ constructorCalls.push(callOrder++);
+ constructorCalls.push(name);
+ return target[name];
+ }
+ });
+ customElements.define('element-with-attribute-changed-callback', proxy);
+ assert_array_equals(prototypeCalls, [1, 'connectedCallback', 2, 'disconnectedCallback', 3, 'adoptedCallback', 4, 'attributeChangedCallback']);
+ assert_array_equals(constructorCalls, [0, 'prototype', 5, 'observedAttributes']);
+}, 'customElements.define must get "observedAttributes" property on the constructor prototype when "attributeChangedCallback" is present');
+
+test(function () {
+ var constructor = function () {}
+ constructor.prototype.attributeChangedCallback = function () { };
+ var calls = [];
+ var proxy = new Proxy(constructor, {
+ get: function (target, name) {
+ calls.push(name);
+ if (name == 'observedAttributes')
+ throw {name: 'expectedError'};
+ return target[name];
+ }
+ });
+ assert_throws({'name': 'expectedError'}, function () { customElements.define('element-with-throwing-observed-attributes', proxy); });
+ assert_array_equals(calls, ['prototype', 'observedAttributes'],
+ 'customElements.define must get "prototype" and "observedAttributes" on the constructor');
+}, 'customElements.define must rethrow an exception thrown while getting observedAttributes on the constructor prototype');
+
+test(function () {
+ var constructor = function () {}
+ constructor.prototype.attributeChangedCallback = function () { };
+ var calls = [];
+ var proxy = new Proxy(constructor, {
+ get: function (target, name) {
+ calls.push(name);
+ if (name == 'observedAttributes')
+ return 1;
+ return target[name];
+ }
+ });
+ assert_throws({'name': 'TypeError'}, function () { customElements.define('element-with-invalid-observed-attributes', proxy); });
+ assert_array_equals(calls, ['prototype', 'observedAttributes'],
+ 'customElements.define must get "prototype" and "observedAttributes" on the constructor');
+}, 'customElements.define must rethrow an exception thrown while converting the value of observedAttributes to sequence<DOMString>');
+
+test(function () {
+ var constructor = function () {}
+ constructor.prototype.attributeChangedCallback = function () { };
+ constructor.observedAttributes = {[Symbol.iterator]: function *() {
+ yield 'foo';
+ throw {name: 'SomeError'};
+ }};
+ assert_throws({'name': 'SomeError'}, function () { customElements.define('element-with-generator-observed-attributes', constructor); });
+}, 'customElements.define must rethrow an exception thrown while iterating over observedAttributes to sequence<DOMString>');
+
+test(function () {
+ var constructor = function () {}
+ constructor.prototype.attributeChangedCallback = function () { };
+ constructor.observedAttributes = {[Symbol.iterator]: 1};
+ assert_throws({'name': 'TypeError'}, function () { customElements.define('element-with-observed-attributes-with-uncallable-iterator', constructor); });
+}, 'customElements.define must rethrow an exception thrown while retrieving Symbol.iterator on observedAttributes');
+
+test(function () {
+ var constructor = function () {}
+ constructor.observedAttributes = 1;
+ customElements.define('element-without-callback-with-invalid-observed-attributes', constructor);
+}, 'customElements.define must not throw even if "observedAttributes" fails to convert if "attributeChangedCallback" is not defined');
+
+test(function () {
+ class MyCustomElement extends HTMLElement {};
+ customElements.define('my-custom-element', MyCustomElement);
+
+ var instance = new MyCustomElement;
+ assert_true(instance instanceof MyCustomElement,
+ 'An instance of a custom HTML element be an instance of the associated interface');
+
+ assert_true(instance instanceof HTMLElement,
+ 'An instance of a custom HTML element must inherit from HTMLElement');
+
+ assert_equals(instance.localName, 'my-custom-element',
+ 'An instance of a custom element must use the associated tag name');
+
+ assert_equals(instance.namespaceURI, 'http://www.w3.org/1999/xhtml',
+ 'A custom element HTML must use HTML namespace');
+
+}, 'customElements.define must define an instantiatable custom element');
+
+test(function () {
+ var disconnectedElement = document.createElement('some-custom');
+ var connectedElementBeforeShadowHost = document.createElement('some-custom');
+ var connectedElementAfterShadowHost = document.createElement('some-custom');
+ var elementInShadowTree = document.createElement('some-custom');
+ var childElementOfShadowHost = document.createElement('some-custom');
+ var customShadowHost = document.createElement('some-custom');
+ var elementInNestedShadowTree = document.createElement('some-custom');
+
+ var container = document.createElement('div');
+ var shadowHost = document.createElement('div');
+ var shadowRoot = shadowHost.attachShadow({mode: 'closed'});
+ container.appendChild(connectedElementBeforeShadowHost);
+ container.appendChild(shadowHost);
+ container.appendChild(connectedElementAfterShadowHost);
+ shadowHost.appendChild(childElementOfShadowHost);
+ shadowRoot.appendChild(elementInShadowTree);
+ shadowRoot.appendChild(customShadowHost);
+
+ var innerShadowRoot = customShadowHost.attachShadow({mode: 'closed'});
+ innerShadowRoot.appendChild(elementInNestedShadowTree);
+
+ var calls = [];
+ class SomeCustomElement extends HTMLElement {
+ constructor() {
+ super();
+ calls.push(this);
+ }
+ };
+
+ document.body.appendChild(container);
+ customElements.define('some-custom', SomeCustomElement);
+ assert_array_equals(calls, [connectedElementBeforeShadowHost, elementInShadowTree, customShadowHost, elementInNestedShadowTree, childElementOfShadowHost, connectedElementAfterShadowHost]);
+}, 'customElements.define must upgrade elements in the shadow-including tree order');
+
+test(function () {
+ assert_true('get' in CustomElementRegistry.prototype, '"get" exists on CustomElementRegistry.prototype');
+ assert_true('get' in customElements, '"get" exists on window.customElements');
+}, 'CustomElementRegistry interface must have get as a method');
+
+test(function () {
+ assert_equals(customElements.get('a-b'), undefined);
+}, 'customElements.get must return undefined when the registry does not contain an entry with the given name');
+
+test(function () {
+ assert_equals(customElements.get('html'), undefined);
+ assert_equals(customElements.get('span'), undefined);
+ assert_equals(customElements.get('div'), undefined);
+ assert_equals(customElements.get('g'), undefined);
+ assert_equals(customElements.get('ab'), undefined);
+}, 'customElements.get must return undefined when the registry does not contain an entry with the given name even if the name was not a valid custom element name');
+
+test(function () {
+ assert_equals(customElements.get('existing-custom-element'), undefined);
+ class ExistingCustomElement extends HTMLElement {};
+ customElements.define('existing-custom-element', ExistingCustomElement);
+ assert_equals(customElements.get('existing-custom-element'), ExistingCustomElement);
+}, 'customElements.get return the constructor of the entry with the given name when there is a matching entry.');
+
+test(function () {
+ assert_true(customElements.whenDefined('some-name') instanceof Promise);
+}, 'customElements.whenDefined must return a promise for a valid custom element name');
+
+test(function () {
+ assert_equals(customElements.whenDefined('some-name'), customElements.whenDefined('some-name'));
+}, 'customElements.whenDefined must return the same promise each time invoked for a valid custom element name which has not been defined');
+
+promise_test(function () {
+ var resolved = false;
+ var rejected = false;
+ customElements.whenDefined('a-b').then(function () { resolved = true; }, function () { rejected = true; });
+ return Promise.resolve().then(function () {
+ assert_false(resolved, 'The promise returned by "whenDefined" must not be resolved until a custom element is defined');
+ assert_false(rejected, 'The promise returned by "whenDefined" must not be rejected until a custom element is defined');
+ });
+}, 'customElements.whenDefined must return an unresolved promise when the registry does not contain the entry with the given name')
+
+promise_test(function () {
+ var promise = customElements.whenDefined('badname');
+ promise.then(function (value) { promise.resolved = value; }, function (value) { promise.rejected = value; });
+
+ assert_false('resolved' in promise, 'The promise returned by "whenDefined" must not be resolved until the end of the next microtask');
+ assert_false('rejected' in promise, 'The promise returned by "whenDefined" must not be rejected until the end of the next microtask');
+
+ return Promise.resolve().then(function () {
+ assert_false('resolved' in promise, 'The promise returned by "whenDefined" must be resolved when a custom element is defined');
+ assert_true('rejected' in promise, 'The promise returned by "whenDefined" must not be rejected when a custom element is defined');
+ });
+}, 'customElements.whenDefined must return a rejected promise when the given name is not a valid custom element name');
+
+promise_test(function () {
+ customElements.define('preexisting-custom-element', class extends HTMLElement { });
+
+ var promise = customElements.whenDefined('preexisting-custom-element');
+ promise.then(function (value) { promise.resolved = value; }, function (value) { promise.rejected = value; });
+
+ assert_false('resolved' in promise, 'The promise returned by "whenDefined" must not be resolved until the end of the next microtask');
+ assert_false('rejected' in promise, 'The promise returned by "whenDefined" must not be rejected until the end of the next microtask');
+
+ return Promise.resolve().then(function () {
+ assert_true('resolved' in promise, 'The promise returned by "whenDefined" must be resolved when a custom element is defined');
+ assert_equals(promise.resolved, undefined,
+ 'The promise returned by "whenDefined" must be resolved with "undefined" when a custom element is defined');
+ assert_false('rejected' in promise, 'The promise returned by "whenDefined" must not be rejected when a custom element is defined');
+ });
+}, 'customElements.whenDefined must return a resolved promise when the registry contains the entry with the given name');
+
+promise_test(function () {
+ class AnotherExistingCustomElement extends HTMLElement {};
+ customElements.define('another-existing-custom-element', AnotherExistingCustomElement);
+
+ var promise1 = customElements.whenDefined('another-existing-custom-element');
+ var promise2 = customElements.whenDefined('another-existing-custom-element');
+ promise1.then(function (value) { promise1.resolved = value; }, function (value) { promise1.rejected = value; });
+ promise2.then(function (value) { promise2.resolved = value; }, function (value) { promise2.rejected = value; });
+
+ assert_not_equals(promise1, promise2);
+ assert_false('resolved' in promise1, 'The promise returned by "whenDefined" must not be resolved until the end of the next microtask');
+ assert_false('resolved' in promise2, 'The promise returned by "whenDefined" must not be resolved until the end of the next microtask');
+ assert_false('rejected' in promise1, 'The promise returned by "whenDefined" must not be rejected until the end of the next microtask');
+ assert_false('rejected' in promise2, 'The promise returned by "whenDefined" must not be rejected until the end of the next microtask');
+
+ return Promise.resolve().then(function () {
+ assert_true('resolved' in promise1, 'The promise returned by "whenDefined" must be resolved when a custom element is defined');
+ assert_equals(promise1.resolved, undefined, 'The promise returned by "whenDefined" must be resolved with "undefined" when a custom element is defined');
+ assert_false('rejected' in promise1, 'The promise returned by "whenDefined" must not be rejected when a custom element is defined');
+
+ assert_true('resolved' in promise2, 'The promise returned by "whenDefined" must be resolved when a custom element is defined');
+ assert_equals(promise2.resolved, undefined, 'The promise returned by "whenDefined" must be resolved with "undefined" when a custom element is defined');
+ assert_false('rejected' in promise2, 'The promise returned by "whenDefined" must not be rejected when a custom element is defined');
+ });
+}, 'customElements.whenDefined must return a new resolved promise each time invoked when the registry contains the entry with the given name');
+
+promise_test(function () {
+ var promise = customElements.whenDefined('element-defined-after-whendefined');
+ promise.then(function (value) { promise.resolved = value; }, function (value) { promise.rejected = value; });
+
+ assert_false('resolved' in promise, 'The promise returned by "whenDefined" must not be resolved until the end of the next microtask');
+ assert_false('rejected' in promise, 'The promise returned by "whenDefined" must not be rejected until the end of the next microtask');
+
+ var promiseAfterDefine;
+ return Promise.resolve().then(function () {
+ assert_false('resolved' in promise, 'The promise returned by "whenDefined" must not be resolved until the element is defined');
+ assert_false('rejected' in promise, 'The promise returned by "whenDefined" must not be rejected until the element is defined');
+ assert_equals(customElements.whenDefined('element-defined-after-whendefined'), promise,
+ '"whenDefined" must return the same unresolved promise before the custom element is defined');
+ customElements.define('element-defined-after-whendefined', class extends HTMLElement { });
+ assert_false('resolved' in promise, 'The promise returned by "whenDefined" must not be resolved until the end of the next microtask');
+ assert_false('rejected' in promise, 'The promise returned by "whenDefined" must not be rejected until the end of the next microtask');
+
+ promiseAfterDefine = customElements.whenDefined('element-defined-after-whendefined');
+ promiseAfterDefine.then(function (value) { promiseAfterDefine.resolved = value; }, function (value) { promiseAfterDefine.rejected = value; });
+ assert_not_equals(promiseAfterDefine, promise, '"whenDefined" must return a resolved promise once the custom element is defined');
+ assert_false('resolved' in promiseAfterDefine, 'The promise returned by "whenDefined" must not be resolved until the end of the next microtask');
+ assert_false('rejected' in promiseAfterDefine, 'The promise returned by "whenDefined" must not be rejected until the end of the next microtask');
+ }).then(function () {
+ assert_true('resolved' in promise, 'The promise returned by "whenDefined" must be resolved when a custom element is defined');
+ assert_equals(promise.resolved, undefined,
+ 'The promise returned by "whenDefined" must be resolved with "undefined" when a custom element is defined');
+ assert_false('rejected' in promise, 'The promise returned by "whenDefined" must not be rejected when a custom element is defined');
+
+ assert_true('resolved' in promiseAfterDefine, 'The promise returned by "whenDefined" must be resolved when a custom element is defined');
+ assert_equals(promiseAfterDefine.resolved, undefined,
+ 'The promise returned by "whenDefined" must be resolved with "undefined" when a custom element is defined');
+ assert_false('rejected' in promiseAfterDefine, 'The promise returned by "whenDefined" must not be rejected when a custom element is defined');
+ });
+}, 'A promise returned by customElements.whenDefined must be resolved by "define"');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/Document-createElement.html b/tests/wpt/web-platform-tests/custom-elements/Document-createElement.html
new file mode 100644
index 00000000000..f8b3a94c00d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/Document-createElement.html
@@ -0,0 +1,332 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: document.createElement should create an element with synchronous custom elements flag set</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="document.createElement should create an element with synchronous custom elements flag set">
+<link rel="help" content="https://dom.spec.whatwg.org/#dom-document-createelement">
+<link rel="help" content="https://dom.spec.whatwg.org/#concept-create-element">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/custom-elements-helper.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+setup({allow_uncaught_exception:true});
+
+test(function () {
+ class MyCustomElement extends HTMLElement {};
+
+ assert_true(document.createElement('my-custom-element') instanceof HTMLElement);
+ assert_false(document.createElement('my-custom-element') instanceof MyCustomElement);
+
+ customElements.define('my-custom-element', MyCustomElement);
+ var instance = document.createElement('my-custom-element');
+ assert_true(instance instanceof MyCustomElement);
+ assert_equals(instance.localName, 'my-custom-element');
+ assert_equals(instance.namespaceURI, 'http://www.w3.org/1999/xhtml', 'A custom element HTML must use HTML namespace');
+
+}, 'document.createElement must create an instance of custom elements');
+
+function assert_reports(expected, testFunction, message) {
+ var uncaughtError = null;
+ window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
+ testFunction();
+ if (typeof(expected) == 'string')
+ assert_equals(uncaughtError, expected, message);
+ else if (expected && 'name' in expected)
+ assert_equals(uncaughtError.name, expected.name, message);
+ else
+ assert_equals(uncaughtError, expected, message);
+ window.onerror = null;
+}
+
+function assert_not_reports(testFunction, message) {
+ assert_reports(null, testFunction, message);
+}
+
+test(function () {
+ class ObjectCustomElement extends HTMLElement {
+ constructor()
+ {
+ return {foo: 'bar'};
+ }
+ };
+ customElements.define('object-custom-element', ObjectCustomElement);
+
+ var instance = new ObjectCustomElement;
+ assert_true(instance instanceof Object);
+ assert_equals(instance.foo, 'bar');
+
+ var instance;
+ assert_reports({name: 'TypeError'}, function () { instance = document.createElement('object-custom-element'); });
+ assert_equals(instance.localName, 'object-custom-element');
+ assert_true(instance instanceof HTMLUnknownElement);
+}, 'document.createElement must report a TypeError when the result of Construct is not a DOM node');
+
+test(function () {
+ class TextCustomElement extends HTMLElement {
+ constructor()
+ {
+ return document.createTextNode('hello');
+ }
+ };
+ customElements.define('text-custom-element', TextCustomElement);
+ assert_true(new TextCustomElement instanceof Text);
+ var instance;
+ assert_reports({name: 'TypeError'}, function () { instance = document.createElement('text-custom-element'); });
+ assert_equals(instance.localName, 'text-custom-element');
+ assert_true(instance instanceof HTMLUnknownElement);
+}, 'document.createElement must report a TypeError when the result of Construct is a TextNode');
+
+test(function () {
+ class ElementWithAttribute extends HTMLElement {
+ constructor()
+ {
+ super();
+ this.setAttribute('id', 'foo');
+ }
+ };
+ customElements.define('element-with-attribute', ElementWithAttribute);
+ assert_true(new ElementWithAttribute instanceof ElementWithAttribute);
+ var instance;
+ assert_reports({name: 'NotSupportedError'}, function () { instance = document.createElement('element-with-attribute'); });
+ assert_equals(instance.localName, 'element-with-attribute');
+ assert_true(instance instanceof HTMLUnknownElement);
+}, 'document.createElement must report a NotSupportedError when attribute is added by setAttribute during construction');
+
+test(function () {
+ class ElementWithAttrNode extends HTMLElement {
+ constructor()
+ {
+ super();
+ this.attributes.setNamedItem(document.createAttribute('title'));
+ }
+ };
+ customElements.define('element-with-attr-node', ElementWithAttrNode);
+ assert_true(new ElementWithAttrNode instanceof ElementWithAttrNode);
+ var instance;
+ assert_reports({name: 'NotSupportedError'}, function () { instance = document.createElement('element-with-attr-node'); });
+ assert_equals(instance.localName, 'element-with-attr-node');
+ assert_true(instance instanceof HTMLUnknownElement);
+}, 'document.createElement must report a NotSupportedError when attribute is added by attributes.setNamedItem during construction');
+
+test(function () {
+ class ElementWithNoAttributes extends HTMLElement {
+ constructor()
+ {
+ super();
+ this.attributes.setNamedItem(document.createAttribute('title'));
+ this.removeAttribute('title');
+ }
+ };
+ customElements.define('element-with-no-attiributes', ElementWithNoAttributes);
+ assert_true(new ElementWithNoAttributes instanceof ElementWithNoAttributes);
+ var instance;
+ assert_not_reports(function () { instance = document.createElement('element-with-no-attiributes'); });
+ assert_true(instance instanceof ElementWithNoAttributes);
+}, 'document.createElement must not report a NotSupportedError when attribute is added and removed during construction');
+
+test(function () {
+ class ElementWithChildText extends HTMLElement {
+ constructor()
+ {
+ super();
+ this.appendChild(document.createTextNode('hello'));
+ }
+ };
+ customElements.define('element-with-child-text', ElementWithChildText);
+ assert_true(new ElementWithChildText instanceof ElementWithChildText);
+ var instance;
+ assert_reports({name: 'NotSupportedError'}, function () { instance = document.createElement('element-with-child-text'); });
+ assert_equals(instance.localName, 'element-with-child-text');
+ assert_true(instance instanceof HTMLUnknownElement);
+}, 'document.createElement must report a NotSupportedError when a Text child is added during construction');
+
+test(function () {
+ class ElementWithChildComment extends HTMLElement {
+ constructor()
+ {
+ super();
+ this.appendChild(document.createComment('hello'));
+ }
+ };
+ customElements.define('element-with-child-comment', ElementWithChildComment);
+ assert_true(new ElementWithChildComment instanceof ElementWithChildComment);
+ var instance;
+ assert_reports({name: 'NotSupportedError'}, function () { instance = document.createElement('element-with-child-comment'); });
+ assert_equals(instance.localName, 'element-with-child-comment');
+ assert_true(instance instanceof HTMLUnknownElement);
+}, 'document.createElement must report a NotSupportedError when a Comment child is added during construction');
+
+test(function () {
+ class ElementWithChildElement extends HTMLElement {
+ constructor()
+ {
+ super();
+ this.appendChild(document.createElement('div'));
+ }
+ };
+ customElements.define('element-with-child-element', ElementWithChildElement);
+ assert_true(new ElementWithChildElement instanceof ElementWithChildElement);
+ var instance;
+ assert_reports({name: 'NotSupportedError'}, function () { instance = document.createElement('element-with-child-element'); });
+ assert_equals(instance.localName, 'element-with-child-element');
+ assert_true(instance instanceof HTMLUnknownElement);
+}, 'document.createElement must report a NotSupportedError when an element child is added during construction');
+
+test(function () {
+ class ElementWithNoChildElements extends HTMLElement {
+ constructor()
+ {
+ super();
+ this.appendChild(document.createElement('div'));
+ this.removeChild(this.firstChild);
+ }
+ };
+ customElements.define('element-with-no-child-elements', ElementWithNoChildElements);
+ var instance;
+ assert_not_reports(function () { instance = document.createElement('element-with-no-child-elements'); });
+ assert_true(instance instanceof ElementWithNoChildElements);
+}, 'document.createElement must not report a NotSupportedError when an element child is added and removed during construction');
+
+test(function () {
+ class ElementWithParent extends HTMLElement {
+ constructor()
+ {
+ super();
+ document.createElement('div').appendChild(this);
+ }
+ };
+ customElements.define('element-with-parent', ElementWithParent);
+ assert_true(new ElementWithParent instanceof ElementWithParent);
+ var instance;
+ assert_reports({name: 'NotSupportedError'}, function () { instance = document.createElement('element-with-parent'); });
+ assert_equals(instance.localName, 'element-with-parent');
+ assert_true(instance instanceof HTMLUnknownElement);
+}, 'document.createElement must report a NotSupportedError when the element gets inserted into another element during construction');
+
+test(function () {
+ class ElementWithNoParent extends HTMLElement {
+ constructor()
+ {
+ super();
+ document.createElement('div').appendChild(this);
+ this.parentNode.removeChild(this);
+ }
+ };
+ customElements.define('element-with-no-parent', ElementWithNoParent);
+ var instance;
+ assert_not_reports(function () { instance = document.createElement('element-with-no-parent'); });
+ assert_true(instance instanceof ElementWithNoParent);
+}, 'document.createElement must not report a NotSupportedError when the element is inserted and removed from another element during construction');
+
+document_types().forEach(function (entry, testNumber) {
+ if (entry.isOwner)
+ return;
+
+ var getDocument = entry.create;
+ var docuemntName = entry.name;
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ class ElementWithAdoptCall extends HTMLElement {
+ constructor()
+ {
+ super();
+ doc.adoptNode(this);
+ }
+ };
+ var name = 'element-with-adopt-call-' + testNumber;
+ customElements.define(name, ElementWithAdoptCall);
+ assert_true(new ElementWithAdoptCall instanceof ElementWithAdoptCall);
+ var instance;
+ assert_reports({name: 'NotSupportedError'}, function () { instance = document.createElement(name); });
+ assert_equals(instance.localName, name);
+ assert_true(instance instanceof HTMLUnknownElement);
+ });
+ }, 'document.createElement must report a NotSupportedError when the element is adopted into a ' + docuemntName + ' during construction');
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ class ElementInsertedIntoAnotherDocument extends HTMLElement {
+ constructor()
+ {
+ super();
+ doc.documentElement.appendChild(this);
+ }
+ };
+ var name = 'element-inserted-into-another-document-' + testNumber;
+ customElements.define(name, ElementInsertedIntoAnotherDocument);
+ assert_true(new ElementInsertedIntoAnotherDocument instanceof ElementInsertedIntoAnotherDocument);
+ var instance;
+ assert_reports({name: 'NotSupportedError'}, function () { instance = document.createElement(name); });
+ assert_equals(instance.localName, name);
+ assert_true(instance instanceof HTMLUnknownElement);
+ });
+ }, 'document.createElement must report a NotSupportedError when the element is inserted into a ' + docuemntName + ' during construction');
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ class ElementThatGetAdoptedBack extends HTMLElement {
+ constructor()
+ {
+ super();
+ doc.adoptNode(this);
+ document.adoptNode(this);
+ }
+ };
+ var name = 'element-that-get-adopted-back' + testNumber;
+ customElements.define(name, ElementThatGetAdoptedBack);
+ var instance;
+ assert_not_reports(function () { instance = document.createElement(name); });
+ assert_true(instance instanceof ElementThatGetAdoptedBack);
+ });
+ }, 'document.createElement must not report a NotSupportedError when the element is adopted back from a ' + docuemntName + ' during construction');
+});
+
+test(function () {
+ class DivCustomElement extends HTMLElement {
+ constructor()
+ {
+ super();
+ return document.createElement('div');
+ }
+ };
+ customElements.define('div-custom-element', DivCustomElement);
+ assert_true(new DivCustomElement instanceof HTMLDivElement);
+ var instance;
+ assert_reports({name: 'NotSupportedError'}, function () { instance = document.createElement('div-custom-element'); });
+ assert_equals(instance.localName, 'div-custom-element');
+ assert_true(instance instanceof HTMLUnknownElement);
+}, 'document.createElement must report a NotSupportedError when the local name of the element does not match that of the custom element');
+
+test(function () {
+ var exceptionToThrow = {name: 'exception thrown by a custom constructor'};
+ class ThrowCustomElement extends HTMLElement {
+ constructor()
+ {
+ super();
+ if (exceptionToThrow)
+ throw exceptionToThrow;
+ }
+ };
+ customElements.define('throw-custom-element', ThrowCustomElement);
+
+ assert_throws(exceptionToThrow, function () { new ThrowCustomElement; });
+ var instance;
+ assert_reports(exceptionToThrow, function () { instance = document.createElement('throw-custom-element'); });
+ assert_equals(instance.localName, 'throw-custom-element');
+ assert_true(instance instanceof HTMLUnknownElement);
+
+ exceptionToThrow = false;
+ var instance = document.createElement('throw-custom-element');
+ assert_true(instance instanceof ThrowCustomElement);
+ assert_equals(instance.localName, 'throw-custom-element');
+
+}, 'document.createElement must report an exception thrown by a custom element constructor');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/adopted-callback.html b/tests/wpt/web-platform-tests/custom-elements/adopted-callback.html
new file mode 100644
index 00000000000..5c08a04a421
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/adopted-callback.html
@@ -0,0 +1,135 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: adoptedCallback</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="adoptedCallback must be enqueued whenever custom element is adopted into a new document">
+<link rel="help" href="https://w3c.github.io/webcomponents/spec/custom/#dfn-connected-callback">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/custom-elements-helpers.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+var calls = [];
+class MyCustomElement extends HTMLElement {
+ connectedCallback() { calls.push('connected'); }
+ adoptedCallback(oldDocument, newDocument) { calls.push('adopted'); calls.push(oldDocument); calls.push(newDocument); }
+ disconnectedCallback() { calls.push('disconnected'); }
+}
+customElements.define('my-custom-element', MyCustomElement);
+
+test(function () {
+ var instance = document.createElement('my-custom-element');
+ calls = [];
+ document.body.appendChild(instance);
+ assert_array_equals(calls, ['connected']);
+}, 'Inserting a custom element into the owner document must not enqueue and invoke adoptedCallback');
+
+document_types().forEach(function (entry) {
+ if (entry.isOwner)
+ return;
+
+ var documentName = entry.name;
+ var getDocument = entry.create;
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ var instance = document.createElement('my-custom-element');
+ calls = [];
+ doc.documentElement.appendChild(instance);
+ assert_array_equals(calls, ['adopted', document, doc, 'connected']);
+ });
+ }, 'Inserting a custom element into ' + documentName + ' must enqueue and invoke adoptedCallback');
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ var instance = document.createElement('my-custom-element');
+ document.body.appendChild(instance);
+ calls = [];
+ doc.documentElement.appendChild(instance);
+ assert_array_equals(calls, ['disconnected', 'adopted', document, doc, 'connected']);
+ });
+ }, 'Moving a custom element from the owner document into ' + documentName + ' must enqueue and invoke adoptedCallback');
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ var instance = document.createElement('my-custom-element');
+ var parent = document.createElement('div');
+ parent.appendChild(instance);
+ calls = [];
+ doc.documentElement.appendChild(parent);
+ assert_array_equals(calls, ['adopted', document, doc, 'connected']);
+ });
+ }, 'Inserting an ancestor of custom element into ' + documentName + ' must enqueue and invoke adoptedCallback');
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ var instance = document.createElement('my-custom-element');
+ var parent = document.createElement('div');
+ parent.appendChild(instance);
+ document.body.appendChild(parent);
+ calls = [];
+ doc.documentElement.appendChild(parent);
+ assert_array_equals(calls, ['disconnected', 'adopted', document, doc, 'connected']);
+ });
+ }, 'Moving an ancestor of custom element from the owner document into ' + documentName + ' must enqueue and invoke adoptedCallback');
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ var instance = document.createElement('my-custom-element');
+ var host = doc.createElementNS('http://www.w3.org/1999/xhtml', 'div');
+ var shadowRoot = host.attachShadow({mode: 'closed'});
+ doc.documentElement.appendChild(host);
+
+ calls = [];
+ shadowRoot.appendChild(instance);
+ assert_array_equals(calls, ['adopted', document, doc, 'connected']);
+ });
+ }, 'Inserting a custom element into a shadow tree in ' + documentName + ' must enqueue and invoke adoptedCallback');
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ var instance = document.createElement('my-custom-element');
+ var host = document.createElement('div');
+ var shadowRoot = host.attachShadow({mode: 'closed'});
+ shadowRoot.appendChild(instance);
+
+ calls = [];
+ doc.documentElement.appendChild(host);
+ assert_array_equals(calls, ['adopted', document, doc, 'connected']);
+ });
+ }, 'Inserting the shadow host of a custom element into ' + documentName + ' must enqueue and invoke adoptedCallback');
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ var instance = document.createElement('my-custom-element');
+ var host = document.createElement('div');
+ var shadowRoot = host.attachShadow({mode: 'closed'});
+ shadowRoot.appendChild(instance);
+ document.body.appendChild(host);
+
+ calls = [];
+ doc.documentElement.appendChild(host);
+ assert_array_equals(calls, ['disconnected', 'adopted', document, doc, 'connected']);
+ });
+ }, 'Moving the shadow host of a custom element from the owner document into ' + documentName + ' must enqueue and invoke adoptedCallback');
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ var instance = document.createElement('my-custom-element');
+ var host = doc.createElementNS('http://www.w3.org/1999/xhtml', 'div');
+ var shadowRoot = host.attachShadow({mode: 'closed'});
+
+ calls = [];
+ shadowRoot.appendChild(instance);
+ assert_array_equals(calls, ['adopted', document, doc]);
+ });
+ }, 'Inserting a custom element into a detached shadow tree that belongs to ' + documentName + ' must enqueue and invoke adoptedCallback');
+});
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/attribute-changed-callback.html b/tests/wpt/web-platform-tests/custom-elements/attribute-changed-callback.html
new file mode 100644
index 00000000000..bd467912b99
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/attribute-changed-callback.html
@@ -0,0 +1,223 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: attributeChangedCallback</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="attributeChangedCallback must be enqueued whenever custom element's attribute is added, changed or removed">
+<link rel="help" href="https://w3c.github.io/webcomponents/spec/custom/#dfn-attribute-changed-callback">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/custom-elements-helpers.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+var customElement = define_new_custom_element(['title', 'id', 'r']);
+
+test(function () {
+ const instance = document.createElement(customElement.name);
+ assert_array_equals(customElement.takeLog().types(), ['constructed']);
+
+ instance.setAttribute('title', 'foo');
+ assert_equals(instance.getAttribute('title'), 'foo');
+ var logEntries = customElement.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'title', oldValue: null, newValue: 'foo', namespace: null});
+
+ instance.removeAttribute('title');
+ assert_equals(instance.getAttribute('title'), null);
+ var logEntries = customElement.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'title', oldValue: 'foo', newValue: null, namespace: null});
+}, 'setAttribute and removeAttribute must enqueue and invoke attributeChangedCallback');
+
+test(function () {
+ var instance = document.createElement(customElement.name);
+ assert_array_equals(customElement.takeLog().types(), ['constructed']);
+
+ instance.setAttributeNS('http://www.w3.org/2000/svg', 'title', 'hello');
+ assert_equals(instance.getAttribute('title'), 'hello');
+ var logEntries = customElement.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'title', oldValue: null, newValue: 'hello', namespace: 'http://www.w3.org/2000/svg'});
+
+ instance.removeAttributeNS('http://www.w3.org/2000/svg', 'title');
+ assert_equals(instance.getAttribute('title'), null);
+ var logEntries = customElement.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'title', oldValue: 'hello', newValue: null, namespace: 'http://www.w3.org/2000/svg'});
+}, 'setAttributeNS and removeAttributeNS must enqueue and invoke attributeChangedCallback');
+
+test(function () {
+ var instance = document.createElement(customElement.name);
+ assert_array_equals(customElement.takeLog().types(), ['constructed']);
+
+ var attr = document.createAttribute('id');
+ attr.value = 'bar';
+ instance.setAttributeNode(attr);
+
+ assert_equals(instance.getAttribute('id'), 'bar');
+ var logEntries = customElement.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'id', oldValue: null, newValue: 'bar', namespace: null});
+
+ instance.removeAttributeNode(attr);
+ assert_equals(instance.getAttribute('id'), null);
+ var logEntries = customElement.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'id', oldValue: 'bar', newValue: null, namespace: null});
+}, 'setAttributeNode and removeAttributeNode must enqueue and invoke attributeChangedCallback for an HTML attribute');
+
+test(function () {
+ const instance = document.createElement(customElement.name);
+ assert_array_equals(customElement.takeLog().types(), ['constructed']);
+
+ const attr = document.createAttributeNS('http://www.w3.org/2000/svg', 'r');
+ attr.value = '100';
+ instance.setAttributeNode(attr);
+
+ assert_equals(instance.getAttribute('r'), '100');
+ var logEntries = customElement.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'r', oldValue: null, newValue: '100', namespace: 'http://www.w3.org/2000/svg'});
+
+ instance.removeAttributeNode(attr);
+ assert_equals(instance.getAttribute('r'), null);
+ var logEntries = customElement.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'r', oldValue: '100', newValue: null, namespace: 'http://www.w3.org/2000/svg'});
+}, 'setAttributeNode and removeAttributeNS must enqueue and invoke attributeChangedCallback for an SVG attribute');
+
+test(function () {
+ const callsToOld = [];
+ const callsToNew = [];
+ class CustomElement extends HTMLElement { }
+ CustomElement.prototype.attributeChangedCallback = function (...args) {
+ callsToOld.push(create_attribute_changed_callback_log(this, ...args));
+ }
+ CustomElement.observedAttributes = ['title'];
+ customElements.define('element-with-mutated-attribute-changed-callback', CustomElement);
+ CustomElement.prototype.attributeChangedCallback = function (...args) {
+ callsToNew.push(create_attribute_changed_callback_log(this, ...args));
+ }
+
+ const instance = document.createElement('element-with-mutated-attribute-changed-callback');
+ instance.setAttribute('title', 'hi');
+ assert_equals(instance.getAttribute('title'), 'hi');
+ assert_array_equals(callsToNew, []);
+ assert_equals(callsToOld.length, 1);
+ assert_attribute_log_entry(callsToOld[0], {name: 'title', oldValue: null, newValue: 'hi', namespace: null});
+}, 'Mutating attributeChangedCallback after calling customElements.define must not affect the callback being invoked');
+
+test(function () {
+ const calls = [];
+ class CustomElement extends HTMLElement {
+ attributeChangedCallback(...args) {
+ calls.push(create_attribute_changed_callback_log(this, ...args));
+ }
+ }
+ CustomElement.observedAttributes = ['title'];
+ customElements.define('element-not-observing-id-attribute', CustomElement);
+
+ const instance = document.createElement('element-not-observing-id-attribute');
+ assert_equals(calls.length, 0);
+ instance.setAttribute('title', 'hi');
+ assert_equals(calls.length, 1);
+ assert_attribute_log_entry(calls[0], {name: 'title', oldValue: null, newValue: 'hi', namespace: null});
+ instance.setAttribute('id', 'some');
+ assert_equals(calls.length, 1);
+ assert_attribute_log_entry(calls[0], {name: 'title', oldValue: null, newValue: 'hi', namespace: null});
+}, 'attributedChangedCallback must not be invoked when the observed attributes does not contain the attribute');
+
+test(function () {
+ const calls = [];
+ class CustomElement extends HTMLElement { }
+ CustomElement.prototype.attributeChangedCallback = function (...args) {
+ calls.push(create_attribute_changed_callback_log(this, ...args));
+ }
+ CustomElement.observedAttributes = ['title', 'lang'];
+ customElements.define('element-with-mutated-observed-attributes', CustomElement);
+ CustomElement.observedAttributes = ['title', 'id'];
+
+ const instance = document.createElement('element-with-mutated-observed-attributes');
+ instance.setAttribute('title', 'hi');
+ assert_equals(calls.length, 1);
+ assert_attribute_log_entry(calls[0], {name: 'title', oldValue: null, newValue: 'hi', namespace: null});
+
+ instance.setAttribute('id', 'some');
+ assert_equals(calls.length, 1);
+
+ instance.setAttribute('lang', 'en');
+ assert_equals(calls.length, 2);
+ assert_attribute_log_entry(calls[1], {name: 'lang', oldValue: null, newValue: 'en', namespace: null});
+}, 'Mutating observedAttributes after calling customElements.define must not affect the set of attributes for which attributedChangedCallback is invoked');
+
+test(function () {
+ var calls = [];
+ class CustomElement extends HTMLElement { }
+ CustomElement.prototype.attributeChangedCallback = function (...args) {
+ calls.push(create_attribute_changed_callback_log(this, ...args));
+ }
+ CustomElement.observedAttributes = { [Symbol.iterator]: function *() { yield 'lang'; yield 'style'; } };
+ customElements.define('element-with-generator-observed-attributes', CustomElement);
+
+ var instance = document.createElement('element-with-generator-observed-attributes');
+ instance.setAttribute('lang', 'en');
+ assert_equals(calls.length, 1);
+ assert_attribute_log_entry(calls[0], {name: 'lang', oldValue: null, newValue: 'en', namespace: null});
+
+ instance.setAttribute('lang', 'ja');
+ assert_equals(calls.length, 2);
+ assert_attribute_log_entry(calls[1], {name: 'lang', oldValue: 'en', newValue: 'ja', namespace: null});
+
+ instance.setAttribute('title', 'hello');
+ assert_equals(calls.length, 2);
+
+ instance.setAttribute('style', 'font-size: 2rem');
+ assert_equals(calls.length, 3);
+ assert_attribute_log_entry(calls[2], {name: 'style', oldValue: null, newValue: 'font-size: 2rem', namespace: null});
+}, 'attributedChangedCallback must be enqueued for attributes specified in a non-Array iterable observedAttributes');
+
+test(function () {
+ var calls = [];
+ class CustomElement extends HTMLElement { }
+ CustomElement.prototype.attributeChangedCallback = function (...args) {
+ calls.push(create_attribute_changed_callback_log(this, ...args));
+ }
+ CustomElement.observedAttributes = ['style'];
+ customElements.define('element-with-style-attribute-observation', CustomElement);
+
+ var instance = document.createElement('element-with-style-attribute-observation');
+ assert_equals(calls.length, 0);
+
+ instance.style.fontSize = '10px';
+ assert_equals(calls.length, 1);
+ assert_attribute_log_entry(calls[0], {name: 'style', oldValue: null, newValue: 'font-size: 10px;', namespace: null});
+
+ instance.style.fontSize = '20px';
+ assert_equals(calls.length, 2);
+ assert_attribute_log_entry(calls[1], {name: 'style', oldValue: 'font-size: 10px;', newValue: 'font-size: 20px;', namespace: null});
+
+}, 'attributedChangedCallback must be enqueued for style attribute change by mutating inline style declaration');
+
+test(function () {
+ var calls = [];
+ class CustomElement extends HTMLElement { }
+ CustomElement.prototype.attributeChangedCallback = function (...args) {
+ calls.push(create_attribute_changed_callback_log(this, ...args));
+ }
+ CustomElement.observedAttributes = ['title'];
+ customElements.define('element-with-no-style-attribute-observation', CustomElement);
+
+ var instance = document.createElement('element-with-no-style-attribute-observation');
+ assert_equals(calls.length, 0);
+ instance.style.fontSize = '10px';
+ assert_equals(calls.length, 0);
+ instance.title = 'hello';
+ assert_attribute_log_entry(calls[0], {name: 'title', oldValue: null, newValue: 'hello', namespace: null});
+}, 'attributedChangedCallback must not be enqueued when mutating inline style declaration if the style attribute is not observed');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/connected-callbacks.html b/tests/wpt/web-platform-tests/custom-elements/connected-callbacks.html
new file mode 100644
index 00000000000..d6e68262a85
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/connected-callbacks.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: connectedCallback</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="connectedCallback must be enqueued whenever custom element is inserted into a document">
+<link rel="help" href="https://w3c.github.io/webcomponents/spec/custom/#dfn-connected-callback">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/custom-elements-helpers.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+var calls = [];
+class MyCustomElement extends HTMLElement {
+ connectedCallback() { calls.push('connected', this); }
+ disconnectedCallback() { calls.push('disconnected', this); }
+}
+customElements.define('my-custom-element', MyCustomElement);
+
+document_types().forEach(function (entry) {
+ var documentName = entry.name;
+ var getDocument = entry.create;
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ var instance = document.createElement('my-custom-element');
+ calls = [];
+ doc.documentElement.appendChild(instance);
+ assert_array_equals(calls, ['connected', instance]);
+ });
+ }, 'Inserting a custom element into ' + documentName + ' must enqueue and invoke connectedCallback');
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ var instance = document.createElement('my-custom-element');
+ var parent = document.createElement('div');
+ parent.appendChild(instance);
+ calls = [];
+ doc.documentElement.appendChild(parent);
+ assert_array_equals(calls, ['connected', instance]);
+ });
+ }, 'Inserting an ancestor of custom element into ' + documentName + ' must enqueue and invoke connectedCallback');
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ var instance = document.createElement('my-custom-element');
+ var host = doc.createElementNS('http://www.w3.org/1999/xhtml', 'div');
+ var shadowRoot = host.attachShadow({mode: 'closed'});
+ doc.documentElement.appendChild(host);
+
+ calls = [];
+ shadowRoot.appendChild(instance);
+ assert_array_equals(calls, ['connected', instance]);
+ });
+ }, 'Inserting a custom element into a shadow tree in ' + documentName + ' must enqueue and invoke connectedCallback');
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ var instance = document.createElement('my-custom-element');
+ var host = doc.createElementNS('http://www.w3.org/1999/xhtml', 'div');
+ var shadowRoot = host.attachShadow({mode: 'closed'});
+ shadowRoot.appendChild(instance);
+
+ calls = [];
+ doc.documentElement.appendChild(host);
+ assert_array_equals(calls, ['connected', instance]);
+ });
+ }, 'Inserting the shadow host of a custom element into ' + documentName + ' must enqueue and invoke connectedCallback');
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ var instance = document.createElement('my-custom-element');
+ var host = doc.createElementNS('http://www.w3.org/1999/xhtml', 'div');
+ var shadowRoot = host.attachShadow({mode: 'closed'});
+
+ calls = [];
+ shadowRoot.appendChild(instance);
+ assert_array_equals(calls, []);
+ });
+ }, 'Inserting a custom element into a detached shadow tree that belongs to ' + documentName + ' must not enqueue and invoke connectedCallback');
+});
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/custom-element-reaction-queue.html b/tests/wpt/web-platform-tests/custom-elements/custom-element-reaction-queue.html
new file mode 100644
index 00000000000..737dab117d3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/custom-element-reaction-queue.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: Each element must have its own custom element reaction queue</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="Each element must have its own custom element reaction queue">
+<meta name="help" content="https://html.spec.whatwg.org/multipage/scripting.html#custom-element-reaction-queue">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/custom-elements-helpers.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+test_with_window(function (contentWindow) {
+ const contentDocument = contentWindow.document;
+ contentDocument.write('<test-element id="first-element">');
+ contentDocument.write('<test-element id="second-element">');
+
+ const element1 = contentDocument.getElementById('first-element');
+ const element2 = contentDocument.getElementById('second-element');
+ assert_equals(Object.getPrototypeOf(element1), contentWindow.HTMLElement.prototype);
+ assert_equals(Object.getPrototypeOf(element2), contentWindow.HTMLElement.prototype);
+
+ let log = [];
+ class TestElement extends contentWindow.HTMLElement {
+ constructor() {
+ super();
+ log.push(create_constructor_log(this));
+ }
+ connectedCallback(...args) {
+ log.push(create_connected_callback_log(this, ...args));
+ }
+ attributeChangedCallback(...args) {
+ log.push(create_attribute_changed_callback_log(this, ...args));
+ }
+ static get observedAttributes() { return ['id']; }
+ }
+ contentWindow.customElements.define('test-element', TestElement);
+ assert_equals(Object.getPrototypeOf(element1), TestElement.prototype);
+ assert_equals(Object.getPrototypeOf(element2), TestElement.prototype);
+
+ assert_equals(log.length, 6);
+ assert_constructor_log_entry(log[0], element1);
+ assert_attribute_log_entry(log[1], {name: 'id', oldValue: null, newValue: 'first-element', namespace: null});
+ assert_connected_log_entry(log[2], element1);
+ assert_constructor_log_entry(log[3], element2);
+ assert_attribute_log_entry(log[4], {name: 'id', oldValue: null, newValue: 'second-element', namespace: null});
+ assert_connected_log_entry(log[5], element2);
+}, 'Upgrading a custom element must invoke attributeChangedCallback and connectedCallback before start upgrading another element');
+
+test_with_window(function (contentWindow) {
+ const contentDocument = contentWindow.document;
+ contentDocument.write('<test-element id="first-element">');
+ contentDocument.write('<test-element id="second-element">');
+
+ const element1 = contentDocument.getElementById('first-element');
+ const element2 = contentDocument.getElementById('second-element');
+ assert_equals(Object.getPrototypeOf(element1), contentWindow.HTMLElement.prototype);
+ assert_equals(Object.getPrototypeOf(element2), contentWindow.HTMLElement.prototype);
+
+ let log = [];
+ class TestElement extends contentWindow.HTMLElement {
+ constructor() {
+ super();
+ log.push(create_constructor_log(this));
+ if (this == element1) {
+ element2.setAttribute('title', 'hi');
+ element2.removeAttribute('title');
+ element2.setAttribute('class', 'foo');
+ }
+ }
+ connectedCallback(...args) {
+ log.push(create_connected_callback_log(this, ...args));
+ }
+ attributeChangedCallback(...args) {
+ log.push(create_attribute_changed_callback_log(this, ...args));
+ }
+ static get observedAttributes() { return ['id', 'class', 'title']; }
+ }
+ contentWindow.customElements.define('test-element', TestElement);
+ assert_equals(Object.getPrototypeOf(element1), TestElement.prototype);
+ assert_equals(Object.getPrototypeOf(element2), TestElement.prototype);
+
+ assert_equals(log.length, 7);
+ assert_constructor_log_entry(log[0], element1);
+ assert_attribute_log_entry(log[1], {name: 'id', oldValue: null, newValue: 'first-element', namespace: null});
+ assert_connected_log_entry(log[2], element1);
+ assert_constructor_log_entry(log[3], element2);
+ assert_attribute_log_entry(log[4], {name: 'id', oldValue: null, newValue: 'second-element', namespace: null});
+ assert_attribute_log_entry(log[5], {name: 'class', oldValue: null, newValue: 'foo', namespace: null});
+ assert_connected_log_entry(log[6], element2);
+}, 'Mutating a undefined custom element while upgrading a custom element must not enqueue or invoke reactions on the mutated element');
+
+test_with_window(function (contentWindow) {
+ let log = [];
+ let element1;
+ let element2;
+ class TestElement extends contentWindow.HTMLElement {
+ constructor() {
+ super();
+ log.push(create_constructor_log(this));
+ }
+ adoptedCallback(...args) {
+ log.push(create_adopted_callback_log(this, ...args));
+ if (this == element1)
+ element3.setAttribute('id', 'foo');
+ }
+ connectedCallback(...args) {
+ log.push(create_connected_callback_log(this, ...args));
+ }
+ attributeChangedCallback(...args) {
+ log.push(create_attribute_changed_callback_log(this, ...args));
+ }
+ static get observedAttributes() { return ['id', 'class']; }
+ }
+
+ contentWindow.customElements.define('test-element', TestElement);
+
+ let contentDocument = contentWindow.document;
+ element1 = contentDocument.createElement('test-element');
+ element2 = contentDocument.createElement('test-element');
+ element3 = contentDocument.createElement('test-element');
+ assert_equals(Object.getPrototypeOf(element1), TestElement.prototype);
+ assert_equals(Object.getPrototypeOf(element2), TestElement.prototype);
+ assert_equals(Object.getPrototypeOf(element3), TestElement.prototype);
+
+ assert_equals(log.length, 3);
+ assert_constructor_log_entry(log[0], element1);
+ assert_constructor_log_entry(log[1], element2);
+ assert_constructor_log_entry(log[2], element3);
+ log = [];
+
+ const container = contentDocument.createElement('div');
+ container.appendChild(element1);
+ container.appendChild(element2);
+ container.appendChild(element3);
+
+ const anotherDocument = document.implementation.createHTMLDocument();
+ anotherDocument.documentElement.appendChild(container);
+
+ assert_equals(log.length, 7);
+ assert_adopted_log_entry(log[0], element1);
+ assert_adopted_log_entry(log[1], element3);
+ assert_connected_log_entry(log[2], element3);
+ assert_attribute_log_entry(log[3], {name: 'id', oldValue: null, newValue: 'foo', namespace: null});
+ assert_connected_log_entry(log[4], element1);
+ assert_adopted_log_entry(log[5], element2);
+ assert_connected_log_entry(log[6], element2);
+
+}, 'Mutating another custom element inside adopted callback must invoke all pending callbacks on the mutated element');
+
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/disconnected-callbacks.html b/tests/wpt/web-platform-tests/custom-elements/disconnected-callbacks.html
new file mode 100644
index 00000000000..7f5a4d0f8e7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/disconnected-callbacks.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: disconnectedCallback</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="disconnectedCallback must be enqueued whenever custom element is removed from a document">
+<link rel="help" href="https://w3c.github.io/webcomponents/spec/custom/#dfn-connected-callback">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/custom-elements-helpers.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+var calls = [];
+class MyCustomElement extends HTMLElement {
+ connectedCallback() { calls.push('connected', this); }
+ disconnectedCallback() { calls.push('disconnected', this); }
+}
+customElements.define('my-custom-element', MyCustomElement);
+
+document_types().forEach(function (entry) {
+ var documentName = entry.name;
+ var getDocument = entry.create;
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ var instance = document.createElement('my-custom-element');
+ doc.documentElement.appendChild(instance);
+ calls = [];
+ doc.documentElement.removeChild(instance);
+ assert_array_equals(calls, ['disconnected', instance]);
+ });
+ }, 'Removing a custom element from ' + documentName + ' must enqueue and invoke disconnectedCallback');
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ var instance = document.createElement('my-custom-element');
+ var parent = document.createElement('div');
+ parent.appendChild(instance);
+ doc.documentElement.appendChild(parent);
+ calls = [];
+ doc.documentElement.removeChild(parent);
+ assert_array_equals(calls, ['disconnected', instance]);
+ });
+ }, 'Removing an ancestor of custom element from ' + documentName + ' must enqueue and invoke disconnectedCallback');
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ var instance = document.createElement('my-custom-element');
+ var host = doc.createElementNS('http://www.w3.org/1999/xhtml', 'div');
+ var shadowRoot = host.attachShadow({mode: 'closed'});
+ doc.documentElement.appendChild(host);
+ shadowRoot.appendChild(instance);
+
+ calls = [];
+ shadowRoot.removeChild(instance);
+ assert_array_equals(calls, ['disconnected', instance]);
+ });
+ }, 'Removing a custom element from a shadow tree in ' + documentName + ' must enqueue and invoke disconnectedCallback');
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ var instance = document.createElement('my-custom-element');
+ var host = doc.createElementNS('http://www.w3.org/1999/xhtml', 'div');
+ var shadowRoot = host.attachShadow({mode: 'closed'});
+ shadowRoot.appendChild(instance);
+ doc.documentElement.appendChild(host);
+
+ calls = [];
+ doc.documentElement.removeChild(host);
+ assert_array_equals(calls, ['disconnected', instance]);
+ });
+ }, 'Removing the shadow host of a custom element from a' + documentName + ' must enqueue and invoke disconnectedCallback');
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ var instance = document.createElement('my-custom-element');
+ var host = doc.createElementNS('http://www.w3.org/1999/xhtml', 'div');
+ var shadowRoot = host.attachShadow({mode: 'closed'});
+ shadowRoot.appendChild(instance);
+
+ calls = [];
+ shadowRoot.removeChild(instance);
+ assert_array_equals(calls, []);
+ });
+ }, 'Removing a custom element from a detached shadow tree that belongs to ' + documentName + ' must not enqueue and invoke disconnectedCallback');
+});
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/htmlconstructor/newtarget.html b/tests/wpt/web-platform-tests/custom-elements/htmlconstructor/newtarget.html
index 04b4c498649..ab43803c244 100644
--- a/tests/wpt/web-platform-tests/custom-elements/htmlconstructor/newtarget.html
+++ b/tests/wpt/web-platform-tests/custom-elements/htmlconstructor/newtarget.html
@@ -5,120 +5,124 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../resources/custom-elements-helpers.js"></script>
-
+<body>
<script>
"use strict";
test_with_window(w => {
- let afterDefinition = false;
+ let beforeDefinition = true;
const proto1 = { "proto": "number one" };
const proto2 = { "proto": "number two" };
- const TestElement = (function () {
- assert_throws({ name: "prototype throws" }, () => {
- const o = Reflect.construct(w.HTMLElement, [], new.target);
-
- assert_equals(Object.getPrototypeOf(o), proto2,
- "Must use the value returned from new.target.prototype");
- assert_not_equals(Object.getPrototypeOf(o), proto1,
- "Must not use the prototype stored at definition time");
- });
- }).bind({});
+ function TestElement() {
+ const o = Reflect.construct(w.HTMLElement, [], new.target);
+ assert_equals(Object.getPrototypeOf(o), proto2,
+ "Must use the value returned from new.target.prototype");
+ assert_not_equals(Object.getPrototypeOf(o), proto1,
+ "Must not use the prototype stored at definition time");
+ }
- Object.defineProperty(TestElement, "prototype", {
- get() {
- return beforeDefinition ? proto1 : proto2;
- }
+ const ElementWithDynamicPrototype = new Proxy(TestElement, {
+ get: function (target, name) {
+ if (name == "prototype")
+ return beforeDefinition ? proto1 : proto2;
+ return target[name];
+ }
});
- w.customElements.define("test-element", TestElement);
-
- beforeDefinition = true;
- new TestElement();
+ w.customElements.define("test-element", ElementWithDynamicPrototype);
+ beforeDefinition = false;
+ new ElementWithDynamicPrototype();
}, "Use NewTarget's prototype, not the one stored at definition time");
test_with_window(w => {
// We have to not throw during define(), but throw during super()
let throws = false;
- const TestElement = (function () {
+ function TestElement() {
+ throws = true;
assert_throws({ name: "prototype throws" }, () => {
- return Reflect.construct(w.HTMLElement, [], new.target);
+ Reflect.construct(w.HTMLElement, [], new.target);
});
- }).bind({});
+ }
- Object.defineProperty(TestElement, "prototype", {
- get() {
- if (throws) {
+ const ElementWithDynamicPrototype = new Proxy(TestElement, {
+ get: function (target, name) {
+ if (throws && name == "prototype")
throw { name: "prototype throws" };
- }
- return {};
+ return target[name];
}
});
- w.customElements.define("test-element", TestElement);
+ w.customElements.define("test-element", ElementWithDynamicPrototype);
- throws = true;
- new TestElement();
+ new ElementWithDynamicPrototype();
}, "Rethrow any exceptions thrown while getting the prototype");
-test_with_window(w => {
- for (const notAnObject of [null, undefined, 5, "string"]) {
+[null, undefined, 5, "string"].forEach(function (notAnObject) {
+ test_with_window(w => {
// We have to return an object during define(), but not during super()
let returnNotAnObject = false;
- const TestElement = (function () {
+ function TestElement() {
const o = Reflect.construct(w.HTMLElement, [], new.target);
- assert_equals(Object.getPrototypeOf(o), window.HTMLElement,
+ assert_equals(Object.getPrototypeOf(new.target), window.Function.prototype);
+ assert_equals(Object.getPrototypeOf(o), window.HTMLElement.prototype,
"Must use the HTMLElement from the realm of NewTarget");
- assert_not_equals(Object.getPrototypeOf(o), w.HTMLElement,
+ assert_not_equals(Object.getPrototypeOf(o), w.HTMLElement.prototype,
"Must not use the HTMLElement from the realm of the active function object (w.HTMLElement)");
return o;
- }).bind({});
+ }
- Object.defineProperty(TestElement, "prototype", {
- get() {
- return returnNotAnObject ? notAnObject : {};
+ const ElementWithDynamicPrototype = new Proxy(TestElement, {
+ get: function (target, name) {
+ if (name == "prototype")
+ return returnNotAnObject ? notAnObject : {};
+ return target[name];
}
});
- w.customElements.define("test-element", TestElement);
+ w.customElements.define("test-element", ElementWithDynamicPrototype);
returnNotAnObject = true;
- new TestElement();
- }
-}, "If prototype is not object, derives the fallback from NewTarget's realm (autonomous custom elements)");
+ new ElementWithDynamicPrototype();
+ }, "If prototype is not object (" + notAnObject + "), derives the fallback from NewTarget's realm (autonomous custom elements)");
+});
-test_with_window(w => {
- for (const notAnObject of [null, undefined, 5, "string"]) {
+[null, undefined, 5, "string"].forEach(function (notAnObject) {
+ test_with_window(w => {
// We have to return an object during define(), but not during super()
let returnNotAnObject = false;
- const TestElement = (function () {
+ function TestElement() {
const o = Reflect.construct(w.HTMLParagraphElement, [], new.target);
- assert_equals(Object.getPrototypeOf(o), window.HTMLParagraphElement,
+ assert_equals(Object.getPrototypeOf(o), window.HTMLParagraphElement.prototype,
"Must use the HTMLParagraphElement from the realm of NewTarget");
- assert_not_equals(Object.getPrototypeOf(o), w.HTMLParagraphElement,
+ assert_not_equals(Object.getPrototypeOf(o), w.HTMLParagraphElement.prototype,
"Must not use the HTMLParagraphElement from the realm of the active function object (w.HTMLParagraphElement)");
return o;
- }).bind({});
+ }
- Object.defineProperty(TestElement, "prototype", {
- get() {
- return returnNotAnObject ? notAnObject : {};
+ const ElementWithDynamicPrototype = new Proxy(TestElement, {
+ get: function (target, name) {
+ if (name == "prototype")
+ return returnNotAnObject ? notAnObject : {};
+ return target[name];
}
});
- w.customElements.define("test-element", TestElement, { extends: "p" });
+ w.customElements.define("test-element", ElementWithDynamicPrototype, { extends: "p" });
returnNotAnObject = true;
- new TestElement();
- }
-}, "If prototype is not object, derives the fallback from NewTarget's realm (customized built-in elements)");
+ new ElementWithDynamicPrototype();
+ }, "If prototype is not object (" + notAnObject + "), derives the fallback from NewTarget's realm (customized built-in elements)");
+});
+
</script>
+</body> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/custom-elements/parser/parser-constructs-custom-element-in-document-write.html b/tests/wpt/web-platform-tests/custom-elements/parser/parser-constructs-custom-element-in-document-write.html
new file mode 100644
index 00000000000..3b5256677d0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/parser/parser-constructs-custom-element-in-document-write.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: Changes to the HTML parser</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="HTML parser must construct custom elements inside document.write">
+<link rel="help" href="https://html.spec.whatwg.org/#create-an-element-for-the-token">
+<link rel="help" href="https://dom.spec.whatwg.org/#concept-create-element">
+<link rel="help" href="https://html.spec.whatwg.org/#document.write()">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+class MyCustomElement extends HTMLElement { }
+customElements.define('my-custom-element', MyCustomElement);
+
+document.write('<my-custom-element></my-custom-element>');
+
+test(function () {
+ var instance = document.querySelector('my-custom-element');
+
+ assert_true(instance instanceof HTMLElement);
+ assert_true(instance instanceof MyCustomElement);
+
+}, 'HTML parser must instantiate custom elements inside document.write');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/parser/parser-constructs-custom-element-synchronously.html b/tests/wpt/web-platform-tests/custom-elements/parser/parser-constructs-custom-element-synchronously.html
new file mode 100644
index 00000000000..206aa17f20b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/parser/parser-constructs-custom-element-synchronously.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: Changes to the HTML parser</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="HTML parser must construct a custom element synchronously">
+<link rel="help" href="https://html.spec.whatwg.org/#create-an-element-for-the-token">
+<link rel="help" href="https://dom.spec.whatwg.org/#concept-create-element">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+var childElementCountInConstructor;
+var containerChildNodesInConstructor = [];
+var containerNextSiblingInConstructor;
+class MyCustomElement extends HTMLElement {
+ constructor() {
+ super();
+ var container = document.getElementById('custom-element-container');
+ for (var i = 0; i < container.childNodes.length; i++)
+ containerChildNodesInConstructor.push(container.childNodes[i]);
+ containerNextSiblingInConstructor = container.nextSibling;
+ }
+};
+customElements.define('my-custom-element', MyCustomElement);
+
+</script>
+<div id="custom-element-container">
+ <span id="custom-element-previous-element"></span>
+ <my-custom-element></my-custom-element>
+ <div id="custom-element-next-element"></div>
+</div>
+<script>
+
+test(function () {
+ var instance = document.querySelector('my-custom-element');
+
+ assert_equals(containerChildNodesInConstructor.length, 3);
+ assert_equals(containerChildNodesInConstructor[0], instance.parentNode.firstChild);
+ assert_equals(containerChildNodesInConstructor[1], document.getElementById('custom-element-previous-element'));
+ assert_equals(containerChildNodesInConstructor[2], instance.previousSibling);
+ assert_equals(containerNextSiblingInConstructor, null);
+
+}, 'HTML parser must only append nodes that appear before a custom element before instantiating the custom element');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/parser/parser-constructs-custom-elements.html b/tests/wpt/web-platform-tests/custom-elements/parser/parser-constructs-custom-elements.html
new file mode 100644
index 00000000000..3f13c50a0e1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/parser/parser-constructs-custom-elements.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: Changes to the HTML parser</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="HTML parser creates a custom element">
+<link rel="help" href="https://html.spec.whatwg.org/#create-an-element-for-the-token">
+<link rel="help" href="https://dom.spec.whatwg.org/#concept-create-element">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<my-custom-element id="instance1"></my-custom-element>
+<script>
+
+class MyCustomElement extends HTMLElement { };
+
+test(function () {
+ var customElement = document.getElementById('instance1');
+
+ assert_true(customElement instanceof HTMLElement, 'An unresolved custom element must be an instance of HTMLElement');
+ assert_false(customElement instanceof MyCustomElement, 'An unresolved custom element must NOT be an instance of that custom element');
+ assert_equals(customElement.localName, 'my-custom-element');
+ assert_equals(customElement.namespaceURI, 'http://www.w3.org/1999/xhtml', 'A custom element HTML must use HTML namespace');
+
+}, 'HTML parser must NOT create a custom element before customElements.define is called');
+
+customElements.define('my-custom-element', MyCustomElement);
+
+</script>
+<my-custom-element id="instance2"></my-custom-element>
+<script>
+
+test(function () {
+ var customElement = document.getElementById('instance2');
+
+ assert_true(customElement instanceof HTMLElement, 'A resolved custom element must be an instance of HTMLElement');
+ assert_false(customElement instanceof HTMLUnknownElement, 'A resolved custom element must NOT be an instance of HTMLUnknownElement');
+ assert_true(customElement instanceof MyCustomElement, 'A resolved custom element must be an instance of that custom element');
+ assert_equals(customElement.localName, 'my-custom-element');
+ assert_equals(customElement.namespaceURI, 'http://www.w3.org/1999/xhtml', 'A custom element HTML must use HTML namespace');
+
+}, 'HTML parser must create a defined custom element before executing inline scripts');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/parser/parser-fallsback-to-unknown-element.html b/tests/wpt/web-platform-tests/custom-elements/parser/parser-fallsback-to-unknown-element.html
new file mode 100644
index 00000000000..82e970f1ae8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/parser/parser-fallsback-to-unknown-element.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: Changes to the HTML parser</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="HTML parser must fallback to creating a HTMLUnknownElement when a custom element construction fails">
+<link rel="help" href="https://html.spec.whatwg.org/#create-an-element-for-the-token">
+<link rel="help" href="https://dom.spec.whatwg.org/#concept-create-element">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+setup({allow_uncaught_exception:true});
+
+class ReturnsTextNode extends HTMLElement {
+ constructor() {
+ super();
+ return document.createTextNode('some text');
+ }
+};
+customElements.define('returns-text', ReturnsTextNode);
+
+class ReturnsNonElementObject extends HTMLElement {
+ constructor() {
+ super();
+ return {};
+ }
+};
+customElements.define('returns-non-element-object', ReturnsNonElementObject);
+
+class LacksSuperCall extends HTMLElement {
+ constructor() { }
+};
+customElements.define('lacks-super-call', LacksSuperCall);
+
+class ThrowsException extends HTMLElement {
+ constructor() {
+ throw 'Bad';
+ }
+};
+customElements.define('throws-exception', ThrowsException);
+
+</script>
+<returns-text></returns-text>
+<returns-non-element-object></returns-non-element-object>
+<lacks-super-call></lacks-super-call>
+<throws-exception></throws-exception>
+<script>
+
+test(function () {
+ var instance = document.querySelector('returns-text');
+
+ assert_false(instance instanceof ReturnsTextNode, 'HTML parser must NOT instantiate a custom element when the constructor returns a Text node');
+ assert_true(instance instanceof HTMLElement, 'The fallback element created by HTML parser must be an instance of HTMLElement');
+ assert_true(instance instanceof HTMLUnknownElement, 'The fallback element created by HTML parser must be an instance of HTMLUnknownElement');
+
+}, 'HTML parser must create a fallback HTMLUnknownElement when a custom element constructor returns a Text node');
+
+test(function () {
+ var instance = document.querySelector('returns-non-element-object');
+
+ assert_false(instance instanceof ReturnsNonElementObject, 'HTML parser must NOT instantiate a custom element when the constructor returns a non-Element object');
+ assert_true(instance instanceof HTMLElement, 'The fallback element created by HTML parser must be an instance of HTMLElement');
+ assert_true(instance instanceof HTMLUnknownElement, 'The fallback element created by HTML parser must be an instance of HTMLUnknownElement');
+
+}, 'HTML parser must create a fallback HTMLUnknownElement when a custom element constructor returns non-Element object');
+
+test(function () {
+ var instance = document.querySelector('lacks-super-call');
+
+ assert_false(instance instanceof LacksSuperCall, 'HTML parser must NOT instantiate a custom element when the constructor does not call super()');
+ assert_true(instance instanceof HTMLElement, 'The fallback element created by HTML parser must be an instance of HTMLElement');
+ assert_true(instance instanceof HTMLUnknownElement, 'The fallback element created by HTML parser must be an instance of HTMLUnknownElement');
+
+}, 'HTML parser must create a fallback HTMLUnknownElement when a custom element constructor does not call super()');
+
+test(function () {
+ var instance = document.querySelector('throws-exception');
+
+ assert_false(instance instanceof ThrowsException, 'HTML parser must NOT instantiate a custom element when the constructor throws an exception');
+ assert_true(instance instanceof HTMLElement, 'The fallback element created by HTML parser must be an instance of HTMLElement');
+ assert_true(instance instanceof HTMLUnknownElement, 'The fallback element created by HTML parser must be an instance of HTMLUnknownElement');
+
+}, 'HTML parser must create a fallback HTMLUnknownElement when a custom element constructor throws an exception');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/parser/parser-sets-attributes-and-children.html b/tests/wpt/web-platform-tests/custom-elements/parser/parser-sets-attributes-and-children.html
new file mode 100644
index 00000000000..ba331370a78
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/parser/parser-sets-attributes-and-children.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: Changes to the HTML parser</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="HTML parser must set the attributes and append the children on a custom element">
+<link rel="help" href="https://html.spec.whatwg.org/#create-an-element-for-the-token">
+<link rel="help" href="https://dom.spec.whatwg.org/#concept-create-element">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+var numberOfAttributesInConstructor;
+var numberOfChildNodesInConstructor;
+
+class MyCustomElement extends HTMLElement {
+ constructor(...args) {
+ super(...args);
+ numberOfAttributesInConstructor = this.attributes.length;
+ numberOfChildNodesInConstructor = this.childNodes.length;
+ }
+};
+customElements.define('my-custom-element', MyCustomElement);
+
+</script>
+<my-custom-element id="custom-element-id" class="class1 class2">hello <b>world</b></my-custom-element>
+<script>
+
+var customElement = document.querySelector('my-custom-element');
+
+test(function () {
+ assert_equals(customElement.getAttribute('id'), 'custom-element-id', 'HTML parser must preserve the id attribute');
+ assert_equals(customElement.id, 'custom-element-id', 'HTML parser must preserve the semantics of reflect for the id attribute');
+ assert_equals(customElement.getAttribute('class'), 'class1 class2', 'HTML parser must preserve the class attribute');
+ assert_equals(customElement.classList.length, 2, 'HTML parser must initialize classList on custom elements');
+ assert_equals(customElement.classList[0], 'class1', 'HTML parser must initialize classList on custom elements');
+ assert_equals(customElement.classList[1], 'class2', 'HTML parser must initialize classList on custom elements');
+}, 'HTML parser must set the attributes');
+
+test(function () {
+ assert_equals(customElement.childNodes.length, 2, 'HTML parser must append child nodes');
+ assert_true(customElement.firstChild instanceof Text, 'HTML parser must append Text node child to a custom element');
+ assert_equals(customElement.firstChild.data, 'hello ', 'HTML parser must append Text node child to a custom element');
+ assert_true(customElement.lastChild instanceof HTMLElement, 'HTML parser must append a builtin element child to a custom element');
+ assert_true(customElement.lastChild.firstChild instanceof Text, 'HTML parser must preserve grandchild nodes of a custom element');
+ assert_equals(customElement.lastChild.firstChild.data, 'world', 'HTML parser must preserve grandchild nodes of a custom element');
+}, 'HTML parser must append child nodes');
+
+test(function () {
+ assert_equals(numberOfAttributesInConstructor, 0, 'HTML parser must not set attributes on a custom element before invoking the constructor');
+ assert_equals(numberOfChildNodesInConstructor, 0, 'HTML parser must not append child nodes to a custom element before invoking the constructor');
+}, 'HTML parser must set the attributes or append children before calling constructor');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/parser/parser-uses-constructed-element.html b/tests/wpt/web-platform-tests/custom-elements/parser/parser-uses-constructed-element.html
new file mode 100644
index 00000000000..393bbec698b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/parser/parser-uses-constructed-element.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: HTML parser must construct a custom element instead of upgrading</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="HTML parser must construct a custom element instead of upgrading">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="help" href="https://html.spec.whatwg.org/#create-an-element-for-the-token">
+<link rel="help" href="https://dom.spec.whatwg.org/#concept-create-element">
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+let anotherElementCreatedBeforeSuperCall = undefined;
+let elementCreatedBySuperCall = undefined;
+let shouldCreateElementBeforeSuperCall = true;
+class InstantiatesItselfBeforeSuper extends HTMLElement {
+ constructor() {
+ if (shouldCreateElementBeforeSuperCall) {
+ shouldCreateElementBeforeSuperCall = false;
+ anotherElementCreatedBeforeSuperCall = new InstantiatesItselfBeforeSuper();
+ }
+ super();
+ elementCreatedBySuperCall = this;
+ }
+};
+customElements.define('instantiates-itself-before-super', InstantiatesItselfBeforeSuper);
+
+let shouldCreateAnotherInstance = true;
+let anotherInstance = undefined;
+let firstInstance = undefined;
+class ReturnsAnotherInstance extends HTMLElement {
+ constructor() {
+ super();
+ if (shouldCreateAnotherInstance) {
+ shouldCreateAnotherInstance = false;
+ firstInstance = this;
+ anotherInstance = new ReturnsAnotherInstance;
+ return anotherInstance;
+ } else
+ return this;
+ }
+};
+customElements.define('returns-another-instance', ReturnsAnotherInstance);
+
+</script>
+<instantiates-itself-before-super></instantiates-itself-before-super>
+<returns-another-instance></returns-another-instance>
+<script>
+
+test(function () {
+ var instance = document.querySelector('instantiates-itself-before-super');
+
+ assert_equals(instance instanceof InstantiatesItselfBeforeSuper, 'HTML parser must insert the synchronously constructed custom element');
+ assert_equals(instance, elementCreatedBySuperCall, 'HTML parser must insert the element returned by the custom element constructor');
+ assert_not_equals(instance, anotherElementCreatedBeforeSuperCall, 'HTML parser must not insert another instance of the custom element created before super() call');
+ assert_equals(anotherElementCreatedBeforeSuperCall.parentNode, null, 'HTML parser must not insert another instance of the custom element created before super() call');
+
+}, 'HTML parser must use the returned value of the custom element constructor instead of the one created before super() call');
+
+test(function () {
+ var instance = document.querySelector('returns-another-instance');
+
+ assert_equals(instance instanceof ReturnsAnotherInstance, 'HTML parser must insert the synchronously constructed custom element');
+ assert_equals(instance, anotherInstance, 'HTML parser must insert the element returned by the custom element constructor');
+ assert_not_equals(instance, firstInstance, 'HTML parser must not insert the element created by super() call if the constructor returned another element');
+ assert_equals(firstInstance.parentNode, null, 'HTML parser must not insert the element created by super() call if the constructor returned another element');
+
+}, 'HTML parser must use the returned value of the custom element constructor instead using the one created in super() call');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/parser/parser-uses-registry-of-owner-document.html b/tests/wpt/web-platform-tests/custom-elements/parser/parser-uses-registry-of-owner-document.html
new file mode 100644
index 00000000000..efdc3a2a47c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/parser/parser-uses-registry-of-owner-document.html
@@ -0,0 +1,126 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: HTML parser must use the owner document's custom element registry</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="HTML parser must use the owner document's custom element registry">
+<link rel="help" href="https://html.spec.whatwg.org/#create-an-element-for-the-token">
+<link rel="help" href="https://dom.spec.whatwg.org/#concept-create-element">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+class MyCustomElement extends HTMLElement { };
+customElements.define('my-custom-element', MyCustomElement);
+
+document.write('<template><my-custom-element></my-custom-element></template>');
+
+test(function () {
+ var template = document.querySelector('template');
+ var instance = template.content.firstChild;
+
+ assert_true(instance instanceof HTMLElement,
+ 'A custom element inside a template element must be an instance of HTMLElement');
+ assert_false(instance instanceof MyCustomElement,
+ 'A custom element must not be instantiated inside a template element using the registry of the template element\'s owner document');
+ assert_equals(instance.ownerDocument, template.content.ownerDocument,
+ 'Custom elements inside a template must use the appropriate template contents owner document as the owner document');
+
+}, 'HTML parser must not instantiate custom elements inside template elements');
+
+var iframe = document.createElement('iframe');
+document.body.appendChild(iframe);
+iframe.contentDocument.body.innerHTML = '<my-custom-element></my-custom-element>';
+
+test(function () {
+ var instance = iframe.contentDocument.querySelector('my-custom-element');
+
+ assert_true(instance instanceof iframe.contentWindow.HTMLElement);
+ assert_false(instance instanceof MyCustomElement);
+
+}, 'HTML parser must not use the registry of the owner element\'s document inside an iframe');
+
+class ElementInIFrame extends iframe.contentWindow.HTMLElement { };
+iframe.contentWindow.customElements.define('element-in-iframe', ElementInIFrame);
+iframe.contentDocument.body.innerHTML = '<element-in-iframe></element-in-iframe>';
+
+test(function () {
+ var instance = iframe.contentDocument.querySelector('element-in-iframe');
+
+ assert_true(instance instanceof iframe.contentWindow.HTMLElement, 'A custom element inside an iframe must be an instance of HTMLElement');
+ assert_true(instance instanceof ElementInIFrame,
+ 'A custom element must be instantiated inside an iframe using the registry of the content document');
+ assert_equals(instance.ownerDocument, iframe.contentDocument,
+ 'The owner document of custom elements inside an iframe must be the content document of the iframe');
+
+}, 'HTML parser must use the registry of the content document inside an iframe');
+
+document.write('<element-in-iframe></element-in-iframe>');
+
+test(function () {
+ var instance = document.querySelector('element-in-iframe');
+
+ assert_true(instance instanceof HTMLElement);
+ assert_false(instance instanceof ElementInIFrame);
+
+}, 'HTML parser must not instantiate a custom element defined inside an frame in frame element\'s owner document');
+
+document.body.removeChild(iframe);
+
+test(function () {
+ var windowlessDocument = document.implementation.createHTMLDocument();
+ windowlessDocument.open();
+ windowlessDocument.write('<my-custom-element></my-custom-element>');
+ windowlessDocument.close();
+
+ var instance = windowlessDocument.querySelector('my-custom-element');
+
+ assert_true(instance instanceof HTMLElement);
+ assert_false(instance instanceof MyCustomElement);
+
+}, 'HTML parser must use the registry of window.document in a document created by document.implementation.createHTMLDocument()');
+
+test(function () {
+ var windowlessDocument = document.implementation.createDocument ('http://www.w3.org/1999/xhtml', 'html', null);
+ windowlessDocument.documentElement.innerHTML = '<my-custom-element></my-custom-element>';
+
+ var instance = windowlessDocument.querySelector('my-custom-element');
+ assert_true(instance instanceof HTMLElement);
+ assert_false(instance instanceof MyCustomElement);
+
+}, 'HTML parser must use the registry of window.document in a document created by document.implementation.createXHTMLDocument()');
+
+test(function () {
+ var windowlessDocument = new Document;
+ windowlessDocument.appendChild(windowlessDocument.createElement('html'));
+ windowlessDocument.documentElement.innerHTML = '<my-custom-element></my-custom-element>';
+
+ var instance = windowlessDocument.querySelector('my-custom-element');
+
+ assert_true(instance instanceof Element);
+ assert_false(instance instanceof MyCustomElement);
+
+}, 'HTML parser must use the registry of window.document in a document created by new Document');
+
+promise_test(function () {
+ return new Promise(function (resolve, reject) {
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', '../resources/empty-html-document.html');
+ xhr.overrideMimeType('text/xml');
+ xhr.onload = function () { resolve(xhr.responseXML); }
+ xhr.onerror = function () { reject('Failed to fetch the document'); }
+ xhr.send();
+ }).then(function (doc) {
+ doc.documentElement.innerHTML = '<my-custom-element></my-custom-element>';
+ var instance = doc.querySelector('my-custom-element');
+ assert_true(instance instanceof Element);
+ assert_false(instance instanceof MyCustomElement);
+ });
+}, 'HTML parser must use the registry of window.document in a document created by XMLHttpRequest');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reaction-timing.html b/tests/wpt/web-platform-tests/custom-elements/reaction-timing.html
new file mode 100644
index 00000000000..9e5bafbedfe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reaction-timing.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: Custom element reactions must be invoked before returning to author scripts</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="Custom element reactions must be invoked before returning to author scripts">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/scripting.html#invoke-custom-element-reactions">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+class MyCustomElement extends HTMLElement {
+ attributeChangedCallback(...args) {
+ this.handler(...args);
+ }
+
+ handler() { }
+}
+MyCustomElement.observedAttributes = ['data-title', 'title'];
+customElements.define('my-custom-element', MyCustomElement);
+
+test(function () {
+ var instance = document.createElement('my-custom-element');
+ var anotherInstance = document.createElement('my-custom-element');
+
+ var callbackOrder = [];
+ instance.handler = function () {
+ callbackOrder.push([this, 'begin']);
+ anotherInstance.setAttribute('data-title', 'baz');
+ callbackOrder.push([this, 'end']);
+ }
+ anotherInstance.handler = function () {
+ callbackOrder.push([this, 'begin']);
+ callbackOrder.push([this, 'end']);
+ }
+
+ instance.setAttribute('title', 'foo');
+ assert_equals(callbackOrder.length, 4);
+
+ assert_array_equals(callbackOrder[0], [instance, 'begin']);
+ assert_array_equals(callbackOrder[1], [anotherInstance, 'begin']);
+ assert_array_equals(callbackOrder[2], [anotherInstance, 'end']);
+ assert_array_equals(callbackOrder[3], [instance, 'end']);
+
+}, 'setAttribute and removeAttribute must enqueue and invoke attributeChangedCallback');
+
+test(function () {
+ var shouldCloneAnotherInstance = false;
+ var anotherInstanceClone;
+ var log = [];
+
+ class SelfCloningElement extends HTMLElement {
+ constructor() {
+ super();
+ log.push([this, 'begin']);
+ if (shouldCloneAnotherInstance) {
+ shouldCloneAnotherInstance = false;
+ anotherInstanceClone = anotherInstance.cloneNode(false);
+ }
+ log.push([this, 'end']);
+ }
+ }
+ customElements.define('self-cloning-element', SelfCloningElement);
+
+ var instance = document.createElement('self-cloning-element');
+ var anotherInstance = document.createElement('self-cloning-element');
+ shouldCloneAnotherInstance = true;
+
+ assert_equals(log.length, 4);
+ var instanceClone = instance.cloneNode(false);
+
+ assert_equals(log.length, 8);
+ assert_array_equals(log[0], [instance, 'begin']);
+ assert_array_equals(log[1], [instance, 'end']);
+ assert_array_equals(log[2], [anotherInstance, 'begin']);
+ assert_array_equals(log[3], [anotherInstance, 'end']);
+ assert_array_equals(log[4], [instanceClone, 'begin']);
+ assert_array_equals(log[5], [anotherInstanceClone, 'begin']);
+ assert_array_equals(log[6], [anotherInstanceClone, 'end']);
+ assert_array_equals(log[7], [instanceClone, 'end']);
+}, 'Calling Node.prototype.cloneNode(false) must push a new element queue to the processing stack');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/Attr.html b/tests/wpt/web-platform-tests/custom-elements/reactions/Attr.html
new file mode 100644
index 00000000000..c9fa37f9611
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/Attr.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on Attr interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="value of Attr interface must have CEReactions">
+<meta name="help" content="https://dom.spec.whatwg.org/#node">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+testAttributeMutator(function (element, name, value) {
+ element.attributes[name].value = value;
+}, 'value on Attr');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/CSSStyleDeclaration.html b/tests/wpt/web-platform-tests/custom-elements/reactions/CSSStyleDeclaration.html
new file mode 100644
index 00000000000..bf9e00ab528
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/CSSStyleDeclaration.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on CSSStyleDeclaration interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="cssText, setProperty, setPropertyValue, setPropertyPriority, removeProperty, cssFloat, and all camel cased attributes of CSSStyleDeclaration interface must have CEReactions">
+<meta name="help" content="https://dom.spec.whatwg.org/#node">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+test_mutating_style_property_value(function (instance, propertyName, idlName, value) {
+ instance.style.cssText = `${propertyName}: ${value}`;
+}, 'cssText on CSSStyleDeclaration');
+
+test_mutating_style_property_value(function (instance, propertyName, idlName, value) {
+ instance.style.setProperty(propertyName, value);
+}, 'setProperty on CSSStyleDeclaration');
+
+test_mutating_style_property_priority(function (instance, propertyName, idlName, isImportant) {
+ instance.style.setProperty(propertyName, instance.style[idlName], isImportant ? 'important': '');
+}, 'setProperty on CSSStyleDeclaration');
+
+test_mutating_style_property_value(function (instance, propertyName, idlName, value) {
+ instance.style.setPropertyValue(propertyName, value);
+}, 'setPropertyValue on CSSStyleDeclaration');
+
+test_mutating_style_property_priority(function (instance, propertyName, idlName, isImportant) {
+ instance.style.setPropertyPriority(propertyName, isImportant ? 'important': '');
+}, 'setPropertyPriority on CSSStyleDeclaration');
+
+test_removing_style_property_value(function (instance, propertyName, idlName) {
+ instance.style.removeProperty(propertyName);
+}, 'removeProperty on CSSStyleDeclaration');
+
+test(function () {
+ var element = define_new_custom_element(['style']);
+ var instance = document.createElement(element.name);
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ instance.style.cssFloat = 'left';
+ assert_equals(instance.getAttribute('style'), 'float: left;');
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'style', oldValue: null, newValue: 'float: left;', namespace: null});
+}, 'cssFloat on CSSStyleDeclaration must enqueue an attributeChanged reaction when it adds the observed style attribute');
+
+test(function () {
+ var element = define_new_custom_element([]);
+ var instance = document.createElement(element.name);
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ instance.style.cssFloat = 'left';
+ assert_equals(instance.getAttribute('style'), 'float: left;');
+ assert_array_equals(element.takeLog().types(), []);
+}, 'cssFloat on CSSStyleDeclaration must not enqueue an attributeChanged reaction when it adds the style attribute but the style attribute is not observed');
+
+test_mutating_style_property_value(function (instance, propertyName, idlName, value) {
+ assert_equals(idlName, 'borderWidth');
+ instance.style.borderWidth = value;
+}, 'A camel case attribute (borderWidth) on CSSStyleDeclaration',
+ {propertyName: 'border-width', idlName: 'borderWidth', value1: '2px', value2: '4px'});
+
+test_mutating_style_property_value(function (instance, propertyName, idlName, value) {
+ assert_equals(propertyName, 'border-width');
+ instance.style['border-width'] = value;
+}, 'A dashed property (border-width) on CSSStyleDeclaration',
+ {propertyName: 'border-width', idlName: 'borderWidth', value1: '1px', value2: '5px'});
+
+test_mutating_style_property_value(function (instance, propertyName, idlName, value) {
+ instance.style.webkitFilter = value;
+}, 'A webkit prefixed camel case attribute (webkitFilter) on CSSStyleDeclaration',
+ {propertyName: 'filter', idlName: 'filter', value1: 'grayscale(20%)', value2: 'grayscale(30%)'});
+
+test_mutating_style_property_value(function (instance, propertyName, idlName, value) {
+ instance.style['-webkit-filter'] = value;
+}, 'A webkit prefixed dashed property (-webkit-filter) on CSSStyleDeclaration',
+ {propertyName: 'filter', idlName: 'filter', value1: 'grayscale(20%)', value2: 'grayscale(30%)'});
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/ChildNode.html b/tests/wpt/web-platform-tests/custom-elements/reactions/ChildNode.html
new file mode 100644
index 00000000000..756f1722988
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/ChildNode.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on ChildNode interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="before, after, after, replaceWith, and remove of ChildNode interface must have CEReactions">
+<meta name="help" content="https://dom.spec.whatwg.org/#parentnode">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+testNodeConnector(function (newContainer, customElement) {
+ newContainer.firstChild.before(customElement);
+}, 'before on ChildNode');
+
+testNodeConnector(function (newContainer, customElement) {
+ newContainer.firstChild.after(customElement);
+}, 'after on ChildNode');
+
+testNodeConnector(function (newContainer, customElement) {
+ newContainer.firstChild.replaceWith(customElement);
+}, 'replaceWith on ChildNode');
+
+testNodeDisconnector(function (customElement) {
+ customElement.remove();
+}, 'replaceWith on ChildNode');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/DOMStringMap.html b/tests/wpt/web-platform-tests/custom-elements/reactions/DOMStringMap.html
new file mode 100644
index 00000000000..5e34dfe2ba1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/DOMStringMap.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on DOMStringMap interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="setter and deleter of DOMStringMap interface must have CEReactions">
+<meta name="help" content="https://html.spec.whatwg.org/#domstringmap">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+test(function () {
+ var element = define_new_custom_element(['data-foo']);
+ var instance = document.createElement(element.name);
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ instance.dataset.foo = 'bar';
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'data-foo', oldValue: null, newValue: 'bar', namespace: null});
+}, 'setter on DOMStringMap must enqueue an attributeChanged reaction when adding an observed data attribute');
+
+test(function () {
+ var element = define_new_custom_element(['data-bar']);
+ var instance = document.createElement(element.name);
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ instance.dataset.foo = 'bar';
+ assert_array_equals(element.takeLog().types(), []);
+}, 'setter on DOMStringMap must not enqueue an attributeChanged reaction when adding an unobserved data attribute');
+
+test(function () {
+ var element = define_new_custom_element(['data-foo']);
+ var instance = document.createElement(element.name);
+ instance.dataset.foo = 'bar';
+ assert_array_equals(element.takeLog().types(), ['constructed', 'attributeChanged']);
+ instance.dataset.foo = 'baz';
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'data-foo', oldValue: 'bar', newValue: 'baz', namespace: null});
+}, 'setter on DOMStringMap must enqueue an attributeChanged reaction when mutating the value of an observed data attribute');
+
+test(function () {
+ var element = define_new_custom_element(['data-foo']);
+ var instance = document.createElement(element.name);
+ instance.dataset.foo = 'bar';
+ assert_array_equals(element.takeLog().types(), ['constructed', 'attributeChanged']);
+ instance.dataset.foo = 'bar';
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'data-foo', oldValue: 'bar', newValue: 'bar', namespace: null});
+}, 'setter on DOMStringMap must enqueue an attributeChanged reaction when mutating the value of an observed data attribute to the same value');
+
+test(function () {
+ var element = define_new_custom_element(['data-zero']);
+ var instance = document.createElement(element.name);
+ instance.dataset.foo = 'bar';
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ instance.dataset.foo = 'baz';
+ assert_array_equals(element.takeLog().types(), []);
+}, 'setter on DOMStringMap must not enqueue an attributeChanged reaction when mutating the value of an unobserved data attribute');
+
+test(function () {
+ var element = define_new_custom_element(['data-foo']);
+ var instance = document.createElement(element.name);
+ instance.dataset.foo = 'bar';
+ assert_array_equals(element.takeLog().types(), ['constructed', 'attributeChanged']);
+ delete instance.dataset.foo;
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'data-foo', oldValue: 'bar', newValue: null, namespace: null});
+}, 'deleter on DOMStringMap must enqueue an attributeChanged reaction when removing an observed data attribute');
+
+test(function () {
+ var element = define_new_custom_element(['data-bar']);
+ var instance = document.createElement(element.name);
+ instance.dataset.foo = 'bar';
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ delete instance.dataset.foo;
+ assert_array_equals(element.takeLog().types(), []);
+}, 'deleter on DOMStringMap must not enqueue an attributeChanged reaction when removing an unobserved data attribute');
+
+test(function () {
+ var element = define_new_custom_element(['data-foo']);
+ var instance = document.createElement(element.name);
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ delete instance.dataset.foo;
+ assert_array_equals(element.takeLog().types(), []);
+}, 'deleter on DOMStringMap must not enqueue an attributeChanged reaction when it does not remove a data attribute');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/DOMTokenList.html b/tests/wpt/web-platform-tests/custom-elements/reactions/DOMTokenList.html
new file mode 100644
index 00000000000..e8c26df498f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/DOMTokenList.html
@@ -0,0 +1,219 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on DOMTokenList interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="add, remove, toggle, replace, and the stringifier of DOMTokenList interface must have CEReactions">
+<meta name="help" content="https://dom.spec.whatwg.org/#node">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<script>
+
+test(function () {
+ var element = define_new_custom_element(['class']);
+ var instance = document.createElement(element.name);
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ instance.classList.add('foo');
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'class', oldValue: null, newValue: 'foo', namespace: null});
+}, 'add on DOMTokenList must enqueue an attributeChanged reaction when adding an attribute');
+
+test(function () {
+ var element = define_new_custom_element(['style']);
+ var instance = document.createElement(element.name);
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ instance.classList.add('foo');
+ assert_array_equals(element.takeLog().types(), []);
+}, 'add on DOMTokenList must not enqueue an attributeChanged reaction when adding an unobserved attribute');
+
+test(function () {
+ var element = define_new_custom_element(['class']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('class', 'hello');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'attributeChanged']);
+ instance.classList.add('world');
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'class', oldValue: 'hello', newValue: 'hello world', namespace: null});
+}, 'add on DOMTokenList must enqueue an attributeChanged reaction when adding a value to an existing attribute');
+
+test(function () {
+ var element = define_new_custom_element(['contenteditable']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('class', 'hello');
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ instance.classList.add('world');
+ assert_array_equals(element.takeLog().types(), []);
+}, 'add on DOMTokenList must not enqueue an attributeChanged reaction when adding a value to an unobserved attribute');
+
+test(function () {
+ var element = define_new_custom_element(['class']);
+ var instance = document.createElement(element.name);
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ instance.classList.add('hello', 'world');
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'class', oldValue: null, newValue: 'hello world', namespace: null});
+}, 'add on DOMTokenList must enqueue exactly one attributeChanged reaction when adding multiple values to an attribute');
+
+test(function () {
+ var element = define_new_custom_element(['class']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('class', 'hello world');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'attributeChanged']);
+ instance.classList.remove('world');
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'class', oldValue: 'hello world', newValue: 'hello', namespace: null});
+}, 'remove on DOMTokenList must enqueue an attributeChanged reaction when removing a value from an attribute');
+
+test(function () {
+ var element = define_new_custom_element(['class']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('class', 'hello foo world bar');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'attributeChanged']);
+ instance.classList.remove('hello', 'world');
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'class', oldValue: 'hello foo world bar', newValue: 'foo bar', namespace: null});
+}, 'remove on DOMTokenList must enqueue exactly one attributeChanged reaction when removing multiple values to an attribute');
+
+test(function () {
+ var element = define_new_custom_element(['class']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('class', 'hello world');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'attributeChanged']);
+ instance.classList.remove('foo');
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'class', oldValue: 'hello world', newValue: 'hello world', namespace: null});
+}, 'remove on DOMTokenList must enqueue an attributeChanged reaction even when removing a non-existent value from an attribute');
+
+test(function () {
+ var element = define_new_custom_element(['title']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('class', 'hello world');
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ instance.classList.remove('world');
+ assert_array_equals(element.takeLog().types(), []);
+}, 'remove on DOMTokenList must not enqueue an attributeChanged reaction when removing a value from an unobserved attribute');
+
+test(function () {
+ var element = define_new_custom_element(['class']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('class', 'hello');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'attributeChanged']);
+ instance.classList.toggle('world');
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'class', oldValue: 'hello', newValue: 'hello world', namespace: null});
+}, 'toggle on DOMTokenList must enqueue an attributeChanged reaction when adding a value to an attribute');
+
+test(function () {
+ var element = define_new_custom_element(['class']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('class', 'hello world');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'attributeChanged']);
+ instance.classList.toggle('world');
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'class', oldValue: 'hello world', newValue: 'hello', namespace: null});
+}, 'toggle on DOMTokenList must enqueue an attributeChanged reaction when removing a value from an attribute');
+
+test(function () {
+ var element = define_new_custom_element(['lang']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('class', 'hello world');
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ instance.classList.toggle('world');
+ assert_array_equals(element.takeLog().types(), []);
+}, 'remove on DOMTokenList must not enqueue an attributeChanged reaction when removing a value from an unobserved attribute');
+
+test(function () {
+ var element = define_new_custom_element(['class']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('class', 'hello');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'attributeChanged']);
+ instance.classList.replace('hello', 'world');
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'class', oldValue: 'hello', newValue: 'world', namespace: null});
+}, 'replace on DOMTokenList must enqueue an attributeChanged reaction when replacing a value in an attribute');
+
+test(function () {
+ var element = define_new_custom_element(['class']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('class', 'hello world');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'attributeChanged']);
+ instance.classList.replace('foo', 'bar');
+ assert_array_equals(element.takeLog().types(), []);
+}, 'replace on DOMTokenList must not enqueue an attributeChanged reaction when the token to replace does not exist in the attribute');
+
+test(function () {
+ var element = define_new_custom_element(['title']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('class', 'hello');
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ instance.classList.replace('hello', 'world');
+ assert_array_equals(element.takeLog().types(), []);
+}, 'replace on DOMTokenList must not enqueue an attributeChanged reaction when replacing a value in an unobserved attribute');
+
+test(function () {
+ var element = define_new_custom_element(['class']);
+ var instance = document.createElement(element.name);
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ instance.classList = 'hello';
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'class', oldValue: null, newValue: 'hello', namespace: null});
+}, 'the stringifier of DOMTokenList must enqueue an attributeChanged reaction when adding an observed attribute');
+
+test(function () {
+ var element = define_new_custom_element(['id']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('class', 'hello');
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ instance.classList = 'hello';
+ var logEntries = element.takeLog();
+ assert_array_equals(element.takeLog().types(), []);
+}, 'the stringifier of DOMTokenList must not enqueue an attributeChanged reaction when adding an unobserved attribute');
+
+test(function () {
+ var element = define_new_custom_element(['class']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('class', 'hello');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'attributeChanged']);
+ instance.classList = 'world';
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'class', oldValue: 'hello', newValue: 'world', namespace: null});
+}, 'the stringifier of DOMTokenList must enqueue an attributeChanged reaction when mutating the value of an observed attribute');
+
+test(function () {
+ var element = define_new_custom_element([]);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('class', 'hello');
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ instance.classList = 'world';
+ assert_array_equals(element.takeLog().types(), []);
+}, 'the stringifier of DOMTokenList must not enqueue an attributeChanged reaction when mutating the value of an unobserved attribute');
+
+test(function () {
+ var element = define_new_custom_element(['class']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('class', 'hello');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'attributeChanged']);
+ instance.classList = 'hello';
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'class', oldValue: 'hello', newValue: 'hello', namespace: null});
+}, 'the stringifier of DOMTokenList must enqueue an attributeChanged reaction when the setter is called with the original value of the attribute');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/Document.html b/tests/wpt/web-platform-tests/custom-elements/reactions/Document.html
new file mode 100644
index 00000000000..98c642bcf26
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/Document.html
@@ -0,0 +1,154 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on Document interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="importNode and adoptNode of Document interface must have CEReactions">
+<meta name="help" content="https://dom.spec.whatwg.org/#document">
+<meta name="help" content="https://html.spec.whatwg.org/#document">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ const instance = contentDocument.createElement('custom-element');
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+
+ const newDoc = contentDocument.implementation.createHTMLDocument();
+ newDoc.importNode(instance);
+
+ assert_array_equals(element.takeLog().types(), []);
+}, 'importNode on Document must not construct a new custom element when importing a custom element into a window-less document');
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ const template = contentDocument.createElement('template');
+ template.innerHTML = '<custom-element></custom-element>';
+ assert_array_equals(element.takeLog().types(), []);
+ contentDocument.importNode(template.content, true);
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+}, 'importNode on Document must construct a new custom element when importing a custom element from a template');
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ const instance = contentDocument.createElement('custom-element');
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+
+ const newDoc = contentDocument.implementation.createHTMLDocument();
+ newDoc.adoptNode(instance);
+
+ const logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['adopted']);
+ assert_equals(logEntries.last().oldDocument, contentDocument);
+ assert_equals(logEntries.last().newDocument, newDoc);
+}, 'adoptNode on Document must enqueue an adopted reaction when importing a custom element');
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ const instance = contentDocument.createElement('custom-element');
+
+ const container = contentDocument.createElement('div');
+ container.contentEditable = true;
+ container.appendChild(instance);
+ contentDocument.body.appendChild(container);
+
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+
+ container.focus();
+ contentDocument.execCommand('delete', false, null);
+
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'execCommand on Document must enqueue a disconnected reaction when deleting a custom element from a contenteditable element');
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+
+ contentDocument.title = '';
+ const title = contentDocument.querySelector('title');
+ const instance = contentDocument.createElement('custom-element');
+ title.appendChild(instance);
+ instance.textContent = 'hello';
+
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ assert_equals(title.innerHTML, '<custom-element>hello</custom-element>');
+
+ title.text = 'world';
+ assert_equals(title.innerHTML, 'world');
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'title on Document must enqueue disconnectedCallback when removing a custom element');
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+
+ const body = contentDocument.body;
+ body.innerHTML = '<custom-element>hello</custom-element>';
+
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ assert_equals(body.innerHTML, '<custom-element>hello</custom-element>');
+
+ contentDocument.body = contentDocument.createElement('body');
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'body on Document must enqueue disconnectedCallback when removing a custom element');
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+
+ const instance = contentDocument.createElement('custom-element');
+ const body = contentDocument.createElement('body');
+ body.appendChild(instance);
+
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ assert_equals(body.innerHTML, '<custom-element></custom-element>');
+
+ contentDocument.body = body;
+ assert_array_equals(element.takeLog().types(), ['connected']);
+}, 'body on Document must enqueue connectedCallback when inserting a custom element');
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentDocument.body.innerHTML = '<custom-element></custom-element>';
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+
+ contentDocument.open();
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'open on Document must enqueue disconnectedCallback when removing a custom element');
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentDocument.body.innerHTML = '<custom-element></custom-element>';
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+
+ contentDocument.write('');
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'write on Document must enqueue disconnectedCallback when removing a custom element');
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentWindow.document.write('<custom-element></custom-element>');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+}, 'write on Document must enqueue connectedCallback after constructing a custom element');
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentDocument.body.innerHTML = '<custom-element></custom-element>';
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+
+ contentDocument.writeln('');
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'writeln on Document must enqueue disconnectedCallback when removing a custom element');
+
+test_with_window(function (contentWindow) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentWindow.document.writeln('<custom-element></custom-element>');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+}, 'writeln on Document must enqueue connectedCallback after constructing a custom element');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/Element.html b/tests/wpt/web-platform-tests/custom-elements/reactions/Element.html
new file mode 100644
index 00000000000..8370724061a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/Element.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on Element interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="id, className, slot, setAttribute, setAttributeNS, removeAttribute, removeAttributeNS, setAttributeNode, setAttributeNodeNS, removeAttributeNode, insertAdjacentElement, innerHTML, outerHTML, and insertAdjacentHTML of Element interface must have CEReactions">
+<meta name="help" content="https://dom.spec.whatwg.org/#element">
+<meta name="help" content="https://w3c.github.io/DOM-Parsing/">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+testReflectAttribute('id', 'id', 'foo', 'bar', 'id on Element');
+testReflectAttribute('className', 'class', 'foo', 'bar', 'className on Element');
+testReflectAttribute('slot', 'slot', 'foo', 'bar', 'slot on Element');
+
+testAttributeAdder(function (element, name, value) {
+ element.setAttribute(name, value);
+}, 'setAttribute on Element');
+
+testAttributeAdder(function (element, name, value) {
+ element.setAttributeNS(null, name, value);
+}, 'setAttributeNS on Element');
+
+testAttributeRemover(function (element, name) {
+ element.removeAttribute(name);
+}, 'removeAttribute on Element');
+
+testAttributeRemover(function (element, name) {
+ element.removeAttributeNS(null, name);
+}, 'removeAttributeNS on Element');
+
+testAttributeAdder(function (element, name, value) {
+ var attr = document.createAttribute(name);
+ attr.value = value;
+ element.setAttributeNode(attr);
+}, 'setAttributeNode on Element');
+
+testAttributeAdder(function (element, name, value) {
+ var attr = document.createAttribute(name);
+ attr.value = value;
+ element.setAttributeNodeNS(attr);
+}, 'setAttributeNodeNS on Element');
+
+testAttributeRemover(function (element, name) {
+ var attr = element.getAttributeNode(name);
+ if (attr)
+ element.removeAttributeNode(element.getAttributeNode(name));
+}, 'removeAttributeNode on Element');
+
+testNodeConnector(function (newContainer, element) {
+ newContainer.insertAdjacentElement('afterBegin', element);
+}, 'insertAdjacentElement on Element');
+
+testInsertingMarkup(function (newContainer, markup) {
+ newContainer.innerHTML = markup;
+}, 'innerHTML on Element');
+
+testNodeDisconnector(function (customElement) {
+ customElement.parentNode.innerHTML = '';
+}, 'innerHTML on Element');
+
+testInsertingMarkup(function (newContainer, markup) {
+ newContainer.firstChild.outerHTML = markup;
+}, 'outerHTML on Element');
+
+testNodeDisconnector(function (customElement) {
+ customElement.outerHTML = '';
+}, 'outerHTML on Element');
+
+testInsertingMarkup(function (newContainer, markup) {
+ newContainer.insertAdjacentHTML('afterBegin', markup);
+}, 'insertAdjacentHTML on Element');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/ElementContentEditable.html b/tests/wpt/web-platform-tests/custom-elements/reactions/ElementContentEditable.html
new file mode 100644
index 00000000000..bdb10761cb8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/ElementContentEditable.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on ElementContentEditable interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="contentEditable of ElementContentEditable interface must have CEReactions">
+<meta name="help" content="https://html.spec.whatwg.org/#elementcontenteditable">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+testReflectAttribute('contentEditable', 'contenteditable', 'true', 'false', 'contentEditable on ElementContentEditable');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLAnchorElement.html b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLAnchorElement.html
new file mode 100644
index 00000000000..c6eeb1dce90
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLAnchorElement.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on HTMLAnchorElement interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="text of HTMLAnchorElement interface must have CEReactions">
+<meta name="help" content="https://dom.spec.whatwg.org/#node">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentDocument.body.innerHTML = `<a><custom-element>hello</custom-element></a>`;
+ const anchor = contentDocument.querySelector('a');
+
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ assert_equals(anchor.innerHTML, '<custom-element>hello</custom-element>');
+
+ anchor.text = 'world';
+ assert_equals(anchor.innerHTML, 'world');
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'text on HTMLAnchorElement must enqueue disconnectedCallback when removing a custom element');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLElement.html b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLElement.html
new file mode 100644
index 00000000000..bce4ef1627c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLElement.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on HTMLElement interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="title, lang, translate, dir, hidden, tabIndex, accessKey, draggable, dropzone, contextMenu, spellcheck, innerText, and outerText of HTMLElement interface must have CEReactions">
+<meta name="help" content="https://html.spec.whatwg.org/#htmlelement">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+testReflectAttribute('title', 'title', 'foo', 'bar', 'title on HTMLElement');
+testReflectAttribute('lang', 'lang', 'en', 'zh', 'lang on HTMLElement');
+testReflectAttributeWithContentValues('translate', 'translate', true, 'yes', false, 'no', 'translate on HTMLElement');
+testReflectAttribute('dir', 'dir', 'ltr', 'rtl', 'dir on HTMLElement');
+testReflectBooleanAttribute('hidden', 'hidden', 'hidden on HTMLElement');
+testReflectAttribute('tabIndex', 'tabindex', '0', '1', 'tabIndex on HTMLElement');
+testReflectAttribute('accessKey', 'accesskey', 'a', 'b', 'accessKey on HTMLElement');
+testReflectAttributeWithContentValues('draggable', 'draggable', true, 'true', false, 'false', 'draggable on HTMLElement');
+testReflectAttribute('dropzone', 'dropzone', 'copy', 'move', 'dropzone on HTMLElement');
+testReflectAttribute('contextMenu', 'contextmenu', 'menu1', 'menu2', 'contextMenu on HTMLElement');
+testReflectAttributeWithContentValues('spellcheck', 'spellcheck', true, 'true', false, 'false', 'spellcheck on HTMLElement');
+
+testNodeDisconnector(function (customElement) {
+ customElement.parentNode.innerText = '';
+}, 'innerText on HTMLElement');
+
+if ('outerText' in HTMLElement.prototype) {
+ // Not yet to be in the standard but all but Gecko supports this property: https://github.com/whatwg/html/issues/668
+ testNodeDisconnector(function (customElement) {
+ customElement.outerText = '';
+ }, 'outerText on HTMLElement');
+}
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLOptionElement.html b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLOptionElement.html
new file mode 100644
index 00000000000..418ef282b32
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLOptionElement.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on HTMLOptionElement interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="text of HTMLOptionElement interface must have CEReactions">
+<meta name="help" content="https://dom.spec.whatwg.org/#node">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentDocument.body.innerHTML = `<select><option></option></select>`;
+ const option = contentDocument.querySelector('option');
+ const instance = document.createElement('custom-element');
+ option.appendChild(instance);
+ instance.textContent = 'hello';
+
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ assert_equals(option.innerHTML, '<custom-element>hello</custom-element>');
+
+ option.text = 'world';
+ assert_equals(option.innerHTML, 'world');
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'text on HTMLOptionElement must enqueue disconnectedCallback when removing a custom element');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLOptionsCollection.html b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLOptionsCollection.html
new file mode 100644
index 00000000000..0d64259d063
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLOptionsCollection.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on HTMLOptionsCollection interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="length, the indexed setter, add, and remove of HTMLOptionsCollection interface must have CEReactions">
+<meta name="help" content="https://dom.spec.whatwg.org/#node">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentDocument.body.innerHTML = `<select><option></option></select>`;
+ const option = contentDocument.querySelector('option');
+
+ const instance = contentDocument.createElement(element.name);
+ option.appendChild(instance);
+ instance.textContent = 'hello';
+
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ assert_equals(option.innerHTML, '<custom-element>hello</custom-element>');
+
+ const select = contentDocument.querySelector('select');
+ assert_equals(select.options[0], option);
+ select.options.length = 0;
+ assert_equals(select.firstChild, null);
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'length on HTMLOptionsCollection must enqueue disconnectedCallback when removing a custom element');
+
+test_with_window(function (contentWindow) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+
+ const contentDocument = contentWindow.document;
+ contentDocument.body.innerHTML = `<select></select>`;
+ const select = contentDocument.querySelector('select');
+
+ const option = contentDocument.createElement('option');
+ const instance = contentDocument.createElement(element.name);
+ option.appendChild(instance);
+ instance.textContent = 'hello';
+
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ assert_equals(option.innerHTML, '<custom-element>hello</custom-element>');
+
+ assert_equals(select.options.length, 0);
+ select.options[0] = option;
+ assert_equals(select.options.length, 1);
+ assert_array_equals(element.takeLog().types(), ['connected']);
+}, 'The indexed setter on HTMLOptionsCollection must enqueue connectedCallback when inserting a custom element');
+
+test_with_window(function (contentWindow) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+
+ const contentDocument = contentWindow.document;
+ contentDocument.body.innerHTML = `<select><option></option></select>`;
+ const option = contentDocument.querySelector('option');
+
+ const instance = contentDocument.createElement(element.name);
+ option.appendChild(instance);
+ instance.textContent = 'hello';
+
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ assert_equals(option.innerHTML, '<custom-element>hello</custom-element>');
+
+ const select = contentDocument.querySelector('select');
+ assert_equals(select.options[0], option);
+ select.options[0] = null;
+ assert_equals(select.options.length, 0);
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'The indexed setter on HTMLOptionsCollection must enqueue disconnectedCallback when removing a custom element');
+
+test_with_window(function (contentWindow) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+
+ const contentDocument = contentWindow.document;
+ contentDocument.body.innerHTML = `<select></select>`;
+ const select = contentDocument.querySelector('select');
+
+ const option = contentDocument.createElement('option');
+ const instance = contentDocument.createElement(element.name);
+ option.appendChild(instance);
+ instance.textContent = 'hello';
+
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ assert_equals(option.innerHTML, '<custom-element>hello</custom-element>');
+
+ assert_equals(select.options.length, 0);
+ select.options.add(option);
+ assert_equals(select.options.length, 1);
+ assert_array_equals(element.takeLog().types(), ['connected']);
+}, 'add on HTMLOptionsCollection must enqueue connectedCallback when inserting a custom element');
+
+test_with_window(function (contentWindow) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+
+ const contentDocument = contentWindow.document;
+ contentDocument.body.innerHTML = `<select><option></option></select>`;
+ const option = contentDocument.querySelector('option');
+
+ const instance = contentDocument.createElement(element.name);
+ option.appendChild(instance);
+ instance.textContent = 'hello';
+
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ assert_equals(option.innerHTML, '<custom-element>hello</custom-element>');
+
+ const select = contentDocument.querySelector('select');
+ assert_equals(select.options[0], option);
+ select.options.remove(0);
+ assert_equals(select.options.length, 0);
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'remove on HTMLOptionsCollection must enqueue disconnectedCallback when removing a custom element');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLOutputElement.html b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLOutputElement.html
new file mode 100644
index 00000000000..02e669bc7a7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLOutputElement.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on HTMLOutputElement interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="value and defaultValue of HTMLOutputElement interface must have CEReactions">
+<meta name="help" content="https://dom.spec.whatwg.org/#node">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentDocument.body.innerHTML = `<output><custom-element>hello</custom-element></output>`;
+ const anchor = contentDocument.querySelector('output');
+
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ assert_equals(anchor.innerHTML, '<custom-element>hello</custom-element>');
+
+ anchor.value = 'world';
+ assert_equals(anchor.innerHTML, 'world');
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'value on HTMLOutputElement must enqueue disconnectedCallback when removing a custom element');
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentDocument.body.innerHTML = `<output><custom-element>hello</custom-element></output>`;
+ const anchor = contentDocument.querySelector('output');
+
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ assert_equals(anchor.innerHTML, '<custom-element>hello</custom-element>');
+
+ anchor.defaultValue = 'world';
+ assert_equals(anchor.innerHTML, 'world');
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'defaultValue on HTMLOutputElement must enqueue disconnectedCallback when removing a custom element');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLSelectElement.html b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLSelectElement.html
new file mode 100644
index 00000000000..7c79634f668
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLSelectElement.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on HTMLSelectElement interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="length, add, remove, and the setter of HTMLSelectElement interface must have CEReactions">
+<meta name="help" content="https://dom.spec.whatwg.org/#node">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentDocument.body.innerHTML = `<select><option></option></select>`;
+ const option = contentDocument.querySelector('option');
+
+ const instance = contentDocument.createElement(element.name);
+ option.appendChild(instance);
+ instance.textContent = 'hello';
+
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ assert_equals(option.innerHTML, '<custom-element>hello</custom-element>');
+
+ const select = contentDocument.querySelector('select');
+ assert_equals(select.length, 1);
+ select.length = 0;
+ assert_equals(select.firstChild, null);
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'length on HTMLSelectElement must enqueue disconnectedCallback when removing a custom element');
+
+test_with_window(function (contentWindow) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+
+ const contentDocument = contentWindow.document;
+ contentDocument.body.innerHTML = `<select></select>`;
+ const select = contentDocument.querySelector('select');
+
+ const option = contentDocument.createElement('option');
+ const instance = contentDocument.createElement(element.name);
+ option.appendChild(instance);
+ instance.textContent = 'hello';
+
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ assert_equals(option.innerHTML, '<custom-element>hello</custom-element>');
+
+ assert_equals(select.options.length, 0);
+ select[0] = option;
+ assert_equals(select.options.length, 1);
+ assert_array_equals(element.takeLog().types(), ['connected']);
+}, 'The indexed setter on HTMLSelectElement must enqueue connectedCallback when inserting a custom element');
+
+test_with_window(function (contentWindow) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+
+ const contentDocument = contentWindow.document;
+ contentDocument.body.innerHTML = `<select><option></option></select>`;
+ const option = contentDocument.querySelector('option');
+
+ const instance = contentDocument.createElement(element.name);
+ option.appendChild(instance);
+ instance.textContent = 'hello';
+
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ assert_equals(option.innerHTML, '<custom-element>hello</custom-element>');
+
+ const select = contentDocument.querySelector('select');
+ assert_equals(select.options[0], option);
+ select[0] = null;
+ assert_equals(select.options.length, 0);
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'The indexed setter on HTMLSelectElement must enqueue disconnectedCallback when removing a custom element');
+
+test_with_window(function (contentWindow) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+
+ const contentDocument = contentWindow.document;
+ contentDocument.body.innerHTML = `<select></select>`;
+ const select = contentDocument.querySelector('select');
+
+ const option = contentDocument.createElement('option');
+ const instance = contentDocument.createElement(element.name);
+ option.appendChild(instance);
+ instance.textContent = 'hello';
+
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ assert_equals(option.innerHTML, '<custom-element>hello</custom-element>');
+
+ assert_equals(select.options.length, 0);
+ select.add(option);
+ assert_equals(select.options.length, 1);
+ assert_array_equals(element.takeLog().types(), ['connected']);
+}, 'add on HTMLSelectElement must enqueue connectedCallback when inserting a custom element');
+
+test_with_window(function (contentWindow) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+
+ const contentDocument = contentWindow.document;
+ contentDocument.body.innerHTML = `<select><option></option></select>`;
+ const option = contentDocument.querySelector('option');
+
+ const instance = contentDocument.createElement(element.name);
+ option.appendChild(instance);
+ instance.textContent = 'hello';
+
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ assert_equals(option.innerHTML, '<custom-element>hello</custom-element>');
+
+ const select = contentDocument.querySelector('select');
+ assert_equals(select.options[0], option);
+ select.remove(0);
+ assert_equals(select.options.length, 0);
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'remove on HTMLSelectElement must enqueue disconnectedCallback when removing a custom element');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLTableElement.html b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLTableElement.html
new file mode 100644
index 00000000000..6adf2623d6b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLTableElement.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on HTMLTableElement interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="caption, deleteCaption, thead, deleteTHead, tFoot, deleteTFoot, and deleteRow of HTMLTableElement interface must have CEReactions">
+<meta name="help" content="https://dom.spec.whatwg.org/#node">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentDocument.body.innerHTML = `<table></table>`;
+ const table = contentDocument.querySelector('table');
+
+ const caption = contentDocument.createElement('caption');
+ caption.innerHTML = '<custom-element>hello</custom-element>';
+
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ assert_equals(caption.innerHTML, '<custom-element>hello</custom-element>');
+
+ assert_equals(table.caption, null);
+ table.caption = caption;
+ assert_array_equals(element.takeLog().types(), ['connected']);
+}, 'caption on HTMLTableElement must enqueue connectedCallback when inserting a custom element');
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentDocument.body.innerHTML = `<table><caption><custom-element>hello</custom-element></caption></table>`;
+ const caption = contentDocument.querySelector('caption');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ assert_equals(caption.innerHTML, '<custom-element>hello</custom-element>');
+
+ const table = contentDocument.querySelector('table');
+ assert_equals(table.caption, caption);
+ const newCaption = contentDocument.createElement('caption');
+ table.caption = newCaption; // Chrome doesn't support setting to null.
+ assert_equals(table.caption, newCaption);
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'caption on HTMLTableElement must enqueue disconnectedCallback when removing a custom element');
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentDocument.body.innerHTML = `<table><caption><custom-element>hello</custom-element></caption></table>`;
+ const caption = contentDocument.querySelector('caption');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ assert_equals(caption.innerHTML, '<custom-element>hello</custom-element>');
+
+ const table = contentDocument.querySelector('table');
+ assert_equals(table.caption, caption);
+ const newCaption = contentDocument.createElement('caption');
+ table.deleteCaption();
+ assert_equals(table.caption, null);
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'deleteCaption() on HTMLTableElement must enqueue disconnectedCallback when removing a custom element');
+
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentDocument.body.innerHTML = `<table></table>`;
+ const table = contentDocument.querySelector('table');
+
+ const thead = contentDocument.createElement('thead');
+ thead.innerHTML = '<tr><td><custom-element>hello</custom-element></td></tr>';
+
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ assert_equals(thead.innerHTML, '<tr><td><custom-element>hello</custom-element></td></tr>');
+
+ assert_equals(table.tHead, null);
+ table.tHead = thead;
+ assert_array_equals(element.takeLog().types(), ['connected']);
+}, 'tHead on HTMLTableElement must enqueue connectedCallback when inserting a custom element');
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentDocument.body.innerHTML = `<table><thead><tr><td><custom-element>hello</custom-element></td></tr></thead></table>`;
+ const thead = contentDocument.querySelector('thead');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ assert_equals(thead.innerHTML, '<tr><td><custom-element>hello</custom-element></td></tr>');
+
+ const table = contentDocument.querySelector('table');
+ assert_equals(table.tHead, thead);
+ const newThead = contentDocument.createElement('thead');
+ table.tHead = newThead; // Chrome doesn't support setting to null.
+ assert_equals(table.tHead, newThead);
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'tHead on HTMLTableElement must enqueue disconnectedCallback when removing a custom element');
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentDocument.body.innerHTML = `<table><thead><tr><td><custom-element>hello</custom-element></td></tr></thead></table>`;
+ const thead = contentDocument.querySelector('thead');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ assert_equals(thead.innerHTML, '<tr><td><custom-element>hello</custom-element></td></tr>');
+
+ const table = contentDocument.querySelector('table');
+ assert_equals(table.tHead, thead);
+ table.deleteTHead();
+ assert_equals(table.tHead, null);
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'deleteTHead() on HTMLTableElement must enqueue disconnectedCallback when removing a custom element');
+
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentDocument.body.innerHTML = `<table></table>`;
+ const table = contentDocument.querySelector('table');
+
+ const tfoot = contentDocument.createElement('tfoot');
+ tfoot.innerHTML = '<tr><td><custom-element>hello</custom-element></td></tr>';
+
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ assert_equals(tfoot.innerHTML, '<tr><td><custom-element>hello</custom-element></td></tr>');
+
+ assert_equals(table.tFoot, null);
+ table.tFoot = tfoot;
+ assert_array_equals(element.takeLog().types(), ['connected']);
+}, 'tFoot on HTMLTableElement must enqueue connectedCallback when inserting a custom element');
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentDocument.body.innerHTML = `<table><tfoot><tr><td><custom-element>hello</custom-element></td></tr></tfoot></table>`;
+ const tfoot = contentDocument.querySelector('tfoot');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ assert_equals(tfoot.innerHTML, '<tr><td><custom-element>hello</custom-element></td></tr>');
+
+ const table = contentDocument.querySelector('table');
+ assert_equals(table.tFoot, tfoot);
+ const newThead = contentDocument.createElement('tfoot');
+ table.tFoot = newThead; // Chrome doesn't support setting to null.
+ assert_equals(table.tFoot, newThead);
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'tFoot on HTMLTableElement must enqueue disconnectedCallback when removing a custom element');
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentDocument.body.innerHTML = `<table><tfoot><tr><td><custom-element>hello</custom-element></td></tr></tfoot></table>`;
+ const tfoot = contentDocument.querySelector('tfoot');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ assert_equals(tfoot.innerHTML, '<tr><td><custom-element>hello</custom-element></td></tr>');
+
+ const table = contentDocument.querySelector('table');
+ assert_equals(table.tFoot, tfoot);
+ table.deleteTFoot();
+ assert_equals(table.tFoot, null);
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'deleteTFoot() on HTMLTableElement must enqueue disconnectedCallback when removing a custom element');
+
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentDocument.body.innerHTML = `<table><tr><td><custom-element>hello</custom-element></td></tr></table>`;
+ const tr = contentDocument.querySelector('tr');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ assert_equals(tr.innerHTML, '<td><custom-element>hello</custom-element></td>');
+
+ const table = contentDocument.querySelector('table');
+ assert_equals(table.rows.length, 1);
+ assert_equals(table.rows[0], tr);
+ table.deleteRow(0);
+ assert_equals(table.rows.length, 0);
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'deleteRow() on HTMLTableElement must enqueue disconnectedCallback when removing a custom element');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLTableRowElement.html b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLTableRowElement.html
new file mode 100644
index 00000000000..a9a00a5da33
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLTableRowElement.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on HTMLTableRowElement interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="deleteCell of HTMLTableRowElement interface must have CEReactions">
+<meta name="help" content="https://dom.spec.whatwg.org/#node">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentDocument.body.innerHTML = `<table><tr><td><custom-element>hello</custom-element></td></tr></table>`;
+ const td = contentDocument.querySelector('td');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ assert_equals(td.innerHTML, '<custom-element>hello</custom-element>');
+
+ const table = contentDocument.querySelector('table');
+ const row = table.rows[0];
+ assert_equals(row.cells[0], td);
+ row.deleteCell(0);
+ assert_equals(row.cells.length, 0);
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'deleteCell() on HTMLTableRowElement must enqueue disconnectedCallback when removing a custom element');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLTableSectionElement.html b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLTableSectionElement.html
new file mode 100644
index 00000000000..cbb0a146e80
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLTableSectionElement.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on HTMLTableSectionElement interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="deleteRow of HTMLTableSectionElement interface must have CEReactions">
+<meta name="help" content="https://dom.spec.whatwg.org/#node">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentDocument.body.innerHTML = `<table><thead><tr><td><custom-element>hello</custom-element></td></tr></thead></table>`;
+ const thead = contentDocument.querySelector('thead');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ assert_equals(thead.innerHTML, '<tr><td><custom-element>hello</custom-element></td></tr>');
+
+ const table = contentDocument.querySelector('table');
+ assert_equals(table.tHead, thead);
+ table.tHead.deleteRow(0);
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'deleteRow() on HTMLTableSectionElement on thead must enqueue disconnectedCallback when removing a custom element');
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ contentDocument.body.innerHTML = `<table><tfoot><tr><td><custom-element>hello</custom-element></td></tr></tfoot></table>`;
+ const tfoot = contentDocument.querySelector('tfoot');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ assert_equals(tfoot.innerHTML, '<tr><td><custom-element>hello</custom-element></td></tr>');
+
+ const table = contentDocument.querySelector('table');
+ assert_equals(table.tFoot, tfoot);
+ table.tFoot.deleteRow(0);
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'deleteRow() on HTMLTableSectionElement on tfoot must enqueue disconnectedCallback when removing a custom element');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLTitleElement.html b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLTitleElement.html
new file mode 100644
index 00000000000..6678944c919
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/HTMLTitleElement.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on HTMLTitleElement interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="text of HTMLTitleElement interface must have CEReactions">
+<meta name="help" content="https://dom.spec.whatwg.org/#node">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ const instance = contentWindow.document.createElement(element.name);
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+
+ contentWindow.document.title = 'hello';
+ const titleElement = contentDocument.querySelector('title');
+ titleElement.appendChild(instance);
+ assert_array_equals(element.takeLog().types(), ['connected']);
+ assert_equals(titleElement.childNodes.length, 2);
+
+ titleElement.text = 'world';
+ assert_equals(titleElement.childNodes.length, 1);
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+}, 'text on HTMLTitleElement must enqueue disconnectedCallback when removing a custom element');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/NamedNodeMap.html b/tests/wpt/web-platform-tests/custom-elements/reactions/NamedNodeMap.html
new file mode 100644
index 00000000000..fa21b3ada9a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/NamedNodeMap.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on NamedNodeMap interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="setNamedItem, setNamedItemNS, removeNameditem, and removeNamedItemNS of NamedNodeMap interface must have CEReactions">
+<meta name="help" content="https://dom.spec.whatwg.org/#node">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+testAttributeAdder(function (element, name, value) {
+ var attr = element.ownerDocument.createAttribute(name);
+ attr.value = value;
+ element.attributes.setNamedItem(attr);
+}, 'setNamedItem on NamedNodeMap');
+
+testAttributeAdder(function (element, name, value) {
+ var attr = element.ownerDocument.createAttribute(name);
+ attr.value = value;
+ element.attributes.setNamedItemNS(attr);
+}, 'setNamedItemNS on NamedNodeMap');
+
+testAttributeRemover(function (element, name) {
+ element.attributes.removeNamedItem(name);
+}, 'removeNamedItem on NamedNodeMap', {onlyExistingAttribute: true});
+
+testAttributeRemover(function (element, name) {
+ element.attributes.removeNamedItemNS(null, name);
+}, 'removeNamedItemNS on NamedNodeMap', {onlyExistingAttribute: true});
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/Node.html b/tests/wpt/web-platform-tests/custom-elements/reactions/Node.html
new file mode 100644
index 00000000000..94da3d020e2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/Node.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on Node interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="nodeValue, textContent, normalize, cloneNode, insertBefore, appendChild, replaceChild, and removeChild of Node interface must have CEReactions">
+<meta name="help" content="https://dom.spec.whatwg.org/#node">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+testAttributeMutator(function (element, name, value) {
+ element.getAttributeNode(name).nodeValue = value;
+}, 'nodeValue on Node');
+
+testAttributeMutator(function (element, name, value) {
+ element.getAttributeNode(name).textContent = value;
+}, 'textContent on Node');
+
+// FIXME: Add a test for normalize()
+
+testCloner(function (customElement) {
+ return customElement.cloneNode(false);
+}, 'cloneNode on Node');
+
+testNodeConnector(function (newContainer, customElement) {
+ newContainer.insertBefore(customElement, newContainer.firstChild);
+}, 'insertBefore on ChildNode');
+
+testNodeConnector(function (newContainer, customElement) {
+ newContainer.appendChild(customElement);
+}, 'appendChild on ChildNode');
+
+testNodeConnector(function (newContainer, customElement) {
+ newContainer.replaceChild(customElement, newContainer.firstChild);
+}, 'replaceChild on ChildNode');
+
+testNodeDisconnector(function (customElement) {
+ customElement.parentNode.removeChild(customElement);
+}, 'removeChild on ChildNode');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/ParentNode.html b/tests/wpt/web-platform-tests/custom-elements/reactions/ParentNode.html
new file mode 100644
index 00000000000..b143b5a982b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/ParentNode.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on ParentNode interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="prepend and append of ParentNode interface must have CEReactions">
+<meta name="help" content="https://dom.spec.whatwg.org/#parentnode">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+testNodeConnector(function (newContainer, customElement) {
+ newContainer.prepend(customElement);
+}, 'prepend on ParentNode');
+
+testNodeConnector(function (newContainer, customElement) {
+ newContainer.append(customElement);
+}, 'append on ParentNode');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/Range.html b/tests/wpt/web-platform-tests/custom-elements/reactions/Range.html
new file mode 100644
index 00000000000..c4a8252ff62
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/Range.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on Range interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="deleteContents, extractContents, cloneContents, insertNode, and surroundContents of Range interface must have CEReactions">
+<meta name="help" content="https://dom.spec.whatwg.org/#node">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+testNodeDisconnector(function (customElement) {
+ var range = document.createRange();
+ range.selectNode(customElement);
+ range.deleteContents();
+}, 'deleteContents on Range');
+
+testNodeDisconnector(function (customElement) {
+ var range = document.createRange();
+ range.selectNode(customElement);
+ range.extractContents();
+}, 'extractContents on Range');
+
+testCloner(function (customElement) {
+ var range = document.createRange();
+ range.selectNode(customElement);
+ range.cloneContents();
+}, 'cloneContents on Range')
+
+testNodeConnector(function (container, customElement) {
+ var range = document.createRange();
+ range.selectNodeContents(container);
+ range.insertNode(customElement);
+}, 'insertNode on Range');
+
+testNodeConnector(function (container, customElement) {
+ var range = document.createRange();
+ range.selectNodeContents(container);
+ range.surroundContents(customElement);
+}, 'surroundContents on Range');
+
+testParsingMarkup(function (document, markup) {
+ var range = document.createRange();
+ return range.createContextualFragment(markup);
+}, 'createContextualFragment on Range');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/Selection.html b/tests/wpt/web-platform-tests/custom-elements/reactions/Selection.html
new file mode 100644
index 00000000000..84214201aaa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/Selection.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on Selection interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="deleteFromDocument of Selection interface must have CEReactions">
+<meta name="help" content="http://w3c.github.io/selection-api/#selection-interface">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+testNodeDisconnector(function (customElement, window) {
+ let selection = window.getSelection();
+ let parent = customElement.parentNode;
+
+ // WebKit and Blink "normalizes" selection in selectAllChildren and not select the empty customElement.
+ // Workaround this orthogonal non-standard behavior by inserting text nodes around the custom element.
+ parent.prepend(document.createTextNode('start'));
+ parent.append(document.createTextNode('end'));
+
+ selection.selectAllChildren(parent);
+ selection.deleteFromDocument();
+}, 'deleteFromDocument on Selection');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/ShadowRoot.html b/tests/wpt/web-platform-tests/custom-elements/reactions/ShadowRoot.html
new file mode 100644
index 00000000000..9997d9c8362
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/ShadowRoot.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: CEReactions on ShadowRoot interface</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="innerHTML of ShadowRoot interface must have CEReactions">
+<meta name="help" content="https://dom.spec.whatwg.org/#node">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+<script src="./resources/reactions.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ const host = contentDocument.createElement('div');
+ const shadowRoot = host.attachShadow({mode: 'closed'});
+ shadowRoot.innerHTML = '<custom-element></custom-element>';
+
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+}, 'innerHTML on ShadowRoot must upgrade a custom element');
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ const host = contentDocument.createElement('div');
+ contentDocument.body.appendChild(host);
+ const shadowRoot = host.attachShadow({mode: 'closed'});
+ shadowRoot.innerHTML = '<custom-element></custom-element>';
+
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+}, 'innerHTML on ShadowRoot must enqueue connectedCallback on newly upgraded custom elements when the shadow root is connected');
+
+test_with_window(function (contentWindow, contentDocument) {
+ const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
+ const host = contentDocument.createElement('div');
+ contentDocument.body.appendChild(host);
+
+ const shadowRoot = host.attachShadow({mode: 'closed'});
+ shadowRoot.innerHTML = '<custom-element></custom-element>';
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+
+ shadowRoot.innerHTML = '';
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+
+}, 'innerHTML on ShadowRoot must enqueue disconnectedCallback when removing a custom element');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/resources/reactions.js b/tests/wpt/web-platform-tests/custom-elements/reactions/resources/reactions.js
new file mode 100644
index 00000000000..43ce4fd7ad8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/resources/reactions.js
@@ -0,0 +1,361 @@
+
+let testNumber = 1;
+
+function testNodeConnector(testFunction, name) {
+ let container = document.createElement('div');
+ container.appendChild(document.createElement('div'));
+ document.body.appendChild(container);
+
+ test(function () {
+ var element = define_new_custom_element();
+ var instance = document.createElement(element.name);
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ testFunction(container, instance);
+ assert_array_equals(element.takeLog().types(), ['connected']);
+ }, name + ' must enqueue a connected reaction');
+
+ test(function () {
+ var element = define_new_custom_element();
+ var instance = document.createElement(element.name);
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ var newDoc = document.implementation.createHTMLDocument();
+ testFunction(container, instance);
+ assert_array_equals(element.takeLog().types(), ['connected']);
+ testFunction(newDoc.documentElement, instance);
+ assert_array_equals(element.takeLog().types(), ['disconnected', 'adopted', 'connected']);
+ }, name + ' must enqueue a disconnected reaction, an adopted reaction, and a connected reaction when the custom element was in another document');
+
+ container.parentNode.removeChild(container);
+}
+
+function testNodeDisconnector(testFunction, name) {
+ let container = document.createElement('div');
+ container.appendChild(document.createElement('div'));
+ document.body.appendChild(container);
+
+ test(function () {
+ var element = define_new_custom_element();
+ var instance = document.createElement(element.name);
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ container.appendChild(instance);
+ assert_array_equals(element.takeLog().types(), ['connected']);
+ testFunction(instance, window);
+ assert_array_equals(element.takeLog().types(), ['disconnected']);
+ }, name + ' must enqueue a disconnected reaction');
+
+ container.parentNode.removeChild(container);
+}
+
+function testInsertingMarkup(testFunction, name) {
+ let container = document.createElement('div');
+ container.appendChild(document.createElement('div'));
+ document.body.appendChild(container);
+
+ test(function () {
+ var element = define_new_custom_element();
+ testFunction(container, `<${element.name}></${element.name}>`);
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ }, name + ' must enqueue a connected reaction for a newly constructed custom element');
+
+ test(function () {
+ var element = define_new_custom_element(['title']);
+ testFunction(container, `<${element.name} id="hello" title="hi"></${element.name}>`);
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['constructed', 'attributeChanged', 'connected']);
+ assert_attribute_log_entry(logEntries[1], {name: 'title', oldValue: null, newValue: 'hi', namespace: null});
+ }, name + ' must enqueue a attributeChanged reaction for a newly constructed custom element');
+
+ container.parentNode.removeChild(container);
+}
+
+function testParsingMarkup(testFunction, name) {
+ test(function () {
+ var element = define_new_custom_element(['id']);
+ assert_array_equals(element.takeLog().types(), []);
+ var instance = testFunction(document, `<${element.name} id="hello" class="foo"></${element.name}>`);
+ assert_equals(Object.getPrototypeOf(instance.querySelector(element.name)), element.class.prototype);
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['constructed', 'attributeChanged']);
+ assert_attribute_log_entry(logEntries[1], {name: 'id', oldValue: null, newValue: 'hello', namespace: null});
+ }, name + ' must construct a custom element');
+}
+
+function testCloner(testFunction, name) {
+ let container = document.createElement('div');
+ container.appendChild(document.createElement('div'));
+ document.body.appendChild(container);
+
+ test(function () {
+ var element = define_new_custom_element(['id']);
+ var instance = document.createElement(element.name);
+ container.appendChild(instance);
+
+ instance.setAttribute('id', 'foo');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected', 'attributeChanged']);
+ var newInstance = testFunction(instance);
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['constructed', 'attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'id', oldValue: null, newValue: 'foo', namespace: null});
+ }, name + ' must enqueue an attributeChanged reaction when cloning an element with an observed attribute');
+
+ test(function () {
+ var element = define_new_custom_element(['id']);
+ var instance = document.createElement(element.name);
+ container.appendChild(instance);
+
+ instance.setAttribute('lang', 'en');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
+ var newInstance = testFunction(instance);
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ }, name + ' must not enqueue an attributeChanged reaction when cloning an element with an unobserved attribute');
+
+ test(function () {
+ var element = define_new_custom_element(['title', 'class']);
+ var instance = document.createElement(element.name);
+ container.appendChild(instance);
+
+ instance.setAttribute('lang', 'en');
+ instance.className = 'foo';
+ instance.setAttribute('title', 'hello world');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'connected', 'attributeChanged', 'attributeChanged']);
+ var newInstance = testFunction(instance);
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['constructed', 'attributeChanged', 'attributeChanged']);
+ assert_attribute_log_entry(logEntries[1], {name: 'class', oldValue: null, newValue: 'foo', namespace: null});
+ assert_attribute_log_entry(logEntries[2], {name: 'title', oldValue: null, newValue: 'hello world', namespace: null});
+ }, name + ' must enqueue an attributeChanged reaction when cloning an element only for observed attributes');
+}
+
+function testReflectAttributeWithContentValues(jsAttributeName, contentAttributeName, validValue1, contentValue1, validValue2, contentValue2, name) {
+ test(function () {
+ var element = define_new_custom_element([contentAttributeName]);
+ var instance = document.createElement(element.name);
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ instance[jsAttributeName] = validValue1;
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+
+ assert_attribute_log_entry(logEntries.last(), {name: contentAttributeName, oldValue: null, newValue: contentValue1, namespace: null});
+ }, name + ' must enqueue an attributeChanged reaction when adding ' + contentAttributeName + ' content attribute');
+
+ test(function () {
+ var element = define_new_custom_element([contentAttributeName]);
+ var instance = document.createElement(element.name);
+ instance[jsAttributeName] = validValue1;
+ assert_array_equals(element.takeLog().types(), ['constructed', 'attributeChanged']);
+ instance[jsAttributeName] = validValue2;
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: contentAttributeName, oldValue: contentValue1, newValue: contentValue2, namespace: null});
+ }, name + ' must enqueue an attributeChanged reaction when replacing an existing attribute');
+}
+
+function testReflectAttribute(jsAttributeName, contentAttributeName, validValue1, validValue2, name) {
+ testReflectAttributeWithContentValues(jsAttributeName, contentAttributeName, validValue1, validValue1, validValue2, validValue2, name);
+}
+
+function testReflectBooleanAttribute(jsAttributeName, contentAttributeName, name) {
+ testReflectAttributeWithContentValues(jsAttributeName, contentAttributeName, true, '', false, null, name);
+}
+
+function testAttributeAdder(testFunction, name) {
+ test(function () {
+ var element = define_new_custom_element(['id']);
+ var instance = document.createElement(element.name);
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ testFunction(instance, 'id', 'foo');
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'id', oldValue: null, newValue: 'foo', namespace: null});
+ }, name + ' must enqueue an attributeChanged reaction when adding an attribute');
+
+ test(function () {
+ var element = define_new_custom_element(['class']);
+ var instance = document.createElement(element.name);
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ testFunction(instance, 'data-lang', 'en');
+ assert_array_equals(element.takeLog().types(), []);
+ }, name + ' must not enqueue an attributeChanged reaction when adding an unobserved attribute');
+
+ test(function () {
+ var element = define_new_custom_element(['title']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('title', 'hello');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'attributeChanged']);
+ testFunction(instance, 'title', 'world');
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'title', oldValue: 'hello', newValue: 'world', namespace: null});
+ }, name + ' must enqueue an attributeChanged reaction when replacing an existing attribute');
+
+ test(function () {
+ var element = define_new_custom_element([]);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('data-lang', 'zh');
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ testFunction(instance, 'data-lang', 'en');
+ assert_array_equals(element.takeLog().types(), []);
+ }, name + ' must enqueue an attributeChanged reaction when replacing an existing unobserved attribute');
+}
+
+function testAttributeMutator(testFunction, name) {
+ test(function () {
+ var element = define_new_custom_element(['title']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('title', 'hello');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'attributeChanged']);
+ testFunction(instance, 'title', 'world');
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'title', oldValue: 'hello', newValue: 'world', namespace: null});
+ }, name + ' must enqueue an attributeChanged reaction when replacing an existing attribute');
+
+ test(function () {
+ var element = define_new_custom_element(['class']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('data-lang', 'zh');
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ testFunction(instance, 'data-lang', 'en');
+ assert_array_equals(element.takeLog().types(), []);
+ }, name + ' must not enqueue an attributeChanged reaction when replacing an existing unobserved attribute');
+}
+
+function testAttributeRemover(testFunction, name, options) {
+ if (options && !options.onlyExistingAttribute) {
+ test(function () {
+ var element = define_new_custom_element(['title']);
+ var instance = document.createElement(element.name);
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ testFunction(instance, 'title');
+ assert_array_equals(element.takeLog().types(), []);
+ }, name + ' must not enqueue an attributeChanged reaction when removing an attribute that does not exist');
+ }
+
+ test(function () {
+ var element = define_new_custom_element([]);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('data-lang', 'hello');
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ testFunction(instance, 'data-lang');
+ assert_array_equals(element.takeLog().types(), []);
+ }, name + ' must not enqueue an attributeChanged reaction when removing an unobserved attribute');
+
+ test(function () {
+ var element = define_new_custom_element(['title']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('title', 'hello');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'attributeChanged']);
+ testFunction(instance, 'title');
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'title', oldValue: 'hello', newValue: null, namespace: null});
+ }, name + ' must enqueue an attributeChanged reaction when removing an existing attribute');
+
+ test(function () {
+ var element = define_new_custom_element([]);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('data-lang', 'ja');
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ testFunction(instance, 'data-lang');
+ assert_array_equals(element.takeLog().types(), []);
+ }, name + ' must not enqueue an attributeChanged reaction when removing an existing unobserved attribute');
+}
+
+function test_mutating_style_property_value(testFunction, name, options) {
+ const propertyName = (options || {}).propertyName || 'color';
+ const idlName = (options || {}).idlName || 'color';
+ const value1 = (options || {}).value1 || 'blue';
+ const rule1 = `${propertyName}: ${value1};`;
+ const value2 = (options || {}).value2 || 'red';
+ const rule2 = `${propertyName}: ${value2};`;
+
+ test(function () {
+ var element = define_new_custom_element(['style']);
+ var instance = document.createElement(element.name);
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ testFunction(instance, propertyName, idlName, value1);
+ assert_equals(instance.getAttribute('style'), rule1);
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'style', oldValue: null, newValue: rule1, namespace: null});
+ }, name + ' must enqueue an attributeChanged reaction when it adds the observed style attribute');
+
+ test(function () {
+ var element = define_new_custom_element(['title']);
+ var instance = document.createElement(element.name);
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ testFunction(instance, propertyName, idlName, value1);
+ assert_equals(instance.getAttribute('style'), rule1);
+ assert_array_equals(element.takeLog().types(), []);
+ }, name + ' must not enqueue an attributeChanged reaction when it adds the style attribute but the style attribute is not observed');
+
+ test(function () {
+ var element = define_new_custom_element(['style']);
+ var instance = document.createElement(element.name);
+ testFunction(instance, propertyName, idlName, value1);
+ assert_array_equals(element.takeLog().types(), ['constructed', 'attributeChanged']);
+ testFunction(instance, propertyName, idlName, value2);
+ assert_equals(instance.getAttribute('style'), rule2);
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'style', oldValue: rule1, newValue: rule2, namespace: null});
+ }, name + ' must enqueue an attributeChanged reaction when it mutates the observed style attribute');
+
+ test(function () {
+ var element = define_new_custom_element([]);
+ var instance = document.createElement(element.name);
+ testFunction(instance, propertyName, idlName, value1);
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ testFunction(instance, propertyName, idlName, value2);
+ assert_equals(instance.getAttribute('style'), rule2);
+ assert_array_equals(element.takeLog().types(), []);
+ }, name + ' must not enqueue an attributeChanged reaction when it mutates the style attribute but the style attribute is not observed');
+}
+
+function test_removing_style_property_value(testFunction, name) {
+ test(function () {
+ var element = define_new_custom_element(['style']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('style', 'color: red; display: none;');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'attributeChanged']);
+ testFunction(instance, 'color', 'color');
+ assert_equals(instance.getAttribute('style'), 'display: none;'); // Don't make this empty since browser behaviors are inconsistent now.
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'style', oldValue: 'color: red; display: none;', newValue: 'display: none;', namespace: null});
+ }, name + ' must enqueue an attributeChanged reaction when it removes a property from the observed style attribute');
+
+ test(function () {
+ var element = define_new_custom_element(['class']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('style', 'color: red; display: none;');
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ testFunction(instance, 'color', 'color');
+ assert_equals(instance.getAttribute('style'), 'display: none;'); // Don't make this empty since browser behaviors are inconsistent now.
+ assert_array_equals(element.takeLog().types(), []);
+ }, name + ' must not enqueue an attributeChanged reaction when it removes a property from the style attribute but the style attribute is not observed');
+}
+
+function test_mutating_style_property_priority(testFunction, name) {
+ test(function () {
+ var element = define_new_custom_element(['style']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('style', 'color: red');
+ assert_array_equals(element.takeLog().types(), ['constructed', 'attributeChanged']);
+ testFunction(instance, 'color', 'color', true);
+ assert_equals(instance.getAttribute('style'), 'color: red !important;');
+ var logEntries = element.takeLog();
+ assert_array_equals(logEntries.types(), ['attributeChanged']);
+ assert_attribute_log_entry(logEntries.last(), {name: 'style', oldValue: 'color: red', newValue: 'color: red !important;', namespace: null});
+ }, name + ' must enqueue an attributeChanged reaction when it makes a property important and the style attribute is observed');
+
+ test(function () {
+ var element = define_new_custom_element(['id']);
+ var instance = document.createElement(element.name);
+ instance.setAttribute('style', 'color: red');
+ assert_array_equals(element.takeLog().types(), ['constructed']);
+ testFunction(instance, 'color', 'color', true);
+ assert_equals(instance.getAttribute('style'), 'color: red !important;');
+ assert_array_equals(element.takeLog().types(), []);
+ }, name + ' must enqueue an attributeChanged reaction when it makes a property important but the style attribute is not observed');
+}
diff --git a/tests/wpt/web-platform-tests/custom-elements/resources/custom-elements-helpers.js b/tests/wpt/web-platform-tests/custom-elements/resources/custom-elements-helpers.js
index 0dfbd6363b2..956c562a76a 100644
--- a/tests/wpt/web-platform-tests/custom-elements/resources/custom-elements-helpers.js
+++ b/tests/wpt/web-platform-tests/custom-elements/resources/custom-elements-helpers.js
@@ -16,7 +16,215 @@ function test_with_window(f, name, srcdoc) {
promise_test((t) => {
return create_window_in_test(t, srcdoc)
.then((w) => {
- f(w);
+ f(w, w.document);
});
}, name);
}
+
+function define_custom_element_in_window(window, name, observedAttributes) {
+ let log = [];
+
+ class CustomElement extends window.HTMLElement {
+ constructor() {
+ super();
+ log.push(create_constructor_log(this));
+ }
+ attributeChangedCallback(...args) {
+ log.push(create_attribute_changed_callback_log(this, ...args));
+ }
+ connectedCallback() { log.push(create_connected_callback_log(this)); }
+ disconnectedCallback() { log.push(create_disconnected_callback_log(this)); }
+ adoptedCallback(oldDocument, newDocument) { log.push({type: 'adopted', element: this, oldDocument: oldDocument, newDocument: newDocument}); }
+ }
+ CustomElement.observedAttributes = observedAttributes;
+
+ window.customElements.define(name, CustomElement);
+
+ return {
+ name: name,
+ class: CustomElement,
+ takeLog: function () {
+ let currentLog = log; log = [];
+ currentLog.types = () => currentLog.map((entry) => entry.type);
+ currentLog.last = () => currentLog[currentLog.length - 1];
+ return currentLog;
+ }
+ };
+}
+
+function create_constructor_log(element) {
+ return {type: 'constructed', element: element};
+}
+
+function assert_constructor_log_entry(log, element) {
+ assert_equals(log.type, 'constructed');
+ assert_equals(log.element, element);
+}
+
+function create_connected_callback_log(element) {
+ return {type: 'connected', element: element};
+}
+
+function assert_connected_log_entry(log, element) {
+ assert_equals(log.type, 'connected');
+ assert_equals(log.element, element);
+}
+
+function create_disconnected_callback_log(element) {
+ return {type: 'disconnected', element: element};
+}
+
+function assert_disconnected_log_entry(log, element) {
+ assert_equals(log.type, 'disconnected');
+ assert_equals(log.element, element);
+}
+
+function assert_adopted_log_entry(log, element) {
+ assert_equals(log.type, 'adopted');
+ assert_equals(log.element, element);
+}
+
+function create_adopted_callback_log(element) {
+ return {type: 'adopted', element: element};
+}
+
+function create_attribute_changed_callback_log(element, name, oldValue, newValue, namespace) {
+ return {
+ type: 'attributeChanged',
+ element: element,
+ name: name,
+ namespace: namespace,
+ oldValue: oldValue,
+ newValue: newValue,
+ actualValue: element.getAttributeNS(namespace, name)
+ };
+}
+
+function assert_attribute_log_entry(log, expected) {
+ assert_equals(log.type, 'attributeChanged');
+ assert_equals(log.name, expected.name);
+ assert_equals(log.oldValue, expected.oldValue);
+ assert_equals(log.newValue, expected.newValue);
+ assert_equals(log.actualValue, expected.newValue);
+ assert_equals(log.namespace, expected.namespace);
+}
+
+
+function define_new_custom_element(observedAttributes) {
+ let log = [];
+ let name = 'custom-element-' + define_new_custom_element._element_number++;
+
+ class CustomElement extends HTMLElement {
+ constructor() {
+ super();
+ log.push({type: 'constructed', element: this});
+ }
+ attributeChangedCallback(...args) {
+ log.push(create_attribute_changed_callback_log(this, ...args));
+ }
+ connectedCallback() { log.push({type: 'connected', element: this}); }
+ disconnectedCallback() { log.push({type: 'disconnected', element: this}); }
+ adoptedCallback(oldDocument, newDocument) { log.push({type: 'adopted', element: this, oldDocument: oldDocument, newDocument: newDocument}); }
+ }
+ CustomElement.observedAttributes = observedAttributes;
+
+ customElements.define(name, CustomElement);
+
+ return {
+ name: name,
+ class: CustomElement,
+ takeLog: function () {
+ let currentLog = log; log = [];
+ currentLog.types = () => currentLog.map((entry) => entry.type);
+ currentLog.last = () => currentLog[currentLog.length - 1];
+ return currentLog;
+ }
+ };
+}
+define_new_custom_element._element_number = 1;
+
+function document_types() {
+ return [
+ {
+ name: 'the document',
+ create: function () { return Promise.resolve(document); },
+ isOwner: true,
+ hasBrowsingContext: true,
+ },
+ {
+ name: 'the document of the template elements',
+ create: function () {
+ return new Promise(function (resolve) {
+ var template = document.createElementNS('http://www.w3.org/1999/xhtml', 'template');
+ var doc = template.content.ownerDocument;
+ if (!doc.documentElement)
+ doc.appendChild(doc.createElement('html'));
+ resolve(doc);
+ });
+ },
+ hasBrowsingContext: false,
+ },
+ {
+ name: 'a new document',
+ create: function () {
+ return new Promise(function (resolve) {
+ var doc = new Document();
+ doc.appendChild(doc.createElement('html'));
+ resolve(doc);
+ });
+ },
+ hasBrowsingContext: false,
+ },
+ {
+ name: 'a cloned document',
+ create: function () {
+ return new Promise(function (resolve) {
+ var doc = document.cloneNode(false);
+ doc.appendChild(doc.createElement('html'));
+ resolve(doc);
+ });
+ },
+ hasBrowsingContext: false,
+ },
+ {
+ name: 'a document created by createHTMLDocument',
+ create: function () {
+ return Promise.resolve(document.implementation.createHTMLDocument());
+ },
+ hasBrowsingContext: false,
+ },
+ {
+ name: 'an HTML document created by createDocument',
+ create: function () {
+ return Promise.resolve(document.implementation.createDocument('http://www.w3.org/1999/xhtml', 'html', null));
+ },
+ hasBrowsingContext: false,
+ },
+ {
+ name: 'the document of an iframe',
+ create: function () {
+ return new Promise(function (resolve, reject) {
+ var iframe = document.createElement('iframe');
+ iframe.onload = function () { resolve(iframe.contentDocument); }
+ iframe.onerror = function () { reject('Failed to load an empty iframe'); }
+ document.body.appendChild(iframe);
+ });
+ },
+ hasBrowsingContext: true,
+ },
+ {
+ name: 'an HTML document fetched by XHR',
+ create: function () {
+ return new Promise(function (resolve, reject) {
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', 'resources/empty-html-document.html');
+ xhr.overrideMimeType('text/xml');
+ xhr.onload = function () { resolve(xhr.responseXML); }
+ xhr.onerror = function () { reject('Failed to fetch the document'); }
+ xhr.send();
+ });
+ },
+ hasBrowsingContext: false,
+ }
+ ];
+}
diff --git a/tests/wpt/web-platform-tests/custom-elements/resources/empty-html-document.html b/tests/wpt/web-platform-tests/custom-elements/resources/empty-html-document.html
new file mode 100644
index 00000000000..eaca3f49fd1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/resources/empty-html-document.html
@@ -0,0 +1,5 @@
+<!DOCTYPE html>
+<html>
+<body>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/upgrading.html b/tests/wpt/web-platform-tests/custom-elements/upgrading.html
new file mode 100644
index 00000000000..aaea0cb4a02
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/upgrading.html
@@ -0,0 +1,190 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: Enqueue a custom element upgrade reaction</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="Enqueue a custom element upgrade reaction must upgrade a custom element">
+<link rel="help" href="https://dom.spec.whatwg.org/#concept-create-element">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/scripting.html#concept-try-upgrade">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/scripting.html#enqueue-a-custom-element-upgrade-reaction">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/custom-elements-helpers.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+class PredefinedCustomElement extends HTMLElement {}
+customElements.define('predefined-custom-element', PredefinedCustomElement);
+
+var customElementNumber = 1;
+function generateNextCustomElementName() { return 'custom-' + customElementNumber++; }
+
+// Tests for documents without a browsing context.
+document_types().filter(function (entry) { return !entry.isOwner && !entry.hasBrowsingContext; }).forEach(function (entry) {
+ var documentName = entry.name;
+ var getDocument = entry.create;
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ assert_false(doc.createElement('predefined-custom-element') instanceof PredefinedCustomElement);
+ });
+ }, 'Creating an element in ' + documentName + ' must not enqueue a custom element upgrade reaction'
+ + ' because the document does not have a browsing context');
+
+ promise_test(function () {
+ var name = generateNextCustomElementName();
+ var unresolvedElement = document.createElement(name);
+
+ assert_equals(unresolvedElement.__proto__, HTMLElement.prototype,
+ '[[Prototype]] internal slot of the unresolved custom element must be the HTMLElement prototype');
+
+ return getDocument().then(function (doc) {
+ var unresolvedElementInDoc = doc.createElement(name);
+ var prototype = (unresolvedElementInDoc.namespaceURI == 'http://www.w3.org/1999/xhtml' ? HTMLElement : Element).prototype;
+
+ assert_equals(unresolvedElementInDoc.__proto__, prototype,
+ '[[Prototype]] internal slot of the unresolved custom element must be the ' + prototype.toString() + ' prototype');
+ var someCustomElement = class extends HTMLElement {};
+ customElements.define(name, someCustomElement);
+ assert_equals(unresolvedElementInDoc.__proto__, prototype, '"define" must not upgrade a disconnected unresolved custom elements');
+ doc.documentElement.appendChild(unresolvedElementInDoc);
+ assert_equals(unresolvedElementInDoc.__proto__, prototype,
+ 'Inserting an element into a document without a browsing context must not enqueue a custom element upgrade reaction');
+ });
+ }, 'Creating an element in ' + documentName + ' and inserting into the document must not enqueue a custom element upgrade reaction');
+
+ promise_test(function () {
+ var name = generateNextCustomElementName();
+ var unresolvedElement = document.createElement(name);
+
+ assert_equals(unresolvedElement.__proto__, HTMLElement.prototype,
+ '[[Prototype]] internal slot of the unresolved custom element must be the HTMLElement prototype');
+
+ return getDocument().then(function (doc) {
+ var unresolvedElementInDoc = doc.createElement(name);
+ var prototype = (unresolvedElementInDoc.namespaceURI == 'http://www.w3.org/1999/xhtml' ? HTMLElement : Element).prototype;
+
+ assert_equals(unresolvedElementInDoc.__proto__, prototype,
+ '[[Prototype]] internal slot of the unresolved custom element must be the ' + prototype.toString() + ' prototype');
+ var someCustomElement = class extends HTMLElement {};
+ customElements.define(name, someCustomElement);
+ assert_equals(unresolvedElementInDoc.__proto__, prototype, '"define" must not upgrade a disconnected unresolved custom elements');
+ document.body.appendChild(unresolvedElementInDoc);
+
+ if (unresolvedElementInDoc.namespaceURI == 'http://www.w3.org/1999/xhtml') {
+ assert_equals(unresolvedElementInDoc.__proto__, someCustomElement.prototype,
+ 'Inserting an element into a document with a browsing context must enqueue a custom element upgrade reaction');
+ } else {
+ assert_equals(unresolvedElementInDoc.__proto__, prototype,
+ 'Looking up a custom element definition must return null if the element is not in the HTML namespace');
+ }
+ });
+ }, 'Creating an element in ' + documentName + ' and adopting back to a document with browsing context must enqueue a custom element upgrade reaction');
+
+});
+
+// Tests for documents with a browsing context.
+document_types().filter(function (entry) { return !entry.isOwner && entry.hasBrowsingContext; }).forEach(function (entry) {
+ var documentName = entry.name;
+ var getDocument = entry.create;
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ assert_false(doc.createElement('predefined-custom-element') instanceof PredefinedCustomElement);
+ });
+ }, 'Creating an element in ' + documentName + ' must not enqueue a custom element upgrade reaction if there is no matching definition');
+
+ promise_test(function () {
+ return getDocument().then(function (doc) {
+ var docWindow = doc.defaultView;
+ class DistinctPredefinedCustomElement extends docWindow.HTMLElement { };
+ docWindow.customElements.define('predefined-custom-element', DistinctPredefinedCustomElement);
+ assert_true(doc.createElement('predefined-custom-element') instanceof DistinctPredefinedCustomElement);
+ });
+ }, 'Creating an element in ' + documentName + ' must enqueue a custom element upgrade reaction if there is a matching definition');
+
+ promise_test(function () {
+ var unresolvedElement = document.createElement('unresolved-element');
+ return getDocument().then(function (doc) {
+ var docWindow = doc.defaultView;
+ class UnresolvedElement extends docWindow.HTMLElement { };
+ var unresolvedElementInDoc = doc.createElement('unresolved-element');
+
+ assert_equals(unresolvedElement.__proto__, HTMLElement.prototype);
+ assert_equals(unresolvedElementInDoc.__proto__, docWindow.HTMLElement.prototype);
+
+ docWindow.customElements.define('unresolved-element', UnresolvedElement);
+
+ assert_equals(unresolvedElement.__proto__, HTMLElement.prototype);
+ assert_equals(unresolvedElementInDoc.__proto__, docWindow.HTMLElement.prototype);
+
+ });
+ }, '"define" in ' + documentName + ' must not enqueue a custom element upgrade reaction on a disconnected unresolved custom element');
+
+ promise_test(function () {
+ var unresolvedElement = document.createElement('unresolved-element');
+ return getDocument().then(function (doc) {
+ var docWindow = doc.defaultView;
+ class UnresolvedElement extends docWindow.HTMLElement { };
+ var unresolvedElementInDoc = doc.createElement('unresolved-element');
+
+ assert_equals(unresolvedElement.__proto__, HTMLElement.prototype);
+ assert_equals(unresolvedElementInDoc.__proto__, docWindow.HTMLElement.prototype);
+
+ docWindow.customElements.define('unresolved-element', UnresolvedElement);
+ doc.documentElement.appendChild(unresolvedElementInDoc);
+
+ assert_equals(unresolvedElement.__proto__, HTMLElement.prototype);
+ assert_equals(unresolvedElementInDoc.__proto__, UnresolvedElement.prototype);
+ });
+ }, 'Inserting an unresolved custom element into ' + documentName + ' must enqueue a custom element upgrade reaction');
+
+ promise_test(function () {
+ var unresolvedElement = document.createElement('unresolved-element');
+ return getDocument().then(function (doc) {
+ var docWindow = doc.defaultView;
+ class UnresolvedElement extends docWindow.HTMLElement { };
+ var unresolvedElementInDoc = doc.createElement('unresolved-element');
+ doc.documentElement.appendChild(unresolvedElementInDoc);
+
+ assert_equals(unresolvedElement.__proto__, HTMLElement.prototype);
+ assert_equals(unresolvedElementInDoc.__proto__, docWindow.HTMLElement.prototype);
+
+ docWindow.customElements.define('unresolved-element', UnresolvedElement);
+
+ assert_equals(unresolvedElement.__proto__, HTMLElement.prototype);
+ assert_equals(unresolvedElementInDoc.__proto__, UnresolvedElement.prototype);
+ });
+ }, '"define" in ' + documentName + ' must enqueue a custom element upgrade reaction on a connected unresolved custom element');
+
+ promise_test(function () {
+ var unresolvedElement = document.createElement('unresolved-element');
+ return getDocument().then(function (doc) {
+ var docWindow = doc.defaultView;
+ class UnresolvedElement extends docWindow.HTMLElement { };
+ assert_false(unresolvedElement instanceof UnresolvedElement);
+ docWindow.customElements.define('unresolved-element', UnresolvedElement);
+ doc.adoptNode(unresolvedElement);
+ assert_false(unresolvedElement instanceof UnresolvedElement);
+ });
+ }, 'Adopting (and leaving disconnceted) an unresolved custom element into ' + documentName + ' must not enqueue a custom element upgrade reaction');
+
+ promise_test(function () {
+ var unresolvedElement = document.createElement('unresolved-element');
+ return getDocument().then(function (doc) {
+ var docWindow = doc.defaultView;
+ class UnresolvedElement extends docWindow.HTMLElement { };
+ assert_false(unresolvedElement instanceof UnresolvedElement);
+ docWindow.customElements.define('unresolved-element', UnresolvedElement);
+ doc.documentElement.appendChild(unresolvedElement);
+ assert_true(unresolvedElement instanceof UnresolvedElement);
+ });
+ }, 'Adopting and inserting an unresolved custom element into ' + documentName + ' must enqueue a custom element upgrade reaction');
+
+});
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/upgrading/Node-cloneNode.html b/tests/wpt/web-platform-tests/custom-elements/upgrading/Node-cloneNode.html
new file mode 100644
index 00000000000..61580f4184b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/upgrading/Node-cloneNode.html
@@ -0,0 +1,185 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: Upgrading</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="Node.prototype.cloneNode should upgrade a custom element">
+<link rel="help" href="https://html.spec.whatwg.org/#upgrades">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+test(function () {
+ class MyCustomElement extends HTMLElement {}
+ customElements.define('my-custom-element', MyCustomElement);
+
+ var instance = document.createElement('my-custom-element');
+ assert_true(instance instanceof HTMLElement);
+ assert_true(instance instanceof MyCustomElement);
+
+ var clone = instance.cloneNode(false);
+ assert_not_equals(instance, clone);
+ assert_true(clone instanceof HTMLElement,
+ 'A cloned custom element must be an instance of HTMLElement');
+ assert_true(clone instanceof MyCustomElement,
+ 'A cloned custom element must be an instance of the custom element');
+}, 'Node.prototype.cloneNode(false) must be able to clone a custom element');
+
+test_with_window(function (contentWindow) {
+ var contentDocument = contentWindow.document;
+ class MyCustomElement extends contentWindow.HTMLElement {}
+ contentWindow.customElements.define('my-custom-element', MyCustomElement);
+
+ var instance = contentDocument.createElement('my-custom-element');
+ assert_true(instance instanceof contentWindow.HTMLElement);
+ assert_true(instance instanceof MyCustomElement);
+
+ var clone = instance.cloneNode(false);
+ assert_not_equals(instance, clone);
+ assert_true(clone instanceof contentWindow.HTMLElement,
+ 'A cloned custom element must be an instance of HTMLElement');
+ assert_true(clone instanceof MyCustomElement,
+ 'A cloned custom element must be an instance of the custom element');
+}, 'Node.prototype.cloneNode(false) must be able to clone a custom element inside an iframe');
+
+test_with_window(function (contentWindow) {
+ var contentDocument = contentWindow.document;
+ class MyCustomElement extends contentWindow.HTMLElement { }
+ contentWindow.customElements.define('my-custom-element', MyCustomElement);
+
+ var instance = contentDocument.createElement('my-custom-element');
+ var container = contentDocument.createElement('div');
+ container.appendChild(instance);
+
+ var containerClone = container.cloneNode(true);
+ assert_true(containerClone instanceof contentWindow.HTMLDivElement);
+
+ var clone = containerClone.firstChild;
+ assert_not_equals(instance, clone);
+ assert_true(clone instanceof contentWindow.HTMLElement,
+ 'A cloned custom element must be an instance of HTMLElement');
+ assert_true(clone instanceof MyCustomElement,
+ 'A cloned custom element must be an instance of the custom element');
+}, 'Node.prototype.cloneNode(true) must be able to clone a descendent custom element');
+
+test_with_window(function (contentWindow) {
+ var parentNodeInConstructor;
+ var previousSiblingInConstructor;
+ var nextSiblingInConstructor;
+ class MyCustomElement extends contentWindow.HTMLElement {
+ constructor() {
+ super();
+ parentNodeInConstructor = this.parentNode;
+ previousSiblingInConstructor = this.previousSibling;
+ nextSiblingInConstructor = this.nextSibling;
+ }
+ }
+ contentWindow.customElements.define('my-custom-element', MyCustomElement);
+
+ var contentDocument = contentWindow.document;
+ var instance = contentDocument.createElement('my-custom-element');
+ var siblingBeforeInstance = contentDocument.createElement('b');
+ var siblingAfterInstance = contentDocument.createElement('a');
+ var container = contentDocument.createElement('div');
+ container.appendChild(siblingBeforeInstance);
+ container.appendChild(instance);
+ container.appendChild(siblingAfterInstance);
+
+ var containerClone = container.cloneNode(true);
+
+ assert_equals(parentNodeInConstructor, containerClone,
+ 'An upgraded element must have its parentNode set before the custom element constructor is called');
+ assert_equals(previousSiblingInConstructor, containerClone.firstChild,
+ 'An upgraded element must have its previousSibling set before the custom element constructor is called');
+ assert_equals(nextSiblingInConstructor, containerClone.lastChild,
+ 'An upgraded element must have its nextSibling set before the custom element constructor is called');
+}, 'Node.prototype.cloneNode(true) must set parentNode, previousSibling, and nextSibling before upgrading custom elements');
+
+test_with_window(function (contentWindow) {
+ class MyCustomElement extends contentWindow.HTMLElement {
+ constructor(doNotCreateItself) {
+ super();
+ if (!doNotCreateItself)
+ new MyCustomElement(true);
+ }
+ }
+ contentWindow.customElements.define('my-custom-element', MyCustomElement);
+
+ var instance = new MyCustomElement(false);
+ var uncaughtError;
+ contentWindow.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
+ instance.cloneNode(false);
+ assert_equals(uncaughtError.name, 'InvalidStateError');
+}, 'HTMLElement constructor must throw an InvalidStateError when the top of the construction stack is marked AlreadyConstructed'
+ + ' due to a custom element constructor constructing itself after super() call');
+
+test_with_window(function (contentWindow) {
+ class MyCustomElement extends contentWindow.HTMLElement {
+ constructor(doNotCreateItself) {
+ if (!doNotCreateItself)
+ new MyCustomElement(true);
+ super();
+ }
+ }
+ contentWindow.customElements.define('my-custom-element', MyCustomElement);
+
+ var instance = new MyCustomElement(false);
+ var uncaughtError;
+ contentWindow.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
+ instance.cloneNode(false);
+ assert_equals(uncaughtError.name, 'InvalidStateError');
+}, 'HTMLElement constructor must throw an InvalidStateError when the top of the construction stack is marked AlreadyConstructed'
+ + ' due to a custom element constructor constructing itself before super() call');
+
+test_with_window(function (contentWindow) {
+ var contentDocument = contentWindow.document;
+ var returnSpan = false;
+ class MyCustomElement extends contentWindow.HTMLElement {
+ constructor() {
+ super();
+ if (returnSpan)
+ return contentDocument.createElement('span');
+ }
+ }
+ contentWindow.customElements.define('my-custom-element', MyCustomElement);
+
+ var instance = new MyCustomElement(false);
+ returnSpan = true;
+ var uncaughtError;
+ contentWindow.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
+ instance.cloneNode(false);
+ assert_equals(uncaughtError.name, 'InvalidStateError');
+}, 'Upgrading a custom element must throw InvalidStateError when the custom element\'s constructor returns another element');
+
+test_with_window(function (contentWindow) {
+ var contentDocument = contentWindow.document;
+ var instance = contentDocument.createElement('my-custom-element');
+ contentDocument.body.appendChild(instance);
+
+ var calls = [];
+ class MyCustomElement extends contentWindow.HTMLElement {
+ constructor() {
+ super();
+ calls.push(this);
+ throw 'bad';
+ }
+ }
+
+ var uncaughtError;
+ contentWindow.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
+ contentWindow.customElements.define('my-custom-element', MyCustomElement);
+ assert_equals(uncaughtError, 'bad');
+
+ assert_array_equals(calls, [instance]);
+ contentDocument.body.removeChild(instance);
+ contentDocument.body.appendChild(instance);
+ assert_array_equals(calls, [instance]);
+}, 'Inserting an element must not try to upgrade a custom element when it had already failed to upgrade once');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/upgrading/upgrading-enqueue-reactions.html b/tests/wpt/web-platform-tests/custom-elements/upgrading/upgrading-enqueue-reactions.html
new file mode 100644
index 00000000000..8238eee624a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/upgrading/upgrading-enqueue-reactions.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: Upgrading custom elements should enqueue attributeChanged and connected callbacks</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="Upgrading custom elements should enqueue attributeChanged and connected callbacksml">
+<meta name="help" content="https://html.spec.whatwg.org/#upgrades">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/custom-elements-helpers.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+setup({allow_uncaught_exception:true});
+
+test_with_window(function (contentWindow) {
+ const contentDocument = contentWindow.document;
+ contentDocument.write('<test-element id="some" title="This is a test">');
+
+ const undefinedElement = contentDocument.querySelector('test-element');
+ assert_equals(Object.getPrototypeOf(undefinedElement), contentWindow.HTMLElement.prototype);
+
+ let log = [];
+ class TestElement extends contentWindow.HTMLElement {
+ constructor() {
+ super();
+ log.push(create_constructor_log(this));
+ }
+ attributeChangedCallback(...args) {
+ log.push(create_attribute_changed_callback_log(this, ...args));
+ }
+ static get observedAttributes() { return ['id', 'title']; }
+ }
+ contentWindow.customElements.define('test-element', TestElement);
+ assert_equals(Object.getPrototypeOf(undefinedElement), TestElement.prototype);
+
+ assert_equals(log.length, 3);
+ assert_constructor_log_entry(log[0], undefinedElement);
+ assert_attribute_log_entry(log[1], {name: 'id', oldValue: null, newValue: 'some', namespace: null});
+ assert_attribute_log_entry(log[2], {name: 'title', oldValue: null, newValue: 'This is a test', namespace: null});
+}, 'Upgrading a custom element must enqueue attributeChangedCallback on each attribute');
+
+test_with_window(function (contentWindow) {
+ const contentDocument = contentWindow.document;
+ contentDocument.write('<test-element id="some" title="This is a test" class="foo">');
+
+ const undefinedElement = contentDocument.querySelector('test-element');
+ assert_equals(Object.getPrototypeOf(undefinedElement), contentWindow.HTMLElement.prototype);
+
+ let log = [];
+ class TestElement extends contentWindow.HTMLElement {
+ constructor() {
+ super();
+ log.push(create_constructor_log(this));
+ }
+ attributeChangedCallback(...args) {
+ log.push(create_attribute_changed_callback_log(this, ...args));
+ }
+ static get observedAttributes() { return ['class', 'id']; }
+ }
+ contentWindow.customElements.define('test-element', TestElement);
+ assert_equals(Object.getPrototypeOf(undefinedElement), TestElement.prototype);
+
+ assert_equals(log.length, 3);
+ assert_constructor_log_entry(log[0], undefinedElement);
+ assert_attribute_log_entry(log[1], {name: 'id', oldValue: null, newValue: 'some', namespace: null});
+ assert_attribute_log_entry(log[2], {name: 'class', oldValue: null, newValue: 'foo', namespace: null});
+}, 'Upgrading a custom element not must enqueue attributeChangedCallback on unobserved attributes');
+
+test_with_window(function (contentWindow) {
+ const contentDocument = contentWindow.document;
+ contentDocument.write('<test-element id="some" title="This is a test" class="foo">');
+
+ const undefinedElement = contentDocument.querySelector('test-element');
+ assert_equals(Object.getPrototypeOf(undefinedElement), contentWindow.HTMLElement.prototype);
+
+ let log = [];
+ class TestElement extends contentWindow.HTMLElement {
+ constructor() {
+ super();
+ log.push(create_constructor_log(this));
+ }
+ connectedCallback(...args) {
+ log.push(create_connected_callback_log(this, ...args));
+ }
+ }
+ contentWindow.customElements.define('test-element', TestElement);
+ assert_equals(Object.getPrototypeOf(undefinedElement), TestElement.prototype);
+
+ assert_equals(log.length, 2);
+ assert_constructor_log_entry(log[0], undefinedElement);
+ assert_connected_log_entry(log[1], undefinedElement);
+}, 'Upgrading a custom element must enqueue connectedCallback if the element in the document');
+
+test_with_window(function (contentWindow) {
+ const contentDocument = contentWindow.document;
+ contentDocument.write('<test-element id="some" title="This is a test" class="foo">');
+
+ const undefinedElement = contentDocument.querySelector('test-element');
+ assert_equals(Object.getPrototypeOf(undefinedElement), contentWindow.HTMLElement.prototype);
+
+ let log = [];
+ class TestElement extends contentWindow.HTMLElement {
+ constructor() {
+ super();
+ log.push(create_constructor_log(this));
+ }
+ connectedCallback(...args) {
+ log.push(create_connected_callback_log(this, ...args));
+ }
+ attributeChangedCallback(...args) {
+ log.push(create_attribute_changed_callback_log(this, ...args));
+ }
+ static get observedAttributes() { return ['class', 'id']; }
+ }
+ contentWindow.customElements.define('test-element', TestElement);
+ assert_equals(Object.getPrototypeOf(undefinedElement), TestElement.prototype);
+
+ assert_equals(log.length, 4);
+ assert_constructor_log_entry(log[0], undefinedElement);
+ assert_attribute_log_entry(log[1], {name: 'id', oldValue: null, newValue: 'some', namespace: null});
+ assert_attribute_log_entry(log[2], {name: 'class', oldValue: null, newValue: 'foo', namespace: null});
+ assert_connected_log_entry(log[3], undefinedElement);
+}, 'Upgrading a custom element must enqueue attributeChangedCallback before connectedCallback');
+
+test_with_window(function (contentWindow) {
+ const contentDocument = contentWindow.document;
+ contentDocument.write('<test-element id="some" title="This is a test" class="foo">');
+
+ const undefinedElement = contentDocument.querySelector('test-element');
+ assert_equals(Object.getPrototypeOf(undefinedElement), contentWindow.HTMLElement.prototype);
+
+ let log = [];
+ class TestElement extends contentWindow.HTMLElement {
+ constructor() {
+ super();
+ log.push(create_constructor_log(this));
+ throw 'Exception thrown as a part of test';
+ }
+ connectedCallback(...args) {
+ log.push(create_connected_callback_log(this, ...args));
+ }
+ attributeChangedCallback(...args) {
+ log.push(create_attribute_changed_callback_log(this, ...args));
+ }
+ static get observedAttributes() { return ['class', 'id']; }
+ }
+ contentWindow.customElements.define('test-element', TestElement);
+ assert_equals(Object.getPrototypeOf(undefinedElement), TestElement.prototype);
+
+ assert_equals(log.length, 1);
+ assert_constructor_log_entry(log[0], undefinedElement);
+}, 'Upgrading a custom element must not invoke attributeChangedCallback and connectedCallback when the element failed to upgrade');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/custom-elements/upgrading/upgrading-parser-created-element.html b/tests/wpt/web-platform-tests/custom-elements/upgrading/upgrading-parser-created-element.html
new file mode 100644
index 00000000000..7cc3b18aeef
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/upgrading/upgrading-parser-created-element.html
@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Custom Elements: Upgrading unresolved elements</title>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="HTML parser must add an unresolved custom element to the upgrade candidates map">
+<link rel="help" href="https://html.spec.whatwg.org/#upgrades">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<my-custom-element></my-custom-element>
+<instantiates-itself-after-super></instantiates-itself-after-super>
+<instantiates-itself-before-super></instantiates-itself-before-super>
+<my-other-element id="instance"></my-other-element>
+<my-other-element id="otherInstance"></my-other-element>
+<script>
+
+setup({allow_uncaught_exception:true});
+
+test(function () {
+ class MyCustomElement extends HTMLElement { }
+
+ var instance = document.querySelector('my-custom-element');
+ assert_true(instance instanceof HTMLElement);
+ assert_false(instance instanceof HTMLUnknownElement,
+ 'an unresolved custom element should not be an instance of HTMLUnknownElement');
+ assert_false(instance instanceof MyCustomElement);
+
+ customElements.define('my-custom-element', MyCustomElement);
+
+ assert_true(instance instanceof HTMLElement);
+ assert_true(instance instanceof MyCustomElement,
+ 'Calling customElements.define must upgrade existing custom elements');
+
+}, 'Element.prototype.createElement must add an unresolved custom element to the upgrade candidates map');
+
+test(function () {
+ class InstantiatesItselfAfterSuper extends HTMLElement {
+ constructor(doNotCreateItself) {
+ super();
+ if (!doNotCreateItself)
+ new InstantiatesItselfAfterSuper(true);
+ }
+ }
+
+ var uncaughtError;
+ window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
+ customElements.define('instantiates-itself-after-super', InstantiatesItselfAfterSuper);
+ assert_equals(uncaughtError.name, 'InvalidStateError');
+}, 'HTMLElement constructor must throw an InvalidStateError when the top of the construction stack is marked AlreadyConstructed'
+ + ' due to a custom element constructor constructing itself after super() call');
+
+test(function () {
+ class InstantiatesItselfBeforeSuper extends HTMLElement {
+ constructor(doNotCreateItself) {
+ if (!doNotCreateItself)
+ new InstantiatesItselfBeforeSuper(true);
+ super();
+ }
+ }
+
+ var uncaughtError;
+ window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
+ customElements.define('instantiates-itself-before-super', InstantiatesItselfBeforeSuper);
+ assert_equals(uncaughtError.name, 'InvalidStateError');
+}, 'HTMLElement constructor must throw an InvalidStateError when the top of the construction stack is marked AlreadyConstructed'
+ + ' due to a custom element constructor constructing itself before super() call');
+
+test(function () {
+ class MyOtherElement extends HTMLElement {
+ constructor() {
+ super();
+ if (this == instance)
+ return otherInstance;
+ }
+ }
+ var instance = document.getElementById('instance');
+ var otherInstance = document.getElementById('otherInstance');
+
+ assert_false(instance instanceof MyOtherElement);
+ assert_false(otherInstance instanceof MyOtherElement);
+
+ var uncaughtError;
+ window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
+ customElements.define('my-other-element', MyOtherElement);
+ assert_equals(uncaughtError.name, 'InvalidStateError');
+
+ assert_true(document.createElement('my-other-element') instanceof MyOtherElement,
+ 'Upgrading of custom elements must happen after the definition was added to the registry.');
+
+}, 'Upgrading a custom element must throw an InvalidStateError when the returned element is not SameValue as the upgraded element');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/dom/collections/HTMLCollection-supported-property-indices.html b/tests/wpt/web-platform-tests/dom/collections/HTMLCollection-supported-property-indices.html
index 742899c5002..62ee6bb6abf 100644
--- a/tests/wpt/web-platform-tests/dom/collections/HTMLCollection-supported-property-indices.html
+++ b/tests/wpt/web-platform-tests/dom/collections/HTMLCollection-supported-property-indices.html
@@ -97,4 +97,83 @@ test(function() {
assert_equals(collection[4294967296], document.getElementById("4294967296"));
assert_equals(collection[4294967297], document.getElementById("4294967297"));
}, "Handling of property names that look like integers around 2^32");
+
+test(function() {
+ var elements = document.getElementsByTagName("foo");
+ var old_item = elements[0];
+ var old_desc = Object.getOwnPropertyDescriptor(elements, 0);
+ assert_equals(old_desc.value, old_item);
+ assert_true(old_desc.enumerable);
+ assert_true(old_desc.configurable);
+ assert_false(old_desc.writable);
+
+ elements[0] = 5;
+ assert_equals(elements[0], old_item);
+ assert_throws(new TypeError(), function() {
+ "use strict";
+ elements[0] = 5;
+ });
+ assert_throws(new TypeError(), function() {
+ Object.defineProperty(elements, 0, { value: 5 });
+ });
+
+ delete elements[0];
+ assert_equals(elements[0], old_item);
+
+ assert_throws(new TypeError(), function() {
+ "use strict";
+ delete elements[0];
+ });
+ assert_equals(elements[0], old_item);
+}, 'Trying to set an expando that would shadow an already-existing indexed property');
+
+test(function() {
+ var elements = document.getElementsByTagName("foo");
+ var idx = elements.length;
+ var old_item = elements[idx];
+ var old_desc = Object.getOwnPropertyDescriptor(elements, idx);
+ assert_equals(old_item, undefined);
+ assert_equals(old_desc, undefined);
+
+ // [[DefineOwnProperty]] will disallow defining an indexed expando.
+ elements[idx] = 5;
+ assert_equals(elements[idx], undefined);
+ assert_throws(new TypeError(), function() {
+ "use strict";
+ elements[idx] = 5;
+ });
+ assert_throws(new TypeError(), function() {
+ Object.defineProperty(elements, idx, { value: 5 });
+ });
+
+ // Check that deletions out of range do not throw
+ delete elements[idx];
+ (function() {
+ "use strict";
+ delete elements[idx];
+ })();
+}, 'Trying to set an expando with an indexed property name past the end of the list');
+
+test(function(){
+ var elements = document.getElementsByTagName("foo");
+ var old_item = elements[0];
+ var old_desc = Object.getOwnPropertyDescriptor(elements, 0);
+ assert_equals(old_desc.value, old_item);
+ assert_true(old_desc.enumerable);
+ assert_true(old_desc.configurable);
+ assert_false(old_desc.writable);
+
+ Object.prototype[0] = 5;
+ this.add_cleanup(function () { delete Object.prototype[0]; });
+ assert_equals(elements[0], old_item);
+
+ delete elements[0];
+ assert_equals(elements[0], old_item);
+
+ assert_throws(new TypeError(), function() {
+ "use strict";
+ delete elements[0];
+ });
+ assert_equals(elements[0], old_item);
+}, 'Trying to delete an indexed property name should never work');
</script>
diff --git a/tests/wpt/web-platform-tests/dom/collections/HTMLCollection-supported-property-names.html b/tests/wpt/web-platform-tests/dom/collections/HTMLCollection-supported-property-names.html
index a37163b7d18..0a9df1ad660 100644
--- a/tests/wpt/web-platform-tests/dom/collections/HTMLCollection-supported-property-names.html
+++ b/tests/wpt/web-platform-tests/dom/collections/HTMLCollection-supported-property-names.html
@@ -51,4 +51,85 @@ test(function () {
assert_array_equals(Object.getOwnPropertyNames(elements), ['0', 'someProperty']);
}, 'Object.getOwnPropertyNames on HTMLCollection with expando object');
+
+test(function() {
+ var elements = document.getElementsByTagName("span");
+ var old_item = elements["some-id"];
+ var old_desc = Object.getOwnPropertyDescriptor(elements, "some-id");
+ assert_equals(old_desc.value, old_item);
+ assert_false(old_desc.enumerable);
+ assert_true(old_desc.configurable);
+ assert_false(old_desc.writable);
+
+ elements["some-id"] = 5;
+ assert_equals(elements["some-id"], old_item);
+ assert_throws(new TypeError(), function() {
+ "use strict";
+ elements["some-id"] = 5;
+ });
+ assert_throws(new TypeError(), function() {
+ Object.defineProperty(elements, "some-id", { value: 5 });
+ });
+
+ delete elements["some-id"];
+ assert_equals(elements["some-id"], old_item);
+
+ assert_throws(new TypeError(), function() {
+ "use strict";
+ delete elements["some-id"];
+ });
+ assert_equals(elements["some-id"], old_item);
+
+}, 'Trying to set an expando that would shadow an already-existing named property');
+
+test(function() {
+ var elements = document.getElementsByTagName("span");
+ var old_item = elements["new-id"];
+ var old_desc = Object.getOwnPropertyDescriptor(elements, "new-id");
+ assert_equals(old_item, undefined);
+ assert_equals(old_desc, undefined);
+
+ elements["new-id"] = 5;
+ assert_equals(elements["new-id"], 5);
+
+ var span = document.createElement("span");
+ this.add_cleanup(function () {span.remove();});
+ span.id = "new-id";
+ document.body.appendChild(span);
+
+ assert_equals(elements.namedItem("new-id"), span);
+ assert_equals(elements["new-id"], 5);
+
+ delete elements["new-id"];
+ assert_equals(elements["new-id"], span);
+}, 'Trying to set an expando that shadows a named property that gets added later');
+
+test(function() {
+ var elements = document.getElementsByTagName("span");
+ var old_item = elements["new-id2"];
+ var old_desc = Object.getOwnPropertyDescriptor(elements, "new-id2");
+ assert_equals(old_item, undefined);
+ assert_equals(old_desc, undefined);
+
+ Object.defineProperty(elements, "new-id2", { configurable: false, writable:
+ false, value: 5 });
+ assert_equals(elements["new-id2"], 5);
+
+ var span = document.createElement("span");
+ this.add_cleanup(function () {span.remove();});
+ span.id = "new-id2";
+ document.body.appendChild(span);
+
+ assert_equals(elements.namedItem("new-id2"), span);
+ assert_equals(elements["new-id2"], 5);
+
+ delete elements["new-id2"];
+ assert_equals(elements["new-id2"], 5);
+
+ assert_throws(new TypeError(), function() {
+ "use strict";
+ delete elements["new-id2"];
+ });
+ assert_equals(elements["new-id2"], 5);
+}, 'Trying to set a non-configurable expando that shadows a named property that gets added later');
</script>
diff --git a/tests/wpt/web-platform-tests/dom/events/Event-dispatch-click.html b/tests/wpt/web-platform-tests/dom/events/Event-dispatch-click.html
new file mode 100644
index 00000000000..760116beae9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dom/events/Event-dispatch-click.html
@@ -0,0 +1,204 @@
+<!doctype html>
+<title>Synthetic click event "magic"</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id=log></div>
+<div id=dump style=display:none></div>
+<script>
+var dump = document.getElementById("dump")
+
+async_test(function(t) {
+ var input = document.createElement("input")
+ input.type = "checkbox"
+ dump.appendChild(input)
+ input.onclick = t.step_func_done(function() {
+ assert_true(input.checked)
+ })
+ input.click()
+}, "basic with click()")
+
+async_test(function(t) {
+ var input = document.createElement("input")
+ input.type = "checkbox"
+ dump.appendChild(input)
+ input.onclick = t.step_func_done(function() {
+ assert_true(input.checked)
+ })
+ input.dispatchEvent(new MouseEvent("click", {bubbles:true})) // equivalent to the above
+}, "basic with dispatchEvent()")
+
+async_test(function(t) {
+ var input = document.createElement("input")
+ input.type = "checkbox"
+ dump.appendChild(input)
+ input.onclick = t.step_func_done(function() {
+ assert_false(input.checked)
+ })
+ input.dispatchEvent(new Event("click", {bubbles:true})) // no MouseEvent
+}, "basic with wrong event class")
+
+async_test(function(t) {
+ var input = document.createElement("input")
+ input.type = "checkbox"
+ dump.appendChild(input)
+ var child = input.appendChild(new Text("does not matter"))
+ child.dispatchEvent(new MouseEvent("click")) // does not bubble
+ assert_false(input.checked)
+ t.done()
+}, "look at parents only when event bubbles")
+
+async_test(function(t) {
+ var input = document.createElement("input")
+ input.type = "checkbox"
+ dump.appendChild(input)
+ input.onclick = t.step_func_done(function() {
+ assert_true(input.checked)
+ })
+ var child = input.appendChild(new Text("does not matter"))
+ child.dispatchEvent(new MouseEvent("click", {bubbles:true}))
+}, "look at parents when event bubbles")
+
+async_test(function(t) {
+ var input = document.createElement("input")
+ input.type = "checkbox"
+ dump.appendChild(input)
+ input.onclick = t.step_func(function() {
+ assert_false(input.checked, "input pre-click must not be triggered")
+ })
+ var child = input.appendChild(document.createElement("input"))
+ child.type = "checkbox"
+ child.onclick = t.step_func(function() {
+ assert_true(input.checked, "child pre-click must be triggered")
+ })
+ child.dispatchEvent(new MouseEvent("click", {bubbles:true}))
+ t.done()
+}, "pick the first with activation behavior <input type=checkbox>")
+
+var globalCounter = 0 // sorry
+async_test(function(t) { // as above with <a>
+ var i = 0
+ var link = document.createElement("a")
+ link.href = "javascript:(function(){globalCounter--})()" // must not be triggered
+ dump.appendChild(link)
+ var child = link.appendChild(document.createElement("a"))
+ child.href = "javascript:(function(){globalCounter++})()"
+ child.dispatchEvent(new MouseEvent("click", {bubbles:true}))
+ assert_equals(globalCounter, 1)
+ t.done()
+}, "pick the first with activation behavior <a href>")
+
+async_test(function(t) {
+ var input = document.createElement("input")
+ input.type = "checkbox"
+ dump.appendChild(input)
+ var clickEvent = new MouseEvent("click")
+ input.onchange = t.step_func_done(function() {
+ assert_false(clickEvent.defaultPrevented)
+ assert_equals(clickEvent.eventPhase, 0)
+ assert_equals(clickEvent.currentTarget, null)
+ assert_equals(clickEvent.target, input)
+ assert_equals(clickEvent.composedPath().length, 0)
+ })
+ input.dispatchEvent(clickEvent)
+}, "event state during post-click handling")
+
+async_test(function(t) {
+ var input = document.createElement("input")
+ input.type = "checkbox"
+ dump.appendChild(input)
+ var clickEvent = new MouseEvent("click")
+ var finalTarget = document.createElement("doesnotmatter")
+ finalTarget.onclick = t.step_func_done(function() {
+ assert_equals(clickEvent.target, finalTarget)
+ })
+ input.onchange = t.step_func(function() {
+ finalTarget.dispatchEvent(clickEvent)
+ })
+ input.dispatchEvent(clickEvent)
+}, "redispatch during post-click handling")
+
+async_test(function(t) {
+ var input = document.createElement("input")
+ input.type = "checkbox"
+ dump.appendChild(input)
+ var child = input.appendChild(document.createElement("input"))
+ child.type = "checkbox"
+ child.disabled = true
+ child.click()
+ assert_false(input.checked)
+ assert_false(child.checked)
+ t.done()
+}, "disabled checkbox still has activation behavior")
+
+async_test(function(t) {
+ var state = "start"
+
+ var form = document.createElement("form")
+ form.onsubmit = t.step_func(() => {
+ if(state == "start" || state == "checkbox") {
+ state = "failure"
+ } else if(state == "form") {
+ state = "done"
+ }
+ return false
+ })
+ dump.appendChild(form)
+ var button = form.appendChild(document.createElement("button"))
+ button.type = "submit"
+ var checkbox = button.appendChild(document.createElement("input"))
+ checkbox.type = "checkbox"
+ checkbox.onclick = t.step_func(() => {
+ if(state == "start") {
+ assert_unreached()
+ } else if(state == "checkbox") {
+ assert_true(checkbox.checked)
+ }
+ })
+ checkbox.disabled = true
+ checkbox.click()
+ assert_equals(state, "start")
+
+ state = "checkbox"
+ checkbox.disabled = false
+ checkbox.click()
+ assert_equals(state, "checkbox")
+
+ state = "form"
+ button.click()
+ assert_equals(state, "done")
+
+ t.done()
+}, "disabled checkbox still has activation behavior, part 2")
+
+async_test(function(t) {
+ var input = document.createElement("input")
+ input.type = "checkbox"
+ input.onclick = t.step_func_done(function() {
+ assert_true(input.checked)
+ })
+ input.click()
+}, "disconnected checkbox should be checked")
+
+async_test(function(t) {
+ var input = document.createElement("input")
+ input.type = "radio"
+ input.onclick = t.step_func_done(function() {
+ assert_true(input.checked)
+ })
+ input.click()
+}, "disconnected radio should be checked")
+
+async_test(function(t) {
+ var form = document.createElement("form")
+ var didSubmit = false
+ form.onsubmit = t.step_func(() => {
+ didSubmit = true
+ return false
+ })
+ var input = form.appendChild(document.createElement("input"))
+ input.type = "submit"
+ input.click()
+ assert_false(didSubmit)
+ t.done()
+}, "disconnected form should not submit")
+</script>
diff --git a/tests/wpt/web-platform-tests/dom/events/Event-dispatch-other-document.html b/tests/wpt/web-platform-tests/dom/events/Event-dispatch-other-document.html
new file mode 100644
index 00000000000..0252a4f7b61
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dom/events/Event-dispatch-other-document.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<title>Custom event on an element in another document</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id=log></div>
+<script>
+test(function() {
+ var doc = document.implementation.createHTMLDocument("Demo");
+ var element = doc.createElement("div");
+ var called = false;
+ element.addEventListener("foo", this.step_func(function(ev) {
+ assert_false(called);
+ called = true;
+ assert_equals(ev.target, element);
+ }));
+ doc.body.appendChild(element);
+
+ var event = new Event("foo");
+ element.dispatchEvent(event);
+ assert_true(called);
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/dom/events/ProgressEvent.html b/tests/wpt/web-platform-tests/dom/events/ProgressEvent.html
index aa947e3f2ce..dee090016c4 100644
--- a/tests/wpt/web-platform-tests/dom/events/ProgressEvent.html
+++ b/tests/wpt/web-platform-tests/dom/events/ProgressEvent.html
@@ -17,9 +17,4 @@ test(function() {
assert_true(ev.timeStamp > 0)
assert_true("initEvent" in ev)
}, "Default event values.")
-test(function() {
- var e = document.createEvent("ProgressEvent");
- var eProto = Object.getPrototypeOf(e);
- assert_equals(eProto, ProgressEvent.prototype);
-}, "document.createEvent() should work with ProgressEvent.");
</script>
diff --git a/tests/wpt/web-platform-tests/dom/lists/DOMTokenList-iteration.html b/tests/wpt/web-platform-tests/dom/lists/DOMTokenList-iteration.html
index 1911f7bb32a..321bbe00da4 100644
--- a/tests/wpt/web-platform-tests/dom/lists/DOMTokenList-iteration.html
+++ b/tests/wpt/web-platform-tests/dom/lists/DOMTokenList-iteration.html
@@ -41,7 +41,9 @@
assert_equals(list[Symbol.iterator], Array.prototype[Symbol.iterator]);
assert_equals(list.keys, Array.prototype.keys);
- assert_equals(list.values, Array.prototype.values);
+ if (Array.prototype.values) {
+ assert_equals(list.values, Array.prototype.values);
+ }
assert_equals(list.entries, Array.prototype.entries);
assert_equals(list.forEach, Array.prototype.forEach);
});
diff --git a/tests/wpt/web-platform-tests/dom/nodes/DOMImplementation-createDocument.html b/tests/wpt/web-platform-tests/dom/nodes/DOMImplementation-createDocument.html
index f4b63587126..94f8ba5bcc0 100644
--- a/tests/wpt/web-platform-tests/dom/nodes/DOMImplementation-createDocument.html
+++ b/tests/wpt/web-platform-tests/dom/nodes/DOMImplementation-createDocument.html
@@ -140,7 +140,7 @@ test(function() {
assert_equals(doc.URL, "about:blank")
assert_equals(doc.documentURI, "about:blank")
assert_equals(doc.createElement("DIV").localName, "DIV");
- }, "createDocument test " + i + ": metadata for " +
+ }, "createDocument test: metadata for " +
[namespace, qualifiedName, doctype].map(my_format_value))
test(function() {
@@ -148,7 +148,7 @@ test(function() {
assert_equals(doc.characterSet, "UTF-8", "characterSet");
assert_equals(doc.charset, "UTF-8", "charset");
assert_equals(doc.inputEncoding, "UTF-8", "inputEncoding");
- }, "createDocument test " + i + ": characterSet aliases for " +
+ }, "createDocument test: characterSet aliases for " +
[namespace, qualifiedName, doctype].map(my_format_value))
}
})
diff --git a/tests/wpt/web-platform-tests/dom/nodes/Document-createElement.html b/tests/wpt/web-platform-tests/dom/nodes/Document-createElement.html
index 59fa02d83f5..bacaff0f6a0 100644
--- a/tests/wpt/web-platform-tests/dom/nodes/Document-createElement.html
+++ b/tests/wpt/web-platform-tests/dom/nodes/Document-createElement.html
@@ -9,6 +9,8 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
+<iframe src="/common/dummy.xml"></iframe>
+<iframe src="/common/dummy.xhtml"></iframe>
<script>
function toASCIIUppercase(str) {
var diff = "a".charCodeAt(0) - "A".charCodeAt(0);
@@ -22,64 +24,134 @@ function toASCIIUppercase(str) {
}
return res;
}
-test(function() {
- var HTMLNS = "http://www.w3.org/1999/xhtml",
- valid = [
- //[input, localName],
- [undefined, "undefined"],
- [null, "null"],
- ["foo", "foo"],
- ["f1oo", "f1oo"],
- ["foo1", "foo1"],
- ["f\u0300oo", "f\u0300oo"],
- ["foo\u0300", "foo\u0300"],
- [":foo", ":foo"],
- ["f:oo", "f:oo"],
- ["foo:", "foo:"],
- ["xml", "xml"],
- ["xmlns", "xmlns"],
- ["xmlfoo", "xmlfoo"],
- ["xml:foo", "xml:foo"],
- ["xmlns:foo", "xmlns:foo"],
- ["xmlfoo:bar", "xmlfoo:bar"],
- ["svg", "svg"],
- ["math", "math"],
- ["FOO", "foo"],
- ["mar\u212a", "mar\u212a"],
- ["\u0130nput", "\u0130nput"],
- ["\u0131nput", "\u0131nput"]
- ],
- invalid = [
- "",
- "1foo",
- "\u0300foo",
- "}foo",
- "f}oo",
- "foo}",
- "\ufffffoo",
- "f\uffffoo",
- "foo\uffff",
- "<foo",
- "foo>",
- "<foo>",
- "f<oo"
- ]
+function toASCIILowercase(str) {
+ var diff = "a".charCodeAt(0) - "A".charCodeAt(0);
+ var res = "";
+ for (var i = 0; i < str.length; ++i) {
+ if ("A" <= str[i] && str[i] <= "Z") {
+ res += String.fromCharCode(str.charCodeAt(i) + diff);
+ } else {
+ res += str[i];
+ }
+ }
+ return res;
+}
+var HTMLNS = "http://www.w3.org/1999/xhtml",
+ valid = [
+ undefined,
+ null,
+ "foo",
+ "f1oo",
+ "foo1",
+ "f\u0BC6",
+ "foo\u0BC6",
+ ":",
+ ":foo",
+ "f:oo",
+ "foo:",
+ "f:o:o",
+ "f::oo",
+ "f::oo:",
+ "foo:0",
+ "foo:_",
+ // combining char after :, invalid QName but valid Name
+ "foo:\u0BC6",
+ "foo:foo\u0BC6",
+ "foo\u0BC6:foo",
+ "xml",
+ "xmlns",
+ "xmlfoo",
+ "xml:foo",
+ "xmlns:foo",
+ "xmlfoo:bar",
+ "svg",
+ "math",
+ "FOO",
+ // Test that non-ASCII chars don't get uppercased/lowercased
+ "mar\u212a",
+ "\u0130nput",
+ "\u0131nput",
+ ],
+ invalid = [
+ "",
+ "1foo",
+ "1:foo",
+ "fo o",
+ "\u0BC6foo",
+ "}foo",
+ "f}oo",
+ "foo}",
+ "\ufffffoo",
+ "f\uffffoo",
+ "foo\uffff",
+ "<foo",
+ "foo>",
+ "<foo>",
+ "f<oo",
+ "-foo",
+ ".foo",
+ "\u0BC6",
+ ]
+
+var xmlIframe = document.querySelector('[src="/common/dummy.xml"]');
+var xhtmlIframe = document.querySelector('[src="/common/dummy.xhtml"]');
+
+function getWin(desc) {
+ if (desc == "HTML document") {
+ return window;
+ }
+ if (desc == "XML document") {
+ assert_equals(xmlIframe.contentDocument.documentElement.textContent,
+ "Dummy XML document", "XML document didn't load");
+ return xmlIframe.contentWindow;
+ }
+ if (desc == "XHTML document") {
+ assert_equals(xhtmlIframe.contentDocument.documentElement.textContent,
+ "Dummy XHTML document", "XHTML document didn't load");
+ return xhtmlIframe.contentWindow;
+ }
+}
+
- valid.forEach(function(t) {
- test(function() {
- var elt = document.createElement(t[0])
- assert_true(elt instanceof Element)
- assert_true(elt instanceof Node)
- assert_equals(elt.localName, t[1])
- assert_equals(elt.tagName, toASCIIUppercase(t[1]))
- assert_equals(elt.prefix, null)
- assert_equals(elt.namespaceURI, HTMLNS)
- }, "createElement(" + format_value(t[0]) + ")");
+valid.forEach(function(t) {
+ ["HTML document", "XML document", "XHTML document"].forEach(function(desc) {
+ async_test(function(testObj) {
+ window.addEventListener("load", function() {
+ testObj.step(function() {
+ var win = getWin(desc);
+ var doc = win.document;
+ var elt = doc.createElement(t)
+ assert_true(elt instanceof win.Element, "instanceof Element")
+ assert_true(elt instanceof win.Node, "instanceof Node")
+ assert_equals(elt.localName,
+ desc == "HTML document" ? toASCIILowercase(String(t))
+ : String(t),
+ "localName")
+ assert_equals(elt.tagName,
+ desc == "HTML document" ? toASCIIUppercase(String(t))
+ : String(t),
+ "tagName")
+ assert_equals(elt.prefix, null, "prefix")
+ assert_equals(elt.namespaceURI,
+ desc == "XML document" ? null : HTMLNS, "namespaceURI")
+ });
+ testObj.done();
+ });
+ }, "createElement(" + format_value(t) + ") in " + desc);
});
- invalid.forEach(function(arg) {
- test(function() {
- assert_throws("INVALID_CHARACTER_ERR", function() { document.createElement(arg) })
- }, "createElement(" + format_value(arg) + ")");
+});
+invalid.forEach(function(arg) {
+ ["HTML document", "XML document", "XHTML document"].forEach(function(desc) {
+ async_test(function(testObj) {
+ window.addEventListener("load", function() {
+ testObj.step(function() {
+ var doc = getWin(desc).document;
+ assert_throws("InvalidCharacterError",
+ function() { doc.createElement(arg) })
+ });
+ testObj.done();
+ });
+ }, "createElement(" + format_value(arg) + ") in " + desc);
});
-})
+});
</script>
diff --git a/tests/wpt/web-platform-tests/dom/nodes/Document-createElementNS.html b/tests/wpt/web-platform-tests/dom/nodes/Document-createElementNS.html
index 75005a09e2e..68341bcd44f 100644
--- a/tests/wpt/web-platform-tests/dom/nodes/Document-createElementNS.html
+++ b/tests/wpt/web-platform-tests/dom/nodes/Document-createElementNS.html
@@ -6,59 +6,87 @@
<script src="/resources/testharnessreport.js"></script>
<script src="Document-createElementNS.js"></script>
<div id="log"></div>
+<iframe src="/common/dummy.xml"></iframe>
+<iframe src="/common/dummy.xhtml"></iframe>
<script>
-test(function() {
- var tests = createElementNS_tests.concat([
- /* Arrays with three elements:
- * the namespace argument
- * the qualifiedName argument
- * the expected exception, or null if none
- */
- ["", "", "INVALID_CHARACTER_ERR"],
- [null, null, null],
- [null, "", "INVALID_CHARACTER_ERR"],
- [undefined, null, null],
- [undefined, "", "INVALID_CHARACTER_ERR"],
- ["http://example.com/", null, null],
- ["http://example.com/", "", "INVALID_CHARACTER_ERR"],
- ["/", null, null],
- ["/", "", "INVALID_CHARACTER_ERR"],
- ["http://www.w3.org/XML/1998/namespace", null, null],
- ["http://www.w3.org/XML/1998/namespace", "", "INVALID_CHARACTER_ERR"],
- ["http://www.w3.org/2000/xmlns/", null, "NAMESPACE_ERR"],
- ["http://www.w3.org/2000/xmlns/", "", "INVALID_CHARACTER_ERR"],
- ["foo:", null, null],
- ["foo:", "", "INVALID_CHARACTER_ERR"],
- ])
+var tests = createElementNS_tests.concat([
+ /* Arrays with three elements:
+ * the namespace argument
+ * the qualifiedName argument
+ * the expected exception, or null if none
+ */
+ ["", "", "INVALID_CHARACTER_ERR"],
+ [null, null, null],
+ [null, "", "INVALID_CHARACTER_ERR"],
+ [undefined, null, null],
+ [undefined, "", "INVALID_CHARACTER_ERR"],
+ ["http://example.com/", null, null],
+ ["http://example.com/", "", "INVALID_CHARACTER_ERR"],
+ ["/", null, null],
+ ["/", "", "INVALID_CHARACTER_ERR"],
+ ["http://www.w3.org/XML/1998/namespace", null, null],
+ ["http://www.w3.org/XML/1998/namespace", "", "INVALID_CHARACTER_ERR"],
+ ["http://www.w3.org/2000/xmlns/", null, "NAMESPACE_ERR"],
+ ["http://www.w3.org/2000/xmlns/", "", "INVALID_CHARACTER_ERR"],
+ ["foo:", null, null],
+ ["foo:", "", "INVALID_CHARACTER_ERR"],
+])
+
+var xmlIframe = document.querySelector('[src="/common/dummy.xml"]');
+var xhtmlIframe = document.querySelector('[src="/common/dummy.xhtml"]');
- tests.forEach(function(t, i) {
- test(function() {
- var namespace = t[0], qualifiedName = t[1], expected = t[2]
- if (expected != null) {
- assert_throws(expected, function() { document.createElementNS(namespace, qualifiedName) })
- } else {
- var element = document.createElementNS(namespace, qualifiedName)
- assert_not_equals(element, null)
- assert_equals(element.nodeType, Node.ELEMENT_NODE)
- assert_equals(element.nodeType, element.ELEMENT_NODE)
- assert_equals(element.nodeValue, null)
- assert_equals(element.ownerDocument, document)
- var qualified = String(qualifiedName), names = []
- if (qualified.indexOf(":") >= 0) {
- names = qualified.split(":", 2)
+function runTest(t, i, desc) {
+ async_test(function(testObj) {
+ window.addEventListener("load", function() {
+ testObj.step(function() {
+ var doc;
+ if (desc == "HTML document") {
+ doc = document;
+ } else if (desc == "XML document") {
+ doc = xmlIframe.contentDocument;
+ // Make sure we're testing the right document
+ assert_equals(doc.documentElement.textContent, "Dummy XML document");
+ } else if (desc == "XHTML document") {
+ doc = xhtmlIframe.contentDocument;
+ assert_equals(doc.documentElement.textContent, "Dummy XHTML document");
+ }
+ var namespace = t[0], qualifiedName = t[1], expected = t[2]
+ if (expected != null) {
+ assert_throws(expected, function() { doc.createElementNS(namespace, qualifiedName) })
} else {
- names = [null, qualified]
+ var element = doc.createElementNS(namespace, qualifiedName)
+ assert_not_equals(element, null)
+ assert_equals(element.nodeType, Node.ELEMENT_NODE)
+ assert_equals(element.nodeType, element.ELEMENT_NODE)
+ assert_equals(element.nodeValue, null)
+ assert_equals(element.ownerDocument, doc)
+ var qualified = String(qualifiedName), names = []
+ if (qualified.indexOf(":") >= 0) {
+ names = qualified.split(":", 2)
+ } else {
+ names = [null, qualified]
+ }
+ assert_equals(element.prefix, names[0])
+ assert_equals(element.localName, names[1])
+ assert_equals(element.tagName, qualified)
+ assert_equals(element.nodeName, qualified)
+ assert_equals(element.namespaceURI,
+ namespace === undefined || namespace === "" ? null
+ : namespace)
}
- assert_equals(element.prefix, names[0])
- assert_equals(element.localName, names[1])
- assert_equals(element.tagName, qualified)
- assert_equals(element.nodeName, qualified)
- assert_equals(element.namespaceURI, namespace === undefined ? null : namespace)
- }
- }, "createElementNS test: " + t.map(format_value))
- })
+ });
+ testObj.done();
+ });
+ }, "createElementNS test in " + desc + ": " + t.map(format_value))
+}
+
+tests.forEach(function(t, i) {
+ runTest(t, i, "HTML document")
+ runTest(t, i, "XML document")
+ runTest(t, i, "XHTML document")
})
+
test(function() {
var HTMLNS = "http://www.w3.org/1999/xhtml";
var element = document.createElementNS(HTMLNS, "span");
diff --git a/tests/wpt/web-platform-tests/dom/nodes/Document-createElementNS.js b/tests/wpt/web-platform-tests/dom/nodes/Document-createElementNS.js
index e5d3047ad66..b390712aa17 100644
--- a/tests/wpt/web-platform-tests/dom/nodes/Document-createElementNS.js
+++ b/tests/wpt/web-platform-tests/dom/nodes/Document-createElementNS.js
@@ -4,12 +4,13 @@ var createElementNS_tests = [
* the qualifiedName argument
* the expected exception, or null if none
*/
+ [null, null, null],
[null, undefined, null],
[null, "foo", null],
[null, "1foo", "INVALID_CHARACTER_ERR"],
[null, "f1oo", null],
[null, "foo1", null],
- [null, "\u0300foo", "INVALID_CHARACTER_ERR"],
+ [null, "\u0BC6foo", "INVALID_CHARACTER_ERR"],
[null, "}foo", "INVALID_CHARACTER_ERR"],
[null, "f}oo", "INVALID_CHARACTER_ERR"],
[null, "foo}", "INVALID_CHARACTER_ERR"],
@@ -21,9 +22,13 @@ var createElementNS_tests = [
[null, "<foo>", "INVALID_CHARACTER_ERR"],
[null, "f<oo", "INVALID_CHARACTER_ERR"],
[null, "^^", "INVALID_CHARACTER_ERR"],
+ [null, "fo o", "INVALID_CHARACTER_ERR"],
+ [null, "-foo", "INVALID_CHARACTER_ERR"],
+ [null, ".foo", "INVALID_CHARACTER_ERR"],
[null, ":foo", "NAMESPACE_ERR"],
[null, "f:oo", "NAMESPACE_ERR"],
[null, "foo:", "NAMESPACE_ERR"],
+ [null, "f:o:o", "NAMESPACE_ERR"],
[null, ":", "NAMESPACE_ERR"],
[null, "xml", null],
[null, "xmlns", "NAMESPACE_ERR"],
@@ -32,9 +37,11 @@ var createElementNS_tests = [
[null, "xmlns:foo", "NAMESPACE_ERR"],
[null, "xmlfoo:bar", "NAMESPACE_ERR"],
[null, "null:xml", "NAMESPACE_ERR"],
+ ["", null, null],
["", ":foo", "NAMESPACE_ERR"],
["", "f:oo", "NAMESPACE_ERR"],
["", "foo:", "NAMESPACE_ERR"],
+ [undefined, null, null],
[undefined, undefined, null],
[undefined, "foo", null],
[undefined, "1foo", "INVALID_CHARACTER_ERR"],
@@ -43,6 +50,7 @@ var createElementNS_tests = [
[undefined, ":foo", "NAMESPACE_ERR"],
[undefined, "f:oo", "NAMESPACE_ERR"],
[undefined, "foo:", "NAMESPACE_ERR"],
+ [undefined, "f::oo", "NAMESPACE_ERR"],
[undefined, "xml", null],
[undefined, "xmlns", "NAMESPACE_ERR"],
[undefined, "xmlfoo", null],
@@ -51,11 +59,28 @@ var createElementNS_tests = [
[undefined, "xmlfoo:bar", "NAMESPACE_ERR"],
["http://example.com/", "foo", null],
["http://example.com/", "1foo", "INVALID_CHARACTER_ERR"],
+ ["http://example.com/", "<foo>", "INVALID_CHARACTER_ERR"],
+ ["http://example.com/", "fo<o", "INVALID_CHARACTER_ERR"],
+ ["http://example.com/", "-foo", "INVALID_CHARACTER_ERR"],
+ ["http://example.com/", ".foo", "INVALID_CHARACTER_ERR"],
["http://example.com/", "f1oo", null],
["http://example.com/", "foo1", null],
["http://example.com/", ":foo", "NAMESPACE_ERR"],
["http://example.com/", "f:oo", null],
+ ["http://example.com/", "f:o:o", "NAMESPACE_ERR"],
["http://example.com/", "foo:", "NAMESPACE_ERR"],
+ ["http://example.com/", "f::oo", "NAMESPACE_ERR"],
+ ["http://example.com/", "a:0", "NAMESPACE_ERR"],
+ ["http://example.com/", "0:a", "INVALID_CHARACTER_ERR"],
+ ["http://example.com/", "a:_", null],
+ ["http://example.com/", "a:\u0BC6", "NAMESPACE_ERR"],
+ ["http://example.com/", "\u0BC6:a", "INVALID_CHARACTER_ERR"],
+ ["http://example.com/", "a:a\u0BC6", null],
+ ["http://example.com/", "a\u0BC6:a", null],
+ ["http://example.com/", "xml:test", "NAMESPACE_ERR"],
+ ["http://example.com/", "xmlns:test", "NAMESPACE_ERR"],
+ ["http://example.com/", "test:xmlns", null],
+ ["http://example.com/", "xmlns", "NAMESPACE_ERR"],
["http://example.com/", "_:_", null],
["http://example.com/", "_:h0", null],
["http://example.com/", "_:test", null],
diff --git a/tests/wpt/web-platform-tests/dom/nodes/Document-createEvent.html b/tests/wpt/web-platform-tests/dom/nodes/Document-createEvent.html
index 29a2c010ef6..e440061b24d 100644
--- a/tests/wpt/web-platform-tests/dom/nodes/Document-createEvent.html
+++ b/tests/wpt/web-platform-tests/dom/nodes/Document-createEvent.html
@@ -11,8 +11,7 @@ function testAlias(arg, iface) {
var ev;
test(function() {
ev = document.createEvent(arg);
- assert_true(ev instanceof window[iface]);
- assert_true(ev instanceof Event);
+ assert_equals(Object.getPrototypeOf(ev), window[iface].prototype);
}, arg + " should be an alias for " + iface + ".");
test(function() {
assert_equals(ev.type, "",
@@ -118,6 +117,7 @@ var someNonCreateableEvents = [
"RelatedEvent",
"ResourceProgressEvent",
"SVGEvent",
+ "SVGZoomEvent",
"ScrollAreaEvent",
"SecurityPolicyViolationEvent",
"ServicePortConnectEvent",
diff --git a/tests/wpt/web-platform-tests/dom/nodes/Document-createEvent.js b/tests/wpt/web-platform-tests/dom/nodes/Document-createEvent.js
index e55487ada13..56f9bf9ed3d 100644
--- a/tests/wpt/web-platform-tests/dom/nodes/Document-createEvent.js
+++ b/tests/wpt/web-platform-tests/dom/nodes/Document-createEvent.js
@@ -23,8 +23,6 @@ var aliases = {
"ProgressEvent": "ProgressEvent",
"StorageEvent": "StorageEvent",
"SVGEvents": "Event",
- "SVGZoomEvent": "SVGZoomEvent",
- "SVGZoomEvents": "SVGZoomEvent",
"TextEvent": "CompositionEvent",
"TouchEvent": "TouchEvent",
"TrackEvent": "TrackEvent",
diff --git a/tests/wpt/web-platform-tests/dom/nodes/Node-childNodes.html b/tests/wpt/web-platform-tests/dom/nodes/Node-childNodes.html
index 8bd1f250e47..f7586fa74a9 100644
--- a/tests/wpt/web-platform-tests/dom/nodes/Node-childNodes.html
+++ b/tests/wpt/web-platform-tests/dom/nodes/Node-childNodes.html
@@ -90,7 +90,9 @@ test(function() {
assert_equals(list[Symbol.iterator], Array.prototype[Symbol.iterator]);
assert_equals(list.keys, Array.prototype.keys);
- assert_equals(list.values, Array.prototype.values);
+ if (Array.prototype.values) {
+ assert_equals(list.values, Array.prototype.values);
+ }
assert_equals(list.entries, Array.prototype.entries);
assert_equals(list.forEach, Array.prototype.forEach);
}, "Iterator behavior of Node.childNodes");
diff --git a/tests/wpt/web-platform-tests/dom/nodes/Node-contains.html b/tests/wpt/web-platform-tests/dom/nodes/Node-contains.html
index a3d6448664f..c44f072b11f 100644
--- a/tests/wpt/web-platform-tests/dom/nodes/Node-contains.html
+++ b/tests/wpt/web-platform-tests/dom/nodes/Node-contains.html
@@ -27,7 +27,7 @@ testNodes.forEach(function(referenceName) {
} else {
assert_false(reference.contains(other));
}
- }, referenceName + ".compareDocumentPosition(" + otherName + ")");
+ }, referenceName + ".contains(" + otherName + ")");
});
});
diff --git a/tests/wpt/web-platform-tests/dom/nodes/selectors.js b/tests/wpt/web-platform-tests/dom/nodes/selectors.js
index c3e2d909e14..ac722a6fe04 100644
--- a/tests/wpt/web-platform-tests/dom/nodes/selectors.js
+++ b/tests/wpt/web-platform-tests/dom/nodes/selectors.js
@@ -27,7 +27,6 @@ var invalidSelectors = [
{name: "Invalid class", selector: ".foo..quux"},
{name: "Invalid class", selector: ".bar."},
{name: "Invalid combinator", selector: "div & address, p"},
- {name: "Invalid combinator", selector: "div >> address, p"},
{name: "Invalid combinator", selector: "div ++ address, p"},
{name: "Invalid combinator", selector: "div ~~ address, p"},
{name: "Invalid [att=value] selector", selector: "[*=test]"},
@@ -306,6 +305,15 @@ var validSelectors = [
{name: "Descendant combinator, not matching element with id that is not a descendant of an element with id", selector: "#descendant-div1 #descendant-div4", expect: [] /*no matches*/, level: 1, testType: TEST_QSA},
{name: "Descendant combinator, whitespace characters", selector: "#descendant\t\r\n#descendant-div2", expect: ["descendant-div2"], level: 1, testType: TEST_QSA | TEST_MATCH},
+ // - Descendant combinator '>>'
+ {name: "Descendant combinator '>>', matching element that is a descendant of an element with id", selector: "#descendant>>div", expect: ["descendant-div1", "descendant-div2", "descendant-div3", "descendant-div4"], level: 1, testType: TEST_QSA | TEST_MATCH},
+ {name: "Descendant combinator '>>', matching element with id that is a descendant of an element", selector: "body>>#descendant-div1", expect: ["descendant-div1"], exclude: ["detached", "fragment"], level: 1, testType: TEST_QSA | TEST_MATCH},
+ {name: "Descendant combinator '>>', matching element with id that is a descendant of an element", selector: "div>>#descendant-div1", expect: ["descendant-div1"], level: 1, testType: TEST_QSA | TEST_MATCH},
+ {name: "Descendant combinator '>>', matching element with id that is a descendant of an element with id", selector: "#descendant>>#descendant-div2", expect: ["descendant-div2"], level: 1, testType: TEST_QSA | TEST_MATCH},
+ {name: "Descendant combinator '>>', matching element with class that is a descendant of an element with id", selector: "#descendant>>.descendant-div2", expect: ["descendant-div2"], level: 1, testType: TEST_QSA | TEST_MATCH},
+ {name: "Descendant combinator '>>', matching element with class that is a descendant of an element with class", selector: ".descendant-div1>>.descendant-div3", expect: ["descendant-div3"], level: 1, testType: TEST_QSA | TEST_MATCH},
+ {name: "Descendant combinator '>>', not matching element with id that is not a descendant of an element with id", selector: "#descendant-div1>>#descendant-div4", expect: [] /*no matches*/, level: 1, testType: TEST_QSA},
+
// - Child combinator '>'
{name: "Child combinator, matching element that is a child of an element with id", selector: "#child>div", expect: ["child-div1", "child-div4"], level: 2, testType: TEST_QSA | TEST_MATCH},
{name: "Child combinator, matching element with id that is a child of an element", selector: "div>#child-div1", expect: ["child-div1"], level: 2, testType: TEST_QSA | TEST_MATCH},
@@ -669,6 +677,15 @@ var scopedSelectors = [
{name: "Descendant combinator, not matching element with id that is not a descendant of an element with id", selector: "#descendant-div1 #descendant-div4", ctx: "", expect: [] /*no matches*/, level: 1, testType: TEST_FIND},
{name: "Descendant combinator, whitespace characters (1)", selector: "#descendant\t\r\n#descendant-div2", ctx: "", expect: ["descendant-div2"], level: 1, testType: TEST_FIND | TEST_MATCH},
+ // - Descendant combinator '>>'
+ {name: "Descendant combinator '>>', matching element that is a descendant of an element with id (1)", selector: "#descendant>>div", ctx: "", expect: ["descendant-div1", "descendant-div2", "descendant-div3", "descendant-div4"], level: 1, testType: TEST_FIND | TEST_MATCH},
+ {name: "Descendant combinator '>>', matching element with id that is a descendant of an element (1)", selector: "body>>#descendant-div1", ctx: "", expect: ["descendant-div1"], exclude: ["detached", "fragment"], level: 1, testType: TEST_FIND | TEST_MATCH},
+ {name: "Descendant combinator '>>', matching element with id that is a descendant of an element (1)", selector: "div>>#descendant-div1", ctx: "", expect: ["descendant-div1"], level: 1, testType: TEST_FIND | TEST_MATCH},
+ {name: "Descendant combinator '>>', matching element with id that is a descendant of an element with id (1)", selector: "#descendant>>#descendant-div2", ctx: "", expect: ["descendant-div2"], level: 1, testType: TEST_FIND | TEST_MATCH},
+ {name: "Descendant combinator '>>', matching element with class that is a descendant of an element with id (1)", selector: "#descendant>>.descendant-div2", ctx: "", expect: ["descendant-div2"], level: 1, testType: TEST_FIND | TEST_MATCH},
+ {name: "Descendant combinator, '>>', matching element with class that is a descendant of an element with class (1)", selector: ".descendant-div1>>.descendant-div3", ctx: "", expect: ["descendant-div3"], level: 1, testType: TEST_FIND | TEST_MATCH},
+ {name: "Descendant combinator '>>', not matching element with id that is not a descendant of an element with id", selector: "#descendant-div1>>#descendant-div4", ctx: "", expect: [] /*no matches*/, level: 1, testType: TEST_FIND},
+
// - Child combinator '>'
{name: "Child combinator, matching element that is a child of an element with id (1)", selector: "#child>div", ctx: "", expect: ["child-div1", "child-div4"], level: 2, testType: TEST_FIND | TEST_MATCH},
{name: "Child combinator, matching element with id that is a child of an element (1)", selector: "div>#child-div1", ctx: "", expect: ["child-div1"], level: 2, testType: TEST_FIND | TEST_MATCH},
diff --git a/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-appendChild.html b/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-appendChild.html
new file mode 100644
index 00000000000..5b5b5a55df8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-appendChild.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<title>Range mutation tests - appendChild</title>
+<link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
+<meta name=timeout content=long>
+
+<div id=log></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../common.js"></script>
+<script src="Range-mutations.js"></script>
+<script>
+doTests(appendChildTests, function(params) { return params[0] + ".appendChild(" + params[1] + ")" }, testAppendChild);
+testDiv.style.display = "none";
+</script>
diff --git a/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-appendData.html b/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-appendData.html
new file mode 100644
index 00000000000..1d4879d57c1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-appendData.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<title>Range mutation tests - appendData</title>
+<link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
+<meta name=timeout content=long>
+
+<div id=log></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../common.js"></script>
+<script src="Range-mutations.js"></script>
+<script>
+doTests(appendDataTests, function(params) { return params[0] + ".appendData(" + params[1] + ")" }, testAppendData);
+testDiv.style.display = "none";
+</script>
diff --git a/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-dataChange.html b/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-dataChange.html
new file mode 100644
index 00000000000..3683e8bb9bb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-dataChange.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<title>Range mutation tests - update data by IDL attributes</title>
+<link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
+<meta name=timeout content=long>
+
+<div id=log></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../common.js"></script>
+<script src="Range-mutations.js"></script>
+<script>
+doTests(dataChangeTests, function(params) { return params[0] + "." + eval(params[1]) + " " + eval(params[2]) + ' ' + params[3] }, testDataChange);
+testDiv.style.display = "none";
+</script>
diff --git a/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-deleteData.html b/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-deleteData.html
new file mode 100644
index 00000000000..5f2b852f5b1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-deleteData.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<title>Range mutation tests - deleteData</title>
+<link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
+<meta name=timeout content=long>
+
+<div id=log></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../common.js"></script>
+<script src="Range-mutations.js"></script>
+<script>
+doTests(deleteDataTests, function(params) { return params[0] + ".deleteData(" + params[1] + ", " + params[2] + ")" }, testDeleteData);
+testDiv.style.display = "none";
+</script>
diff --git a/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-insertBefore.html b/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-insertBefore.html
new file mode 100644
index 00000000000..c71b239547c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-insertBefore.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<title>Range mutation tests - insertBefore</title>
+<link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
+<meta name=timeout content=long>
+
+<div id=log></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../common.js"></script>
+<script src="Range-mutations.js"></script>
+<script>
+doTests(insertBeforeTests, function(params) { return params[0] + ".insertBefore(" + params[1] + ", " + params[2] + ")" }, testInsertBefore);
+testDiv.style.display = "none";
+</script>
diff --git a/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-insertData.html b/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-insertData.html
new file mode 100644
index 00000000000..fca533d5031
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-insertData.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<title>Range mutation tests - insertData</title>
+<link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
+<meta name=timeout content=long>
+
+<div id=log></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../common.js"></script>
+<script src="Range-mutations.js"></script>
+<script>
+doTests(insertDataTests, function(params) { return params[0] + ".insertData(" + params[1] + ", " + params[2] + ")" }, testInsertData);
+testDiv.style.display = "none";
+</script>
diff --git a/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-removeChild.html b/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-removeChild.html
new file mode 100644
index 00000000000..a8d23812530
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-removeChild.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<title>Range mutation tests - removeChild</title>
+<link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
+<meta name=timeout content=long>
+
+<div id=log></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../common.js"></script>
+<script src="Range-mutations.js"></script>
+<script>
+doTests(removeChildTests, function(params) { return params[0] + ".parentNode.removeChild(" + params[0] + ")" }, testRemoveChild);
+testDiv.style.display = "none";
+</script>
diff --git a/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-replaceChild.html b/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-replaceChild.html
new file mode 100644
index 00000000000..a4ef0c365e6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-replaceChild.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<title>Range mutation tests - replaceChild</title>
+<link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
+<meta name=timeout content=long>
+
+<div id=log></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../common.js"></script>
+<script src="Range-mutations.js"></script>
+<script>
+doTests(replaceChildTests, function(params) { return params[0] + ".replaceChild(" + params[1] + ", " + params[2] + ")" }, testReplaceChild);
+testDiv.style.display = "none";
+</script>
diff --git a/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-replaceData.html b/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-replaceData.html
new file mode 100644
index 00000000000..55ddb146ea2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-replaceData.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<title>Range mutation tests - replaceData</title>
+<link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
+<meta name=timeout content=long>
+
+<div id=log></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../common.js"></script>
+<script src="Range-mutations.js"></script>
+<script>
+doTests(replaceDataTests, function(params) { return params[0] + ".replaceData(" + params[1] + ", " + params[2] + ", " + params[3] + ")" }, testReplaceData);
+testDiv.style.display = "none";
+</script>
diff --git a/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-splitText.html b/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-splitText.html
new file mode 100644
index 00000000000..fbb4c8d9b6d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dom/ranges/Range-mutations-splitText.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<title>Range mutation tests - splitText</title>
+<link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
+<meta name=timeout content=long>
+
+<div id=log></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../common.js"></script>
+<script src="Range-mutations.js"></script>
+<script>
+doTests(splitTextTests, function(params) { return params[0] + ".splitText(" + params[1] + ")" }, testSplitText);
+testDiv.style.display = "none";
+</script>
diff --git a/tests/wpt/web-platform-tests/dom/ranges/Range-mutations.html b/tests/wpt/web-platform-tests/dom/ranges/Range-mutations.js
index ef99ca2ef04..3837de92828 100644
--- a/tests/wpt/web-platform-tests/dom/ranges/Range-mutations.html
+++ b/tests/wpt/web-platform-tests/dom/ranges/Range-mutations.js
@@ -1,13 +1,3 @@
-<!doctype html>
-<title>Range mutation tests</title>
-<link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
-<meta name=timeout content=long>
-
-<div id=log></div>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=../common.js></script>
-<script>
"use strict";
// These tests probably use too much abstraction and too little copy-paste.
@@ -929,22 +919,3 @@ var removeChildTests = [
["foreignDoc.documentElement", "foreignDoc", 0, "foreignDoc", "foreignDoc.childNodes.length"],
];
-
-
-// Finally run everything. All grouped together at the end so that I can
-// easily comment out some of them, so I don't have to wait for all test types
-// to debug only some of them.
-doTests(splitTextTests, function(params) { return params[0] + ".splitText(" + params[1] + ")" }, testSplitText);
-doTests(insertDataTests, function(params) { return params[0] + ".insertData(" + params[1] + ", " + params[2] + ")" }, testInsertData);
-doTests(appendDataTests, function(params) { return params[0] + ".appendData(" + params[1] + ")" }, testAppendData);
-doTests(deleteDataTests, function(params) { return params[0] + ".deleteData(" + params[1] + ", " + params[2] + ")" }, testDeleteData);
-doTests(replaceDataTests, function(params) { return params[0] + ".replaceData(" + params[1] + ", " + params[2] + ", " + params[3] + ")" }, testReplaceData);
-doTests(dataChangeTests, function(params) { return params[0] + "." + eval(params[1]) + " " + eval(params[2]) + ' ' + params[3] }, testDataChange);
-doTests(insertBeforeTests, function(params) { return params[0] + ".insertBefore(" + params[1] + ", " + params[2] + ")" }, testInsertBefore);
-doTests(replaceChildTests, function(params) { return params[0] + ".replaceChild(" + params[1] + ", " + params[2] + ")" }, testReplaceChild);
-doTests(appendChildTests, function(params) { return params[0] + ".appendChild(" + params[1] + ")" }, testAppendChild);
-doTests(removeChildTests, function(params) { return params[0] + ".parentNode.removeChild(" + params[0] + ")" }, testRemoveChild);
-
-
-testDiv.style.display = "none";
-</script>
diff --git a/tests/wpt/web-platform-tests/domparsing/OWNERS b/tests/wpt/web-platform-tests/domparsing/OWNERS
index 8aeebafa5f5..892cbb237fc 100644
--- a/tests/wpt/web-platform-tests/domparsing/OWNERS
+++ b/tests/wpt/web-platform-tests/domparsing/OWNERS
@@ -1,4 +1,2 @@
-@sideshowbarker
@ChrisParis
-@deniak
@jdm
diff --git a/tests/wpt/web-platform-tests/domparsing/createContextualFragment.html b/tests/wpt/web-platform-tests/domparsing/createContextualFragment.html
index ce7d813583c..d81186a9dd6 100644
--- a/tests/wpt/web-platform-tests/domparsing/createContextualFragment.html
+++ b/tests/wpt/web-platform-tests/domparsing/createContextualFragment.html
@@ -119,12 +119,14 @@ var tests = [
["<html> in a different namespace shouldn't be special",
document.createElementNS("http://fake-namespace", "html"), "<body><p>",
document.createElement("div"), "<body><p>"],
+ ["SVG namespace shouldn't be special",
+ document.createElementNS("http://www.w3.org/2000/svg", "div"), "<body><p>",
+ document.createElement("div"), "<body><p>"],
["null should be stringified", document.createElement("span"), null, document.createElement("span"), "null"],
- ["undefined should be stringified", document.createElement("span"), undefined, document.createElement("span"), "undefined"]/*,
- // FIXME: Spec doesn't say what to do about non-Elements!
- ["Text nodes?",
- document.createTextNode("?"), "<span>",
- document.createTextNode("?"), "<span>"]*/
+ ["undefined should be stringified", document.createElement("span"), undefined, document.createElement("span"), "undefined"],
+ ["Text nodes shouldn't be special",
+ document.createTextNode("?"), "<body><p>",
+ document.createElement("div"), "<body><p>"]
];
generate_tests(testEquivalence, tests);
diff --git a/tests/wpt/web-platform-tests/domparsing/innerhtml-02.html b/tests/wpt/web-platform-tests/domparsing/innerhtml-02.html
deleted file mode 100644
index e80c886b6c6..00000000000
--- a/tests/wpt/web-platform-tests/domparsing/innerhtml-02.html
+++ /dev/null
@@ -1,126 +0,0 @@
-<!DOCTYPE html>
-<title>innerHTML in HTML</title>
-<link rel="author" title="Ms2ger" href="mailto:ms2ger@gmail.com">
-<link rel="help" href="http://html5.org/specs/dom-parsing.html#innerhtml">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
-<script>
-var voidElements = [
- "area", "base", "basefont", "bgsound", "br", "col", "command", "embed",
- "frame", "hr", "img", "input", "keygen", "link", "meta", "param", "source",
- "track", "wbr"
-];
-var tests = [
- [
- function() {
- var el = document.createElement("div");
- el.appendChild(document.createElement("xmp"))
- .appendChild(document.createElement("span"))
- .appendChild(document.createTextNode("<"));
- return el;
- },
- "<xmp><span>&lt;<\/span><\/xmp>"
- ],
- [
- function() {
- var el = document.createElement("xmp");
- el.appendChild(document.createElement("span"))
- .appendChild(document.createTextNode("<"));
- return el;
- },
- "<span>&lt;<\/span>"
- ],
- [
- function() {
- var el = document.createElement("xmp");
- el.appendChild(document.createTextNode("<"));
- return el;
- },
- "<"
- ],
- [
- function() {
- var el = document.createElement("div");
- el.appendChild(document.createElement("br"));
- return el;
- },
- "<br>"
- ],
- [
- function() {
- var el = document.createElement("div");
- el.appendChild(document.createElement("input"))
- .appendChild(document.createElement("span"));
- return el;
- },
- "<input>"
- ],
- [
- function() {
- var el = document.createElement("img");
- el.appendChild(document.createElement("div"))
- .appendChild(document.createElement("span"));
- return el.firstChild;
- },
- "<span><\/span>"
- ],
- [
- function() {
- var el = document.createElement("div");
- el.appendChild(document.createElement("style"))
- .appendChild(document.createElement("span"));
- return el;
- },
- "<style><span><\/span><\/style>"
- ],
- [
- function() {
- var el = document.createElement("div");
- el.appendChild(document.createElement("style"))
- .appendChild(document.createTextNode("<"));
- return el;
- },
- "<style><<\/style>"
- ],
- [
- function() {
- var el = document.createElement("div");
- el.appendChild(document.createElement("style"))
- .appendChild(document.createElement("span"))
- .appendChild(document.createTextNode("<"));
- return el;
- },
- "<style><span>&lt;<\/span><\/style>"
- ]
-];
-voidElements.forEach(function(tag) {
- tests.push([
- function() {
- var el = document.createElement(tag);
- el.appendChild(document.createElement("span"));
- return el;
- },
- "<span><\/span>"
- ]);
-});
-["pre", "textarea", "listing"].forEach(function(tag) {
- tests.push([
- function() {
- var el = document.createElement("div");
- el.appendChild(document.createElement(tag))
- .appendChild(document.createTextNode("\nA"));
- return el;
- },
- "<" + tag + ">\n\nA<\/" + tag + ">"
- ]);
-});
-test(function() {
- tests.forEach(function(t) {
- var el = t[0](), expected = t[1];
- test(function() {
- assert_equals(el.innerHTML, expected);
- }, "Expected innerHTML: " + format_value(expected) + " for " + el.localName + ".");
- });
-});
-</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/dpub-aam/OWNERS b/tests/wpt/web-platform-tests/dpub-aam/OWNERS
new file mode 100644
index 00000000000..35ae0f6c00b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dpub-aam/OWNERS
@@ -0,0 +1 @@
+@halindrome
diff --git a/tests/wpt/web-platform-tests/dpub-aam/README.md b/tests/wpt/web-platform-tests/dpub-aam/README.md
new file mode 100644
index 00000000000..ce480494440
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dpub-aam/README.md
@@ -0,0 +1,64 @@
+dpub-aam: Tests for the DPUB-ARIA Accessibility Mapping Recommendation
+======================================================================
+
+The [DPUB ARIA Recommendation](https://www.w3.org/TR/dpub-aam-1.0)
+define extensions to HTML4/5 for support of extended semantics. These
+semantics make it easier for Assistive Technologies to intepret and
+present content to users with varying physical and cognitive abilities.
+
+The purpose of these tests is to help ensure that user agents support the
+requirements of the Recommendation.
+
+The general approach for this testing is to enable both manual and automated
+testing, with a preference for automation.
+
+
+Running Tests
+-------------
+
+In order to run these tests in an automated fashion, you will need to have a
+special Assistive Technology Test Adapter (ATTA) for the platform under test. We will
+provide a list of these for popular platforms here as they are made available.
+
+The ATTA will monitor the window under test via the platforms Accessibility
+Layer, forwarding information about the Accessibility Tree to the running test
+so that it can evaluate support for the various features under test.
+
+The workflow for running these tests is something like:
+
+1. Start up the ATTA for the platform under test.
+2. Start up the test driver window and select the dpub-aam tests to be run
+ (e.g., the DPUB AAM 1.0 tests) - click "Start"
+3. A window pops up that shows a test - the description of which tells the
+ tester what is being tested. In an automated test, the test with proceed
+ without user intervention. In a manual test, some user input may be required
+ in order to stimulate the test.
+4. The test runs. Success or failure is determined and reported to the test
+ driver window, which then cycles to the next test in the sequence.
+5. Repeat steps 2-4 until done.
+6. Download the JSON format report of test results, which can then be visually
+ inspected, reported on using various tools, or passed on to W3C for
+ evaluation and collection in the Implementation Report via github.
+
+**Remember that while these tests are written to help exercise implementations,
+their other (important) purpose is to increase confidence that there are
+interoperable implementations.** So, implementers are the audience, but these
+tests are not meant to be a comprehensive collection of tests for a client that
+might implement the Recommendation.
+
+
+Capturing and Reporting Results
+-------------------------------
+
+As tests are run against implementations, if the results of testing are
+submitted to [test-results](https://github.com/w3c/test-results/) then they will
+be automatically included in documents generated by
+[wptreport](https://www.github.com/w3c/wptreport). The same tool can be used
+locally to view reports about recorded results.
+
+
+Writing Tests
+-------------
+
+If you are interested in writing tests for this environment, see the
+associated [CONTRIBUTING](CONTRIBUTING.md) document.
diff --git a/tests/wpt/web-platform-tests/dpub-aria/OWNERS b/tests/wpt/web-platform-tests/dpub-aria/OWNERS
new file mode 100644
index 00000000000..35ae0f6c00b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dpub-aria/OWNERS
@@ -0,0 +1 @@
+@halindrome
diff --git a/tests/wpt/web-platform-tests/dpub-aria/README.md b/tests/wpt/web-platform-tests/dpub-aria/README.md
new file mode 100644
index 00000000000..b2ffb99fd51
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dpub-aria/README.md
@@ -0,0 +1,64 @@
+dpub-aria: Tests for the DPUB-ARIA Recommendations
+==================================================
+
+The [DPUB ARIA Recommendation](https://www.w3.org/TR/dpub-aria-1.0)
+define extensions to HTML4/5 for support of extended semantics. These
+semantics make it easier for Assistive Technologies to intepret and
+present content to users with varying physical and cognitive abilities.
+
+The purpose of these tests is to help ensure that user agents support the
+requirements of the Recommendation.
+
+The general approach for this testing is to enable both manual and automated
+testing, with a preference for automation.
+
+
+Running Tests
+-------------
+
+In order to run these tests in an automated fashion, you will need to have a
+special Assistive Technology Test Adapter (ATTA) for the platform under test. We will
+provide a list of these for popular platforms here as they are made available.
+
+The ATTA will monitor the window under test via the platforms Accessibility
+Layer, forwarding information about the Accessibility Tree to the running test
+so that it can evaluate support for the various features under test.
+
+The workflow for running these tests is something like:
+
+1. Start up the ATTA for the platform under test.
+2. Start up the test driver window and select the dpub -aria tests to be run
+ (e.g., the DPUB ARIA 1.0 tests) - click "Start"
+3. A window pops up that shows a test - the description of which tells the
+ tester what is being tested. In an automated test, the test with proceed
+ without user intervention. In a manual test, some user input may be required
+ in order to stimulate the test.
+4. The test runs. Success or failure is determined and reported to the test
+ driver window, which then cycles to the next test in the sequence.
+5. Repeat steps 2-4 until done.
+6. Download the JSON format report of test results, which can then be visually
+ inspected, reported on using various tools, or passed on to W3C for
+ evaluation and collection in the Implementation Report via github.
+
+**Remember that while these tests are written to help exercise implementations,
+their other (important) purpose is to increase confidence that there are
+interoperable implementations.** So, implementers are the audience, but these
+tests are not meant to be a comprehensive collection of tests for a client that
+might implement the Recommendation.
+
+
+Capturing and Reporting Results
+-------------------------------
+
+As tests are run against implementations, if the results of testing are
+submitted to [test-results](https://github.com/w3c/test-results/) then they will
+be automatically included in documents generated by
+[wptreport](https://www.github.com/w3c/wptreport). The same tool can be used
+locally to view reports about recorded results.
+
+
+Writing Tests
+-------------
+
+If you are interested in writing tests for this environment, see the
+associated [CONTRIBUTING](CONTRIBUTING.md) document.
diff --git a/tests/wpt/web-platform-tests/editing/other/restoration.html b/tests/wpt/web-platform-tests/editing/other/restoration.html
new file mode 100644
index 00000000000..4c53008b410
--- /dev/null
+++ b/tests/wpt/web-platform-tests/editing/other/restoration.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Restoration of style tests</title>
+<!--
+No spec, based on: https://bugzilla.mozilla.org/show_bug.cgi?id=1250805
+If the user presses Ctrl+B and then hits Enter and then types text, the text
+should still be bold. Hitting Enter shouldn't make it forget. And so too for
+other commands.
+-->
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div contenteditable></div>
+<script>
+var div = document.querySelector("div");
+
+function doTestInner(cmd, param, startBold) {
+ div.innerHTML = startBold ? "<b>foo</b>bar" : "foobar";
+ getSelection().collapse(startBold ? div.firstChild.firstChild
+ : div.firstChild, 3);
+
+ // Set/unset bold, then run command and see if it's still there
+ assert_true(document.execCommand("bold", false, ""),
+ "execCommand needs to return true for bold");
+
+ assert_true(document.execCommand(cmd, false, param),
+ "execCommand needs to return true for " + cmd + " " + param);
+
+ assert_equals(document.queryCommandState("bold"), !startBold,
+ "bold state");
+
+ assert_true(document.execCommand("inserttext", false, "x"),
+ "execCommand needs to return true for inserttext x");
+
+ // Find the new text node and check that it's actually bold (or not)
+ var node = div;
+ while (node) {
+ if (node.nodeType == Node.TEXT_NODE && node.nodeValue.indexOf("x") != -1) {
+ assert_in_array(getComputedStyle(node.parentNode).fontWeight,
+ !startBold ? ["700", "bold"] : ["400", "normal"],
+ "font-weight");
+ return;
+ }
+ if (node.firstChild) {
+ node = node.firstChild;
+ continue;
+ }
+ while (node != div && !node.nextSibling) {
+ node = node.parentNode;
+ }
+ if (node == div) {
+ assert_unreached("x not found!");
+ break;
+ }
+ node = node.nextSibling;
+ }
+}
+
+function doTest(cmd, param) {
+ if (param === undefined) {
+ param = "";
+ }
+
+ test(function() {
+ doTestInner(cmd, param, true);
+ }, cmd + " " + param + " starting bold");
+
+ test(function() {
+ doTestInner(cmd, param, false);
+ }, cmd + " " + param + " starting not bold");
+}
+
+doTest("insertparagraph");
+doTest("insertlinebreak");
+doTest("delete");
+doTest("forwarddelete");
+doTest("insertorderedlist");
+doTest("insertunorderedlist");
+doTest("indent");
+// Outdent does nothing here, but should be harmless.
+doTest("outdent");
+doTest("justifyleft");
+doTest("justifyright");
+doTest("justifycenter");
+doTest("justifyfull");
+doTest("formatblock", "div");
+doTest("formatblock", "blockquote");
+doTest("inserthorizontalrule");
+doTest("insertimage", "a");
+doTest("inserttext", "bar");
+</script>
diff --git a/tests/wpt/web-platform-tests/encoding/OWNERS b/tests/wpt/web-platform-tests/encoding/OWNERS
index 4917e26650a..ec02022aea3 100644
--- a/tests/wpt/web-platform-tests/encoding/OWNERS
+++ b/tests/wpt/web-platform-tests/encoding/OWNERS
@@ -1,2 +1 @@
@inexorabletash
-@sideshowbarker
diff --git a/tests/wpt/web-platform-tests/encoding/single-byte-decoder.html b/tests/wpt/web-platform-tests/encoding/single-byte-decoder.html
index eb463e1add8..6462cd1f79b 100644
--- a/tests/wpt/web-platform-tests/encoding/single-byte-decoder.html
+++ b/tests/wpt/web-platform-tests/encoding/single-byte-decoder.html
@@ -33,7 +33,7 @@
"windows-1252":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,381,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,382,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],
"windows-1253":[8364,129,8218,402,8222,8230,8224,8225,136,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,157,158,159,160,901,902,163,164,165,166,167,168,169,null,171,172,173,174,8213,176,177,178,179,900,181,182,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null],
"windows-1254":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,286,209,210,211,212,213,214,215,216,217,218,219,220,304,350,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,287,241,242,243,244,245,246,247,248,249,250,251,252,305,351,255],
- "windows-1255":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,156,157,158,159,160,161,162,163,8362,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,191,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,null,1467,1468,1469,1470,1471,1472,1473,1474,1475,1520,1521,1522,1523,1524,null,null,null,null,null,null,null,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null],
+ "windows-1255":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,156,157,158,159,160,161,162,163,8362,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,191,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1520,1521,1522,1523,1524,null,null,null,null,null,null,null,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null],
"windows-1256":[8364,1662,8218,402,8222,8230,8224,8225,710,8240,1657,8249,338,1670,1688,1672,1711,8216,8217,8220,8221,8226,8211,8212,1705,8482,1681,8250,339,8204,8205,1722,160,1548,162,163,164,165,166,167,168,169,1726,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,1563,187,188,189,190,1567,1729,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,215,1591,1592,1593,1594,1600,1601,1602,1603,224,1604,226,1605,1606,1607,1608,231,232,233,234,235,1609,1610,238,239,1611,1612,1613,1614,244,1615,1616,247,1617,249,1618,251,252,8206,8207,1746],
"windows-1257":[8364,129,8218,131,8222,8230,8224,8225,136,8240,138,8249,140,168,711,184,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,175,731,159,160,null,162,163,164,null,166,167,216,169,342,171,172,173,174,198,176,177,178,179,180,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,729],
"windows-1258":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,258,196,197,198,199,200,201,202,203,768,205,206,207,272,209,777,211,212,416,214,215,216,217,218,219,220,431,771,223,224,225,226,259,228,229,230,231,232,233,234,235,769,237,238,239,273,241,803,243,244,417,246,247,248,249,250,251,252,432,8363,255],
diff --git a/tests/wpt/web-platform-tests/encoding/textdecoder-fatal-single-byte.html b/tests/wpt/web-platform-tests/encoding/textdecoder-fatal-single-byte.html
index 74bad255daf..d9bf412826f 100644
--- a/tests/wpt/web-platform-tests/encoding/textdecoder-fatal-single-byte.html
+++ b/tests/wpt/web-platform-tests/encoding/textdecoder-fatal-single-byte.html
@@ -28,7 +28,7 @@ var singleByteEncodings = [
{encoding: 'windows-1252', bad: []},
{encoding: 'windows-1253', bad: [0xAA, 0xD2, 0xFF]},
{encoding: 'windows-1254', bad: []},
- {encoding: 'windows-1255', bad: [0xCA, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xFB, 0xFC, 0xFF]},
+ {encoding: 'windows-1255', bad: [0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xFB, 0xFC, 0xFF]},
{encoding: 'windows-1256', bad: []},
{encoding: 'windows-1257', bad: [0xA1, 0xA5]},
{encoding: 'windows-1258', bad: []},
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-clear-key-invalid-license.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-clear-key-invalid-license.html
index 4061c4fd512..f145dfad77e 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-clear-key-invalid-license.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-clear-key-invalid-license.html
@@ -4,8 +4,11 @@
<head>
<title>Invalid Clear Key License.</title>
<script src="encrypted-media-utils.js"></script>
+<!--
+ Test has been migrated to the root directory and is being disabled here.
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+-->
</head>
<body>
<div id="log"></div>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-clearkey-update-non-ascii-input.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-clearkey-update-non-ascii-input.html
index f9d00f904ab..cf237a7da8e 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-clearkey-update-non-ascii-input.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-clearkey-update-non-ascii-input.html
@@ -4,8 +4,11 @@
<head>
<title>Test Clear Key handling of non-ASCII responses for update().</title>
<script src="encrypted-media-utils.js"></script>
+<!--
+ Test has been migrated to the root directory and is being disabled here.
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+-->
</head>
<body>
<div id="log"></div>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses-multiple-sessions.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses-multiple-sessions.html
index 26bc02328d5..3ee4e8c542d 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses-multiple-sessions.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses-multiple-sessions.html
@@ -4,8 +4,11 @@
<head>
<title>Verify MediaKeySession.keyStatuses with multiple sessions</title>
<script src="encrypted-media-utils.js"></script>
+<!--
+ Test has been migrated to the root directory and is being disabled here.
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+-->
</head>
<body>
<div id="log"></div>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses-multiple-updates.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses-multiple-updates.html
index 514109d04fc..809045d99e5 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses-multiple-updates.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses-multiple-updates.html
@@ -4,8 +4,11 @@
<head>
<title>Verify MediaKeySession.keyStatuses with multiple updates</title>
<script src="encrypted-media-utils.js"></script>
+<!--
+ Test has been migrated to the root directory and is being disabled here.
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+-->
</head>
<body>
<div id="log"></div>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-onencrypted.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-onencrypted.html
index 01d140454a4..ad408f0f313 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-onencrypted.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-onencrypted.html
@@ -4,8 +4,11 @@
<head>
<title>onencrypted</title>
<script src="encrypted-media-utils.js"></script>
+<!--
+ Test has been migrated to the root directory and is being disabled here.
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+-->
</head>
<body>
<video id="testVideo" controls></video>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-playback-encrypted-and-clear-sources.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-encrypted-and-clear-sources.html
index 4d0acda5b5a..495ba418803 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-playback-encrypted-and-clear-sources.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-encrypted-and-clear-sources.html
@@ -4,8 +4,11 @@
<head>
<title>Multiple playbacks alternating between encrypted and clear sources.</title>
<script src="encrypted-media-utils.js"></script>
+<!--
+ Test has been migrated to the root directory and is being disabled here.
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+-->
</head>
<body>
<video id="testVideo"></video>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-multiple-sessions.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-multiple-sessions.html
index 2a4adc340dd..8bf94e13c9d 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-multiple-sessions.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-multiple-sessions.html
@@ -4,8 +4,11 @@
<head>
<title>Clear Key Playback with Multiple Sessions</title>
<script src="encrypted-media-utils.js"></script>
+<!--
+ Test has been migrated to the root directory and is being disabled here.
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+-->
</head>
<body>
<video id="testVideo"></video>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-requestmediakeysystemaccess.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-requestmediakeysystemaccess.html
index 68002d2a808..456f37f5774 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-requestmediakeysystemaccess.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-requestmediakeysystemaccess.html
@@ -4,8 +4,11 @@
<head>
<title>Test navigator.requestMediaKeySystemAccess()</title>
<script src="encrypted-media-utils.js"></script>
+<!--
+ Test has been migrated to the root directory and is being disabled here.
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+-->
</head>
<body>
<div id="log"></div>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-reset-src-after-setmediakeys.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-reset-src-after-setmediakeys.html
index dc2c1d53324..15c91a001c3 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-reset-src-after-setmediakeys.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-reset-src-after-setmediakeys.html
@@ -4,8 +4,11 @@
<head>
<title>Reset src after setMediaKeys()</title>
<script src="encrypted-media-utils.js"></script>
+<!--
+ Test has been migrated to the root directory and is being disabled here.
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+-->
</head>
<body>
<video id="testVideo"></video>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-session-closed-event.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-session-closed-event.html
index 6f817f7b3e5..577047a251d 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-session-closed-event.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-session-closed-event.html
@@ -4,8 +4,11 @@
<head>
<title>Test MediaKeySession closed event</title>
<script src="encrypted-media-utils.js"></script>
+<!--
+ Test has been migrated to the root directory and is being disabled here.
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+-->
</head>
<body>
<div id="log"></div>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-setmediakeys-again-after-playback.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-again-after-playback.html
index 2106c937781..29f53b31d7a 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-setmediakeys-again-after-playback.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-again-after-playback.html
@@ -4,8 +4,11 @@
<head>
<title>setMediaKeys() again after playback</title>
<script src="encrypted-media-utils.js"></script>
+<!--
+ Test has been migrated to the root directory and is being disabled here.
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+-->
</head>
<body>
<video id="testVideo"></video>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-setmediakeys-again-after-resetting-src.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-again-after-resetting-src.html
index ed7f2370271..8f6891b79c1 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-setmediakeys-again-after-resetting-src.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-again-after-resetting-src.html
@@ -4,8 +4,11 @@
<head>
<title>setMediaKeys() again after resetting src</title>
<script src="encrypted-media-utils.js"></script>
+<!--
+ Test has been migrated to the root directory and is being disabled here.
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+-->
</head>
<body>
<video id="testVideo"></video>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-setmediakeys-at-same-time.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-at-same-time.html
index 62c63652969..01fd7b19402 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-setmediakeys-at-same-time.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-at-same-time.html
@@ -4,8 +4,11 @@
<head>
<title>Set MediaKeys multiple times in parallel</title>
<script src="encrypted-media-utils.js"></script>
+<!--
+ Test has been migrated to the root directory and is being disabled here.
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+-->
</head>
<body>
<video id="video"></video>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-setmediakeys-multiple-times-with-different-mediakeys.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-multiple-times-with-different-mediakeys.html
index bea28d0e176..31cc6107964 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-setmediakeys-multiple-times-with-different-mediakeys.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-multiple-times-with-different-mediakeys.html
@@ -4,8 +4,11 @@
<head>
<title>setMediaKeys() multiple times with different MediaKeys.</title>
<script src="encrypted-media-utils.js"></script>
+<!--
+ Test has been migrated to the root directory and is being disabled here.
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+-->
</head>
<body>
<video id="video"></video>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-setmediakeys-multiple-times-with-the-same-mediakeys.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-multiple-times-with-the-same-mediakeys.html
index 93af8cceb7c..64ed315e0c9 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-setmediakeys-multiple-times-with-the-same-mediakeys.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-multiple-times-with-the-same-mediakeys.html
@@ -4,8 +4,11 @@
<head>
<title>setMediaKeys() multiple times with the same MediaKeys.</title>
<script src="encrypted-media-utils.js"></script>
+<!--
+ Test has been migrated to the root directory and is being disabled here.
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+-->
</head>
<body>
<video id="video"></video>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-setmediakeys-to-multiple-video-elements.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-to-multiple-video-elements.html
index 38c11ee74ef..fb8386e8cff 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-setmediakeys-to-multiple-video-elements.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-to-multiple-video-elements.html
@@ -4,8 +4,11 @@
<head>
<title>setMediaKeys() on multiple video elements.</title>
<script src="encrypted-media-utils.js"></script>
+<!--
+ Test has been migrated to the root directory and is being disabled here.
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+-->
</head>
<body>
<video id="video1"></video>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-setmediakeys.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys.html
index 5374c9a65c4..96b0fed974f 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-setmediakeys.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys.html
@@ -4,8 +4,11 @@
<head>
<title>setMediaKeys</title>
<script src="encrypted-media-utils.js"></script>
+<!--
+ Test has been migrated to the root directory and is being disabled here.
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+-->
</head>
<body>
<video id="video"></video>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-syntax.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-syntax.html
index 0c960c86184..5c4c667cb99 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-syntax.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-syntax.html
@@ -4,8 +4,11 @@
<head>
<title>Test EME syntax</title>
<script src="encrypted-media-utils.js"></script>
+<!--
+ Test has been migrated to the root directory and is being disabled here.
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+-->
</head>
<body>
<script>
@@ -515,6 +518,9 @@
assert_equals(typeof mediaKeySession.close, 'function');
assert_equals(typeof mediaKeySession.remove, 'function');
assert_equals(mediaKeySession.sessionId, '');
+ assert_equals(typeof mediaKeySession.onopen, 'undefined');
+ assert_equals(typeof mediaKeySession.onclose, 'undefined');
+ assert_equals(typeof mediaKeySession.onerror, 'undefined');
}
async_test(function(test)
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-unique-origin.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-unique-origin.html
index 83bd6b50d16..ffb67679f11 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-unique-origin.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-unique-origin.html
@@ -3,8 +3,11 @@
<html>
<head>
<title>Unique origin is unable to create MediaKeys</title>
+<!--
+ Test has been migrated to the root directory and is being disabled here.
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+-->
</head>
<body>
<div id="log"></div>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-update-disallowed-input.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-update-disallowed-input.html
index 58064ddde97..e829a885c65 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-update-disallowed-input.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-update-disallowed-input.html
@@ -4,8 +4,11 @@
<head>
<title>Test handling of invalid responses for update().</title>
<script src="encrypted-media-utils.js"></script>
+<!--
+ Test has been migrated to the root directory and is being disabled here.
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+-->
</head>
<body>
<div id="log"></div>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-utils.js b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-utils.js
index 5fbcdf689a5..5fbcdf689a5 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-utils.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-utils.js
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-waiting-for-a-key.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-waiting-for-a-key.html
index 3469b159ad0..2af37cfb9af 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/encrypted-media-waiting-for-a-key.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-waiting-for-a-key.html
@@ -4,8 +4,11 @@
<head>
<title>Waiting for a key.</title>
<script src="encrypted-media-utils.js"></script>
+<!--
+ Test has been migrated to the root directory and is being disabled here.
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+-->
</head>
<body>
<video id="testVideo"></video>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-events-session-closed-event.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-events-session-closed-event.html
new file mode 100644
index 00000000000..ddf3ecbbbf7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-events-session-closed-event.html
@@ -0,0 +1,40 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions - Test MediaKeySession closed event with Clear Key, mp4</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/events-session-closed-event.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <script>
+ var keysystem = 'org.w3.clearkey',
+ contentItem = content['mp4-basic'],
+ config = {
+ keysystem: keysystem,
+ content: contentItem,
+ initDataType: 'keyids',
+ initData: getInitData(contentItem,'keyids'),
+ audioType: contentItem.audio.type,
+ videoType: contentItem.video.type
+ };
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-events.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-events.html
index 31bcc40636f..4f3b6222b86 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/clearkey-events.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-events.html
@@ -31,10 +31,11 @@
getSupportedContent( 'org.w3.clearkey' )
.then( function( contents )
{
- var handler = new MessageHandler( 'org.w3.clearkey', contents[ 0 ] );
+ var content = contents.filter(function(content) { return content.keys; })[0],
+ handler = new MessageHandler( 'org.w3.clearkey', content );
runTest( { keysystem: 'org.w3.clearkey',
- content: contents[ 0 ],
+ content: content,
messagehandler: handler.messagehandler,
} );
} );
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-invalid-license.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-invalid-license.html
new file mode 100644
index 00000000000..09ff934a04d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-invalid-license.html
@@ -0,0 +1,31 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: Test handling of invalid Clear Key license</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/invalid-license.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <script>
+ var config = {
+ keysystem: 'org.w3.clearkey'
+ };
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-keystatuses-multiple-sessions.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-keystatuses-multiple-sessions.html
index 0d6086d3851..3474f9d5151 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/clearkey-keystatuses-multiple-sessions.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-keystatuses-multiple-sessions.html
@@ -33,7 +33,7 @@
.then( function( contents ) {
// Select a content item with multiple keys
- var contentitem = contents.filter( function( item ) { return item.keys.length > 1; } )[ 0 ],
+ var contentitem = contents.filter( function( item ) { return item.keys && item.keys.length > 1; } )[ 0 ],
handler = new MessageHandler( 'org.w3.clearkey', contentitem );
var config = { keysystem: 'org.w3.clearkey',
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-keystatuses.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-keystatuses.html
index 4fad37e5eb7..6edec35cd02 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/clearkey-keystatuses.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-keystatuses.html
@@ -33,7 +33,7 @@
.then( function( contents ) {
// Select a content item with multiple keys
- var contentitem = contents.filter( function( item ) { return item.keys.length > 1; } )[ 0 ];
+ var contentitem = contents.filter( function( item ) { return item.keys && item.keys.length > 1; } )[ 0 ];
var handler = new MessageHandler( 'org.w3.clearkey', contentitem );
var config = { keysystem: 'org.w3.clearkey',
content: contentitem,
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-clear-encrypted.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-clear-encrypted.html
new file mode 100644
index 00000000000..9eca41cc08b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-clear-encrypted.html
@@ -0,0 +1,53 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: Successful Playback, Temporary session with Clear Key, mp4, clear then encrypted</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for Clear Key keysystem -->
+ <script src=/encrypted-media/util/clearkey-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/playback-temporary.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var contentitem = content['mp4-clear-encrypted'],
+ handler = new MessageHandler('org.w3.clearkey', contentitem),
+ config = { video: document.getElementById('videoelement'),
+ keysystem: 'org.w3.clearkey',
+ messagehandler: handler.messagehandler,
+ audioPath: contentitem.audio.path,
+ videoPath: contentitem.video.path,
+ audioType: contentitem.audio.type,
+ videoType: contentitem.video.type,
+ initDataType: 'keyids',
+ initData: getInitData(contentitem, 'keyids'),
+ duration: 4,
+ testcase: 'single key, clear then encrypted content' };
+
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-encrypted-clear-sources.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-encrypted-clear-sources.html
new file mode 100644
index 00000000000..884d22d7577
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-encrypted-clear-sources.html
@@ -0,0 +1,59 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <meta name="timeout" content="long">
+ <title>Encrypted Media Extensions: Successful Playback, alternate Encrypted and Clear playbacks, Temporary, mp4, Clear Key</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for Clear Key keysystem -->
+ <script src=/encrypted-media/util/clearkey-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/playback-temporary-encrypted-clear-sources.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var encryptedcontentitem = content['mp4-basic'],
+ clearcontentitem = content['mp4-clear'],
+ handler = new MessageHandler('org.w3.clearkey', encryptedcontentitem),
+ configEncrypted = { video: document.getElementById('videoelement'),
+ keysystem: 'org.w3.clearkey',
+ messagehandler: handler.messagehandler,
+ audioPath: encryptedcontentitem.audio.path,
+ videoPath: encryptedcontentitem.video.path,
+ audioType: encryptedcontentitem.audio.type,
+ videoType: encryptedcontentitem.video.type,
+ initDataType: 'keyids',
+ initData: getInitData(encryptedcontentitem, 'keyids'),
+ },
+ configClear = { audioPath: clearcontentitem.audio.path,
+ videoPath: clearcontentitem.video.path,
+ audioType: clearcontentitem.audio.type,
+ videoType: clearcontentitem.video.type,
+ };
+
+ runTest(configEncrypted,configClear);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-encrypted-clear.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-encrypted-clear.html
new file mode 100644
index 00000000000..1e190246372
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-encrypted-clear.html
@@ -0,0 +1,53 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: Successful Playback, Temporary session with Clear Key, mp4, encrypted then clear</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for Clear Key keysystem -->
+ <script src=/encrypted-media/util/clearkey-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/playback-temporary.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var contentitem = content['mp4-encrypted-clear'],
+ handler = new MessageHandler('org.w3.clearkey', contentitem),
+ config = { video: document.getElementById('videoelement'),
+ keysystem: 'org.w3.clearkey',
+ messagehandler: handler.messagehandler,
+ audioPath: contentitem.audio.path,
+ videoPath: contentitem.video.path,
+ audioType: contentitem.audio.type,
+ videoType: contentitem.video.type,
+ initDataType: 'keyids',
+ initData: getInitData(contentitem, 'keyids'),
+ duration: 4,
+ testcase: 'single key, encrypted then clear content' };
+
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-multikey-sequential-readyState.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-multikey-sequential-readyState.html
new file mode 100644
index 00000000000..66313e727e1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-multikey-sequential-readyState.html
@@ -0,0 +1,55 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <meta name="timeout" content="long">
+ <title>Encrypted Media Extensions: Successful Playback, Temporary session with Clear Key, mp4, multiple keys in sequence, check readyState</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for Clear Key keysystem -->
+ <script src=/encrypted-media/util/clearkey-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/playback-temporary-multikey-sequential.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var contentitem = content['mp4-multikey-sequential'],
+ handler = new MessageHandler('org.w3.clearkey', contentitem),
+ config = { video: document.getElementById('videoelement'),
+ keysystem: 'org.w3.clearkey',
+ messagehandler: handler.messagehandler,
+ audioPath: contentitem.audio.path,
+ videoPath: contentitem.video.path,
+ audioType: contentitem.audio.type,
+ videoType: contentitem.video.type,
+ initDataType: 'keyids',
+ initData: getMultikeyInitDatas(contentitem, 'keyids'),
+ duration: 5,
+ checkReadyState: true
+ };
+
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-multikey-sequential.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-multikey-sequential.html
new file mode 100644
index 00000000000..64b00cd2902
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-multikey-sequential.html
@@ -0,0 +1,54 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <meta name="timeout" content="long">
+ <title>Encrypted Media Extensions: Successful Playback, Temporary session with Clear Key, mp4, multiple keys in sequence</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for Clear Key keysystem -->
+ <script src=/encrypted-media/util/clearkey-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/playback-temporary-multikey-sequential.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var contentitem = content['mp4-multikey-sequential'],
+ handler = new MessageHandler( 'org.w3.clearkey', contentitem ),
+ config = { video: document.getElementById('videoelement'),
+ keysystem: 'org.w3.clearkey',
+ messagehandler: handler.messagehandler,
+ audioPath: contentitem.audio.path,
+ videoPath: contentitem.video.path,
+ audioType: contentitem.audio.type,
+ videoType: contentitem.video.type,
+ initDataType: 'keyids',
+ initData: getMultikeyInitDatas(contentitem,'keyids'),
+ duration: 5
+ };
+
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-requestmediakeysystemaccess.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-requestmediakeysystemaccess.html
new file mode 100644
index 00000000000..f8402c99a56
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-requestmediakeysystemaccess.html
@@ -0,0 +1,40 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <meta name="timeout" content="long">
+ <title>Encrypted Media Extensions: requestMediaKeySystemAccess tests, Clear Key</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/requestmediakeysystemaccess.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <script>
+ var contentitem = content['mp4-basic'],
+ config = { keysystem: 'org.w3.clearkey',
+ audioType: contentitem.audio.type,
+ videoType: contentitem.video.type,
+ initDataType: 'keyids'
+ };
+
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-reset-src-after-setmediakeys.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-reset-src-after-setmediakeys.html
new file mode 100644
index 00000000000..61da9d86743
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-reset-src-after-setmediakeys.html
@@ -0,0 +1,47 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions - Reset MediaSource after setMediaKeys for Clear Key, mp4</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/reset-src-after-setmediakeys.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var contentItem = content['mp4-av-multikey'],
+ config = {
+ video: document.getElementById('videoelement'),
+ keysystem: 'org.w3.clearkey',
+ content: contentItem,
+ initDataType: 'keyids',
+ initData: getInitData(contentItem,'keyids'),
+ audioType: contentItem.audio.type,
+ videoType: contentItem.video.type,
+ audioPath: contentItem.audio.path,
+ videoPath: contentItem.video.path,
+ };
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-again-after-playback.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-again-after-playback.html
new file mode 100644
index 00000000000..697cf207cfb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-again-after-playback.html
@@ -0,0 +1,53 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: setMediaKeys again after playback with Clear Key</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for Clear Key -->
+ <script src=/encrypted-media/util/clearkey-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/setmediakeys-again-after-playback.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var contentitem = content['mp4-basic'],
+ handler = new MessageHandler('org.w3.clearkey', contentitem);
+ getSupportedContent('org.w3.clearkey').then( function(contents) {
+ runTest( { video: document.getElementById('videoelement'),
+ keysystem: 'org.w3.clearkey',
+ messagehandler: handler.messagehandler,
+ content: contentitem,
+ audioPath: contentitem.audio.path,
+ videoPath: contentitem.video.path,
+ audioType: contentitem.audio.type,
+ videoType: contentitem.video.type,
+ initDataType: 'keyids',
+ initData: getInitData(contentitem, 'keyids')
+ } );
+ } );
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-again-after-resetting-src.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-again-after-resetting-src.html
new file mode 100644
index 00000000000..d695445ef1f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-again-after-resetting-src.html
@@ -0,0 +1,53 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: setMediaKeys again after resetting src attribute on video element with Clear Key</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for Clear Key -->
+ <script src=/encrypted-media/util/clearkey-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/setmediakeys-again-after-resetting-src.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var contentitem = content['mp4-basic'],
+ handler = new MessageHandler('org.w3.clearkey', contentitem );
+ getSupportedContent( 'org.w3.clearkey' ).then( function( contents ) {
+ runTest( { video: document.getElementById('videoelement'),
+ keysystem: 'org.w3.clearkey',
+ messagehandler: handler.messagehandler,
+ content: contentitem,
+ audioPath: contentitem.audio.path,
+ videoPath: contentitem.video.path,
+ audioType: contentitem.audio.type,
+ videoType: contentitem.video.type,
+ initDataType: 'keyids',
+ initData: getInitData(contentitem,'keyids')
+ } );
+ } );
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-at-same-time.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-at-same-time.html
new file mode 100644
index 00000000000..91e6b9ec3f3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-at-same-time.html
@@ -0,0 +1,43 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: setMediaKeys multiple at same time with Clear Key</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for Clear Key -->
+ <script src=/encrypted-media/util/clearkey-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/setmediakeys-at-same-time.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ getSupportedContent( 'org.w3.clearkey' ).then( function( contents ) {
+ runTest( { video: document.getElementById('videoelement'),
+ keysystem: 'org.w3.clearkey',
+ content: contents[ 0 ]
+ } );
+ } );
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-multiple-times-with-different-mediakeys.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-multiple-times-with-different-mediakeys.html
new file mode 100644
index 00000000000..064d7ed05c1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-multiple-times-with-different-mediakeys.html
@@ -0,0 +1,49 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: setMediaKeys multiple times with different mediakeys with Clear Key</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for Clear Key -->
+ <script src=/encrypted-media/util/clearkey-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/setmediakeys-multiple-times-with-different-mediakeys.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var contentitem = content['mp4-basic'];
+ getSupportedContent( 'org.w3.clearkey' ).then( function( contents ) {
+ runTest( { video: document.getElementById('videoelement'),
+ keysystem: 'org.w3.clearkey',
+ content: contentitem,
+ audioPath: contentitem.audio.path,
+ videoPath: contentitem.video.path,
+ audioType: contentitem.audio.type,
+ videoType: contentitem.video.type
+ } );
+ } );
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-multiple-times-with-the-same-mediakeys.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-multiple-times-with-the-same-mediakeys.html
new file mode 100644
index 00000000000..9e383afc3cc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-multiple-times-with-the-same-mediakeys.html
@@ -0,0 +1,49 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: setMediaKeys multiple times with the same mediakeys with Clear Key</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for Clear Key -->
+ <script src=/encrypted-media/util/clearkey-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/setmediakeys-multiple-times-with-the-same-mediakeys.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var contentitem = content['mp4-basic'];
+ getSupportedContent( 'org.w3.clearkey' ).then( function( contents ) {
+ runTest( { video: document.getElementById('videoelement'),
+ keysystem: 'org.w3.clearkey',
+ content: contentitem,
+ audioPath: contentitem.audio.path,
+ videoPath: contentitem.video.path,
+ audioType: contentitem.audio.type,
+ videoType: contentitem.video.type
+ } );
+ } );
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-to-multiple-video-elements.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-to-multiple-video-elements.html
new file mode 100644
index 00000000000..cf73b8085c6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys-to-multiple-video-elements.html
@@ -0,0 +1,47 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: setMediaKeys to multiple video elements with Clear Key</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for Clear Key -->
+ <script src=/encrypted-media/util/clearkey-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/setmediakeys-to-multiple-video-elements.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video1'>
+ <video id="videoelement1" width="200px"></video>
+ </div>
+ <div id='video2'>
+ <video id="videoelement2" width="200px"></video>
+ </div>
+
+ <script>
+ getSupportedContent( 'org.w3.clearkey' ).then( function( contents ) {
+ runTest( { video1: document.getElementById('videoelement1'),
+ video2: document.getElementById('videoelement2'),
+ keysystem: 'org.w3.clearkey',
+ content: contents[ 0 ]
+ } );
+ } );
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys.html
new file mode 100644
index 00000000000..2865052c65d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-setmediakeys.html
@@ -0,0 +1,43 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: setMediaKeys with Clear Key</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for Clear Key -->
+ <script src=/encrypted-media/util/clearkey-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/setmediakeys.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ getSupportedContent( 'org.w3.clearkey' ).then( function( contents ) {
+ runTest( { video: document.getElementById('videoelement'),
+ keysystem: 'org.w3.clearkey',
+ content: contents[ 0 ]
+ } );
+ } );
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-syntax-mediakeys.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-syntax-mediakeys.html
new file mode 100644
index 00000000000..6b4a08a9171
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-syntax-mediakeys.html
@@ -0,0 +1,42 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions - Test MediaKeys attribute, setServerCertificate and setServerCertificate exception syntax for Clear Key, mp4</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/syntax-mediakeys.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+ <script>
+ var contentItem = content['mp4-basic'],
+ config = {
+ keysystem: 'org.w3.clearkey',
+ content: contentItem,
+ initDataType: 'keyids',
+ initData: getInitData(contentItem, 'keyids'),
+ audioType: contentItem.audio.type,
+ videoType: contentItem.video.type
+ };
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-syntax-mediakeysession.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-syntax-mediakeysession.html
new file mode 100644
index 00000000000..2748c31a57f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-syntax-mediakeysession.html
@@ -0,0 +1,42 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions - Test MediaKeySession attribute and function syntax for Clear Key, mp4</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/syntax-mediakeysession.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+ <script>
+ var contentItem = content['mp4-basic'],
+ config = {
+ keysystem: 'org.w3.clearkey',
+ content: contentItem,
+ initDataType: 'keyids',
+ initData: getInitData(contentItem, 'keyids'),
+ audioType: contentItem.audio.type,
+ videoType: contentItem.video.type
+ };
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-syntax-mediakeysystemaccess.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-syntax-mediakeysystemaccess.html
new file mode 100644
index 00000000000..22e72ccc82d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-syntax-mediakeysystemaccess.html
@@ -0,0 +1,42 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions - Test navigator.requestmediakeysystemaccess exception and MediaKeySystemAccess attribute syntax for Clear Key, mp4</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/syntax-mediakeysystemaccess.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+ <script>
+ var contentItem = content['mp4-basic'],
+ config = {
+ keysystem: 'org.w3.clearkey',
+ content: contentItem,
+ initDataType: 'keyids',
+ initData: getInitData(contentItem, 'keyids'),
+ audioType: contentItem.audio.type,
+ videoType: contentItem.video.type
+ };
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-unique-origin.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-unique-origin.html
new file mode 100644
index 00000000000..2871862dd40
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-unique-origin.html
@@ -0,0 +1,43 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: Unique origin with Clear Key, mp4</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/unique-origin.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var contentItem = content['mp4-av-multikey'],
+ config = {
+ video: document.getElementById('videoelement'),
+ keysystem: 'org.w3.clearkey',
+ initDataType: contentItem.initDataType,
+ audioType: contentItem.audio.type,
+ videoType: contentItem.video.type,
+ audioPath: contentItem.audio.path,
+ videoPath: contentItem.video.path
+ };
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-update-disallowed-input.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-update-disallowed-input.html
new file mode 100644
index 00000000000..e5061a76542
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-update-disallowed-input.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions - Test handling of invalid responses for update() for Clear Key, mp4</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/update-disallowed-input.js></script>
+
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var config = {
+ keysystem: 'org.w3.clearkey',
+ };
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-waiting-for-a-key.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-waiting-for-a-key.html
new file mode 100644
index 00000000000..2876a54a479
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-mp4-waiting-for-a-key.html
@@ -0,0 +1,52 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions - Waiting for a key for Clear Key, mp4</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+
+ <!-- Message handler for DRM servers -->
+ <script src=/encrypted-media/util/clearkey-messagehandler.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/waiting-for-a-key.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var contentItem = content['mp4-basic'],
+ handler = new MessageHandler('org.w3.clearkey', contentItem),
+ config = {
+ video: document.getElementById('videoelement'),
+ keysystem: 'org.w3.clearkey',
+ content: contentItem,
+ messageHandler: handler.messagehandler,
+ initDataType: 'keyids',
+ initData: getInitData(contentItem, 'keyids'),
+ audioType: contentItem.audio.type,
+ videoType: contentItem.video.type,
+ audioPath: contentItem.audio.path,
+ videoPath: contentItem.video.path,
+ };
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/clearkey-update-non-ascii-input.html b/tests/wpt/web-platform-tests/encrypted-media/clearkey-update-non-ascii-input.html
new file mode 100644
index 00000000000..cc134729140
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/clearkey-update-non-ascii-input.html
@@ -0,0 +1,36 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: Test Clear Key handling of non-ASCII responses for update()</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/clearkey-update-non-ascii-input.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <script>
+ var contentItem = content['mp4-basic'],
+ config = {
+ keysystem: 'org.w3.clearkey',
+ content: contentItem,
+ initDataType: "keyids"
+ };
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/content/content-metadata.js b/tests/wpt/web-platform-tests/encrypted-media/content/content-metadata.js
index 31c6e3d6c60..8ba5bcf06c2 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/content/content-metadata.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/content/content-metadata.js
@@ -1,5 +1,14 @@
content = addMemberListToObject( {
- 'mp4-basic' : { initDataType: 'cenc',
+
+ 'mp4-clear' : { initDataType: 'cenc',
+ audio : { type: 'audio/mp4;codecs="mp4a.40.2"',
+ path: '/encrypted-media/content/audio_aac-lc_128k_dashinit.mp4' },
+ video : { type: 'video/mp4;codecs="avc1.4d401e"',
+ path: '/encrypted-media/content/video_512x288_h264-360k_clear_dashinit.mp4' }
+ },
+
+ 'mp4-basic' : { assetId: 'mp4-basic',
+ initDataType: 'cenc',
audio : { type: 'audio/mp4;codecs="mp4a.40.2"',
path: '/encrypted-media/content/audio_aac-lc_128k_dashinit.mp4' },
video : { type: 'video/mp4;codecs="avc1.4d401e"',
@@ -10,7 +19,35 @@ content = addMemberListToObject( {
initData: 'AAAAcXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAFEIARIQrRP56ivmmLh19QSo48zqZBoIY2FzdGxhYnMiKGV5SmhjM05sZEVsa0lqb2laVzFsTFhSbGMzUXRjMmx1WjJ4bEluMD0yB2RlZmF1bHQAAAMacHNzaAAAAACaBPB5mEBChquS5lvgiF+VAAAC+voCAAABAAEA8AI8AFcAUgBNAEgARQBBAEQARQBSACAAeABtAGwAbgBzAD0AIgBoAHQAdABwADoALwAvAHMAYwBoAGUAbQBhAHMALgBtAGkAYwByAG8AcwBvAGYAdAAuAGMAbwBtAC8ARABSAE0ALwAyADAAMAA3AC8AMAAzAC8AUABsAGEAeQBSAGUAYQBkAHkASABlAGEAZABlAHIAIgAgAHYAZQByAHMAaQBvAG4APQAiADQALgAwAC4AMAAuADAAIgA+ADwARABBAFQAQQA+ADwAUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEUAWQBMAEUATgA+ADEANgA8AC8ASwBFAFkATABFAE4APgA8AEEATABHAEkARAA+AEEARQBTAEMAVABSADwALwBBAEwARwBJAEQAPgA8AC8AUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEkARAA+ADYAdgBrAFQAcgBlAFkAcgB1AEoAaAAxADkAUQBTAG8ANAA4AHoAcQBaAEEAPQA9ADwALwBLAEkARAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AagBZAEYATgBmADAAeQBmADQAaQBzAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwATABBAF8AVQBSAEwAPgBoAHQAdABwADoALwAvAHAAbABhAHkAcgBlAGEAZAB5AC4AZABpAHIAZQBjAHQAdABhAHAAcwAuAG4AZQB0AC8AcAByAC8AcwB2AGMALwByAGkAZwBoAHQAcwBtAGEAbgBhAGcAZQByAC4AYQBzAG0AeAA/AFAAbABhAHkAUgBpAGcAaAB0AD0AMQAmAGEAbQBwADsAVQBzAGUAUwBpAG0AcABsAGUATgBvAG4AUABlAHIAcwBpAHMAdABlAG4AdABMAGkAYwBlAG4AcwBlAD0AMQA8AC8ATABBAF8AVQBSAEwAPgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==' } ]
},
+ 'mp4-clear-encrypted' : {
+ assetId: 'mp4-basic',
+ initDataType: 'cenc',
+ audio : { type: 'audio/mp4;codecs="mp4a.40.2"',
+ path: '/encrypted-media/content/audio_aac-lc_128k_dashinit.mp4' },
+ video : { type: 'video/mp4;codecs="avc1.4d401e"',
+ path: '/encrypted-media/content/video_512x288_h264-360k_clear_enc_dashinit.mp4' },
+ keys : [ { kid: [ 0xad, 0x13, 0xf9, 0xea, 0x2b, 0xe6, 0x98, 0xb8, 0x75, 0xf5, 0x04, 0xa8, 0xe3, 0xcc, 0xea, 0x64 ],
+ key: [ 0xbe, 0x7d, 0xf8, 0xa3, 0x66, 0x7a, 0x6a, 0x8f, 0xd5, 0x64, 0xd0, 0xed, 0x81, 0x33, 0x9a, 0x95 ],
+ initDataType: 'cenc',
+ initData: 'AAAAcXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAFEIARIQrRP56ivmmLh19QSo48zqZBoIY2FzdGxhYnMiKGV5SmhjM05sZEVsa0lqb2laVzFsTFhSbGMzUXRjMmx1WjJ4bEluMD0yB2RlZmF1bHQAAAMacHNzaAAAAACaBPB5mEBChquS5lvgiF+VAAAC+voCAAABAAEA8AI8AFcAUgBNAEgARQBBAEQARQBSACAAeABtAGwAbgBzAD0AIgBoAHQAdABwADoALwAvAHMAYwBoAGUAbQBhAHMALgBtAGkAYwByAG8AcwBvAGYAdAAuAGMAbwBtAC8ARABSAE0ALwAyADAAMAA3AC8AMAAzAC8AUABsAGEAeQBSAGUAYQBkAHkASABlAGEAZABlAHIAIgAgAHYAZQByAHMAaQBvAG4APQAiADQALgAwAC4AMAAuADAAIgA+ADwARABBAFQAQQA+ADwAUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEUAWQBMAEUATgA+ADEANgA8AC8ASwBFAFkATABFAE4APgA8AEEATABHAEkARAA+AEEARQBTAEMAVABSADwALwBBAEwARwBJAEQAPgA8AC8AUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEkARAA+ADYAdgBrAFQAcgBlAFkAcgB1AEoAaAAxADkAUQBTAG8ANAA4AHoAcQBaAEEAPQA9ADwALwBLAEkARAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AagBZAEYATgBmADAAeQBmADQAaQBzAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwATABBAF8AVQBSAEwAPgBoAHQAdABwADoALwAvAHAAbABhAHkAcgBlAGEAZAB5AC4AZABpAHIAZQBjAHQAdABhAHAAcwAuAG4AZQB0AC8AcAByAC8AcwB2AGMALwByAGkAZwBoAHQAcwBtAGEAbgBhAGcAZQByAC4AYQBzAG0AeAA/AFAAbABhAHkAUgBpAGcAaAB0AD0AMQAmAGEAbQBwADsAVQBzAGUAUwBpAG0AcABsAGUATgBvAG4AUABlAHIAcwBpAHMAdABlAG4AdABMAGkAYwBlAG4AcwBlAD0AMQA8AC8ATABBAF8AVQBSAEwAPgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==' } ]
+ },
+
+ 'mp4-encrypted-clear' : {
+ assetId: 'mp4-basic',
+ initDataType: 'cenc',
+ audio : { type: 'audio/mp4;codecs="mp4a.40.2"',
+ path: '/encrypted-media/content/audio_aac-lc_128k_dashinit.mp4' },
+ video : { type: 'video/mp4;codecs="avc1.4d401e"',
+ path: '/encrypted-media/content/video_512x288_h264-360k_enc_clear_dashinit.mp4' },
+ keys : [ { kid: [ 0xad, 0x13, 0xf9, 0xea, 0x2b, 0xe6, 0x98, 0xb8, 0x75, 0xf5, 0x04, 0xa8, 0xe3, 0xcc, 0xea, 0x64 ],
+ key: [ 0xbe, 0x7d, 0xf8, 0xa3, 0x66, 0x7a, 0x6a, 0x8f, 0xd5, 0x64, 0xd0, 0xed, 0x81, 0x33, 0x9a, 0x95 ],
+ initDataType: 'cenc',
+ initData: 'AAAAcXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAFEIARIQrRP56ivmmLh19QSo48zqZBoIY2FzdGxhYnMiKGV5SmhjM05sZEVsa0lqb2laVzFsTFhSbGMzUXRjMmx1WjJ4bEluMD0yB2RlZmF1bHQAAAMacHNzaAAAAACaBPB5mEBChquS5lvgiF+VAAAC+voCAAABAAEA8AI8AFcAUgBNAEgARQBBAEQARQBSACAAeABtAGwAbgBzAD0AIgBoAHQAdABwADoALwAvAHMAYwBoAGUAbQBhAHMALgBtAGkAYwByAG8AcwBvAGYAdAAuAGMAbwBtAC8ARABSAE0ALwAyADAAMAA3AC8AMAAzAC8AUABsAGEAeQBSAGUAYQBkAHkASABlAGEAZABlAHIAIgAgAHYAZQByAHMAaQBvAG4APQAiADQALgAwAC4AMAAuADAAIgA+ADwARABBAFQAQQA+ADwAUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEUAWQBMAEUATgA+ADEANgA8AC8ASwBFAFkATABFAE4APgA8AEEATABHAEkARAA+AEEARQBTAEMAVABSADwALwBBAEwARwBJAEQAPgA8AC8AUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEkARAA+ADYAdgBrAFQAcgBlAFkAcgB1AEoAaAAxADkAUQBTAG8ANAA4AHoAcQBaAEEAPQA9ADwALwBLAEkARAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AagBZAEYATgBmADAAeQBmADQAaQBzAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwATABBAF8AVQBSAEwAPgBoAHQAdABwADoALwAvAHAAbABhAHkAcgBlAGEAZAB5AC4AZABpAHIAZQBjAHQAdABhAHAAcwAuAG4AZQB0AC8AcAByAC8AcwB2AGMALwByAGkAZwBoAHQAcwBtAGEAbgBhAGcAZQByAC4AYQBzAG0AeAA/AFAAbABhAHkAUgBpAGcAaAB0AD0AMQAmAGEAbQBwADsAVQBzAGUAUwBpAG0AcABsAGUATgBvAG4AUABlAHIAcwBpAHMAdABlAG4AdABMAGkAYwBlAG4AcwBlAD0AMQA8AC8ATABBAF8AVQBSAEwAPgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==' } ]
+ },
+
+
'mp4-av-multikey' : {
+ assetId: 'mp4-basic',
initDataType: 'cenc',
associatedInitData: true, // indicates that initData for one key causes other keys to be returned as well
audio: { type: 'audio/mp4;codecs="mp4a.40.2"',
@@ -27,20 +64,64 @@ content = addMemberListToObject( {
initData: 'AAAAcXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAFEIARIQVY7lQbkKsvOVDQCt43YNRRoIY2FzdGxhYnMiKGV5SmhjM05sZEVsa0lqb2laVzFsTFhSbGMzUXRjMmx1WjJ4bEluMD0yB2RlZmF1bHQAAAMacHNzaAAAAACaBPB5mEBChquS5lvgiF+VAAAC+voCAAABAAEA8AI8AFcAUgBNAEgARQBBAEQARQBSACAAeABtAGwAbgBzAD0AIgBoAHQAdABwADoALwAvAHMAYwBoAGUAbQBhAHMALgBtAGkAYwByAG8AcwBvAGYAdAAuAGMAbwBtAC8ARABSAE0ALwAyADAAMAA3AC8AMAAzAC8AUABsAGEAeQBSAGUAYQBkAHkASABlAGEAZABlAHIAIgAgAHYAZQByAHMAaQBvAG4APQAiADQALgAwAC4AMAAuADAAIgA+ADwARABBAFQAQQA+ADwAUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEUAWQBMAEUATgA+ADEANgA8AC8ASwBFAFkATABFAE4APgA8AEEATABHAEkARAA+AEEARQBTAEMAVABSADwALwBBAEwARwBJAEQAPgA8AC8AUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEkARAA+AFEAZQBXAE8AVgBRAHEANQA4ADcASwBWAEQAUQBDAHQANAAzAFkATgBSAFEAPQA9ADwALwBLAEkARAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AWQBpAE8ALwAxADYATABzADkANgBFAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwATABBAF8AVQBSAEwAPgBoAHQAdABwADoALwAvAHAAbABhAHkAcgBlAGEAZAB5AC4AZABpAHIAZQBjAHQAdABhAHAAcwAuAG4AZQB0AC8AcAByAC8AcwB2AGMALwByAGkAZwBoAHQAcwBtAGEAbgBhAGcAZQByAC4AYQBzAG0AeAA/AFAAbABhAHkAUgBpAGcAaAB0AD0AMQAmAGEAbQBwADsAVQBzAGUAUwBpAG0AcABsAGUATgBvAG4AUABlAHIAcwBpAHMAdABlAG4AdABMAGkAYwBlAG4AcwBlAD0AMQA8AC8ATABBAF8AVQBSAEwAPgA8AC8ARABBAFQAQQA+ADwALwBXAFIATQBIAEUAQQBEAEUAUgA+AA==' } ]
},
- 'mp4-multikey' : { initDataType: 'cenc',
+ 'mp4-multikey' : { assetId: 'mp4-multikey',
+ initDataType: 'cenc',
audio: { type: 'audio/mp4;codecs="mp4a.40.2"',
path: '/encrypted-media/content/audio_aac-lc_128k_2keys_2sess.mp4' },
video: { type: 'video/mp4;codecs="avc1.4d401e"',
path: '/encrypted-media/content/video_512x288_h264-360k_enc_2keys_2sess.mp4' },
keys: [ { kid: [ 0x13, 0xa7, 0x53, 0x06, 0xd1, 0x18, 0x91, 0x7b, 0x47, 0xa6, 0xc1, 0x83, 0x64, 0x42, 0x51, 0x6f ],
key: [ 0x8a, 0xaa, 0xd8, 0xc4, 0xdb, 0xde, 0xac, 0xcd, 0xad, 0x26, 0x76, 0xa1, 0xed, 0x38, 0x95, 0x2e ],
+ variantId: 'key1',
initDataType: 'cenc',
initData: 'AAAAjXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAG0IARIQE6dTBtEYkXtHpsGDZEJRbxoIY2FzdGxhYnMiRGV5SmhjM05sZEVsa0lqb2laVzFsTFhSbGMzUXRNbk5sYzNOcGIyNGlMQ0oyWVhKcFlXNTBTV1FpT2lKclpYa3hJbjA9MgdkZWZhdWx0AAADwnBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAA6KiAwAAAQABAJgDPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgBCAGwATwBuAEUAeABqAFIAZQA1AEYASABwAHMARwBEAFoARQBKAFIAYgB3AD0APQA8AC8ASwBJAEQAPgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAGwAaQBjAC4AcwB0AGEAZwBpAG4AZwAuAGQAcgBtAHQAbwBkAGEAeQAuAGMAbwBtAC8AbABpAGMAZQBuAHMAZQAtAHAAcgBvAHgAeQAtAGgAZQBhAGQAZQByAGEAdQB0AGgALwBkAHIAbQB0AG8AZABhAHkALwBSAGkAZwBoAHQAcwBNAGEAbgBhAGcAZQByAC4AYQBzAG0AeAA8AC8ATABBAF8AVQBSAEwAPgA8AEwAVQBJAF8AVQBSAEwAPgBoAHQAdABwAHMAOgAvAC8AbABpAGMALgBzAHQAYQBnAGkAbgBnAC4AZAByAG0AdABvAGQAYQB5AC4AYwBvAG0ALwBsAGkAYwBlAG4AcwBlAC0AcAByAG8AeAB5AC0AaABlAGEAZABlAHIAYQB1AHQAaAAvAGQAcgBtAHQAbwBkAGEAeQAvAFIAaQBnAGgAdABzAE0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAFUASQBfAFUAUgBMAD4APABDAEgARQBDAEsAUwBVAE0APgBJAEQAUgB0AFAAZwBVAEkALwBiAEkAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=' },
{ kid: [ 0xee, 0x73, 0x56, 0x4e, 0xc8, 0xa8, 0x90, 0xf0, 0x78, 0xef, 0x68, 0x71, 0xfa, 0x4b, 0xe1, 0x8b ],
key: [ 0xe4, 0x4f, 0xe1, 0x45, 0x7c, 0x5e, 0xbc, 0xd8, 0x3e, 0xad, 0xdc, 0xd6, 0x2c, 0xaf, 0x55, 0x18 ],
- initDataType: 'cenc',
+ variantId: 'key2',
+ initDataType: 'cenc',
initData: 'AAAAjXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAG0IARIQ7nNWTsiokPB472hx+kvhixoIY2FzdGxhYnMiRGV5SmhjM05sZEVsa0lqb2laVzFsTFhSbGMzUXRNbk5sYzNOcGIyNGlMQ0oyWVhKcFlXNTBTV1FpT2lKclpYa3lJbjA9MgdkZWZhdWx0AAADwnBzc2gAAAAAmgTweZhAQoarkuZb4IhflQAAA6KiAwAAAQABAJgDPABXAFIATQBIAEUAQQBEAEUAUgAgAHgAbQBsAG4AcwA9ACIAaAB0AHQAcAA6AC8ALwBzAGMAaABlAG0AYQBzAC4AbQBpAGMAcgBvAHMAbwBmAHQALgBjAG8AbQAvAEQAUgBNAC8AMgAwADAANwAvADAAMwAvAFAAbABhAHkAUgBlAGEAZAB5AEgAZQBhAGQAZQByACIAIAB2AGUAcgBzAGkAbwBuAD0AIgA0AC4AMAAuADAALgAwACIAPgA8AEQAQQBUAEEAPgA8AFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBFAFkATABFAE4APgAxADYAPAAvAEsARQBZAEwARQBOAD4APABBAEwARwBJAEQAPgBBAEUAUwBDAFQAUgA8AC8AQQBMAEcASQBEAD4APAAvAFAAUgBPAFQARQBDAFQASQBOAEYATwA+ADwASwBJAEQAPgBUAGwAWgB6ADcAcQBqAEkAOABKAEIANAA3ADIAaAB4ACsAawB2AGgAaQB3AD0APQA8AC8ASwBJAEQAPgA8AEwAQQBfAFUAUgBMAD4AaAB0AHQAcABzADoALwAvAGwAaQBjAC4AcwB0AGEAZwBpAG4AZwAuAGQAcgBtAHQAbwBkAGEAeQAuAGMAbwBtAC8AbABpAGMAZQBuAHMAZQAtAHAAcgBvAHgAeQAtAGgAZQBhAGQAZQByAGEAdQB0AGgALwBkAHIAbQB0AG8AZABhAHkALwBSAGkAZwBoAHQAcwBNAGEAbgBhAGcAZQByAC4AYQBzAG0AeAA8AC8ATABBAF8AVQBSAEwAPgA8AEwAVQBJAF8AVQBSAEwAPgBoAHQAdABwAHMAOgAvAC8AbABpAGMALgBzAHQAYQBnAGkAbgBnAC4AZAByAG0AdABvAGQAYQB5AC4AYwBvAG0ALwBsAGkAYwBlAG4AcwBlAC0AcAByAG8AeAB5AC0AaABlAGEAZABlAHIAYQB1AHQAaAAvAGQAcgBtAHQAbwBkAGEAeQAvAFIAaQBnAGgAdABzAE0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAFUASQBfAFUAUgBMAD4APABDAEgARQBDAEsAUwBVAE0APgB4AEQASwBBAFkAMAB2AFoAaABVAFUAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=' } ] },
+ 'mp4-basic-key1' : { assetId: 'mp4-multikey-sequential',
+ variantId: 'key1',
+ initDataType: 'cenc',
+ audio: { type: 'audio/mp4;codecs="mp4a.40.2"',
+ path: '/encrypted-media/content/audio_aac-lc_128k_dashinit.mp4' },
+ video: { type: 'video/mp4;codecs="avc1.4d401e"',
+ path: '/encrypted-media/content/video_512x288_h264-360k_multikey_key1_dashinit.mp4' },
+ keys: [ { kid: [0x8a, 0x0d, 0x85, 0x45, 0x21, 0x05, 0xd4, 0x15, 0x35, 0x8f, 0xea, 0x8f, 0x68, 0xe6, 0xc1, 0x91],
+ key: [0x76, 0x6f, 0xab, 0xc1, 0x68, 0x3f, 0xf8, 0xef, 0x4e, 0x76, 0x00, 0x24, 0xc5, 0x23, 0x8f, 0x10],
+ initDataType: 'cenc',
+ initData: 'AAAAlXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAHUIARIQig2FRSEF1BU1j+qPaObBkRoIY2FzdGxhYnMiTGV5SmhjM05sZEVsa0lqb2liWEEwTFcxMWJIUnBhMlY1TFhObGNYVmxiblJwWVd3aUxDSjJZWEpwWVc1MFNXUWlPaUpyWlhreEluMD0yB2RlZmF1bHQAAANYcHNzaAAAAACaBPB5mEBChquS5lvgiF+VAAADODgDAAABAAEALgM8AFcAUgBNAEgARQBBAEQARQBSACAAeABtAGwAbgBzAD0AIgBoAHQAdABwADoALwAvAHMAYwBoAGUAbQBhAHMALgBtAGkAYwByAG8AcwBvAGYAdAAuAGMAbwBtAC8ARABSAE0ALwAyADAAMAA3AC8AMAAzAC8AUABsAGEAeQBSAGUAYQBkAHkASABlAGEAZABlAHIAIgAgAHYAZQByAHMAaQBvAG4APQAiADQALgAwAC4AMAAuADAAIgA+ADwARABBAFQAQQA+ADwAUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEUAWQBMAEUATgA+ADEANgA8AC8ASwBFAFkATABFAE4APgA8AEEATABHAEkARAA+AEEARQBTAEMAVABSADwALwBBAEwARwBJAEQAPgA8AC8AUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEkARAA+AFIAWQBVAE4AaQBnAFUAaABGAGQAUQAxAGoAKwBxAFAAYQBPAGIAQgBrAFEAPQA9ADwALwBLAEkARAA+ADwATABBAF8AVQBSAEwAPgBoAHQAdABwAHMAOgAvAC8AbABpAGMALgBzAHQAYQBnAGkAbgBnAC4AZAByAG0AdABvAGQAYQB5AC4AYwBvAG0ALwBsAGkAYwBlAG4AcwBlAC0AcAByAG8AeAB5AC0AaABlAGEAZABlAHIAYQB1AHQAaAAvAGQAcgBtAHQAbwBkAGEAeQAvAFIAaQBnAGgAdABzAE0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAEEAXwBVAFIATAA+ADwATABVAEkAXwBVAFIATAA+AGgAdAB0AHAAcwA6AC8ALwBwAGwAYQB5AHIAZQBhAGQAeQAtAHUAaQAuAGUAeABhAG0AcABsAGUALgBjAG8AbQA8AC8ATABVAEkAXwBVAFIATAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AcQBOAEkAZQBiAFQAWABzAG8AcgBnAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A' } ]
+ },
+ 'mp4-basic-key2' : { assetId: 'mp4-multikey-sequential',
+ variantId: 'key2',
+ initDataType: 'cenc',
+ audio: { type: 'audio/mp4;codecs="mp4a.40.2"',
+ path: '/encrypted-media/content/audio_aac-lc_128k_dashinit.mp4' },
+ video: { type: 'video/mp4;codecs="avc1.4d401e"',
+ path: '/encrypted-media/content/video_512x288_h264-360k_multikey_key2_dashinit.mp4' },
+ keys: [ { kid: [0xfb, 0xb4, 0xb7, 0xf3, 0x4a, 0xbd, 0x31, 0x87, 0x34, 0x4b, 0xce, 0xc4, 0x5f, 0x96, 0x68, 0x88],
+ key: [0x26, 0x52, 0xc3, 0x1d, 0xf7, 0x92, 0xd1, 0x7b, 0x08, 0xa6, 0xfa, 0xd3, 0x7c, 0xb6, 0x25, 0x60],
+ initDataType: 'cenc',
+ initData: 'AAAAlXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAHUIARIQ+7S380q9MYc0S87EX5ZoiBoIY2FzdGxhYnMiTGV5SmhjM05sZEVsa0lqb2liWEEwTFcxMWJIUnBhMlY1TFhObGNYVmxiblJwWVd3aUxDSjJZWEpwWVc1MFNXUWlPaUpyWlhreUluMD0yB2RlZmF1bHQAAANYcHNzaAAAAACaBPB5mEBChquS5lvgiF+VAAADODgDAAABAAEALgM8AFcAUgBNAEgARQBBAEQARQBSACAAeABtAGwAbgBzAD0AIgBoAHQAdABwADoALwAvAHMAYwBoAGUAbQBhAHMALgBtAGkAYwByAG8AcwBvAGYAdAAuAGMAbwBtAC8ARABSAE0ALwAyADAAMAA3AC8AMAAzAC8AUABsAGEAeQBSAGUAYQBkAHkASABlAGEAZABlAHIAIgAgAHYAZQByAHMAaQBvAG4APQAiADQALgAwAC4AMAAuADAAIgA+ADwARABBAFQAQQA+ADwAUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEUAWQBMAEUATgA+ADEANgA8AC8ASwBFAFkATABFAE4APgA8AEEATABHAEkARAA+AEEARQBTAEMAVABSADwALwBBAEwARwBJAEQAPgA8AC8AUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEkARAA+ADgANwBlADAAKwA3ADEASwBoAHoARQAwAFMAOAA3AEUAWAA1AFoAbwBpAEEAPQA9ADwALwBLAEkARAA+ADwATABBAF8AVQBSAEwAPgBoAHQAdABwAHMAOgAvAC8AbABpAGMALgBzAHQAYQBnAGkAbgBnAC4AZAByAG0AdABvAGQAYQB5AC4AYwBvAG0ALwBsAGkAYwBlAG4AcwBlAC0AcAByAG8AeAB5AC0AaABlAGEAZABlAHIAYQB1AHQAaAAvAGQAcgBtAHQAbwBkAGEAeQAvAFIAaQBnAGgAdABzAE0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAEEAXwBVAFIATAA+ADwATABVAEkAXwBVAFIATAA+AGgAdAB0AHAAcwA6AC8ALwBwAGwAYQB5AHIAZQBhAGQAeQAtAHUAaQAuAGUAeABhAG0AcABsAGUALgBjAG8AbQA8AC8ATABVAEkAXwBVAFIATAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4ARgB0AGkASQBoADYAUwBKAG0AcABZAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A' } ] },
+
+ 'mp4-multikey-sequential' : { assetId: 'mp4-multikey-sequential',
+ initDataType: 'cenc',
+ audio: { type: 'audio/mp4;codecs="mp4a.40.2"',
+ path: '/encrypted-media/content/audio_aac-lc_128k_dashinit.mp4' },
+ video: { type: 'video/mp4;codecs="avc1.4d401e"',
+ path: '/encrypted-media/content/video_512x288_h264-360k_multikey_dashinit.mp4' },
+ keys: [ { kid: [0x8a, 0x0d, 0x85, 0x45, 0x21, 0x05, 0xd4, 0x15, 0x35, 0x8f, 0xea, 0x8f, 0x68, 0xe6, 0xc1, 0x91],
+ key: [0x76, 0x6f, 0xab, 0xc1, 0x68, 0x3f, 0xf8, 0xef, 0x4e, 0x76, 0x00, 0x24, 0xc5, 0x23, 0x8f, 0x10],
+ variantId: 'key1',
+ initDataType: 'cenc',
+ initData: 'AAAAlXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAHUIARIQig2FRSEF1BU1j+qPaObBkRoIY2FzdGxhYnMiTGV5SmhjM05sZEVsa0lqb2liWEEwTFcxMWJIUnBhMlY1TFhObGNYVmxiblJwWVd3aUxDSjJZWEpwWVc1MFNXUWlPaUpyWlhreEluMD0yB2RlZmF1bHQAAANYcHNzaAAAAACaBPB5mEBChquS5lvgiF+VAAADODgDAAABAAEALgM8AFcAUgBNAEgARQBBAEQARQBSACAAeABtAGwAbgBzAD0AIgBoAHQAdABwADoALwAvAHMAYwBoAGUAbQBhAHMALgBtAGkAYwByAG8AcwBvAGYAdAAuAGMAbwBtAC8ARABSAE0ALwAyADAAMAA3AC8AMAAzAC8AUABsAGEAeQBSAGUAYQBkAHkASABlAGEAZABlAHIAIgAgAHYAZQByAHMAaQBvAG4APQAiADQALgAwAC4AMAAuADAAIgA+ADwARABBAFQAQQA+ADwAUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEUAWQBMAEUATgA+ADEANgA8AC8ASwBFAFkATABFAE4APgA8AEEATABHAEkARAA+AEEARQBTAEMAVABSADwALwBBAEwARwBJAEQAPgA8AC8AUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEkARAA+AFIAWQBVAE4AaQBnAFUAaABGAGQAUQAxAGoAKwBxAFAAYQBPAGIAQgBrAFEAPQA9ADwALwBLAEkARAA+ADwATABBAF8AVQBSAEwAPgBoAHQAdABwAHMAOgAvAC8AbABpAGMALgBzAHQAYQBnAGkAbgBnAC4AZAByAG0AdABvAGQAYQB5AC4AYwBvAG0ALwBsAGkAYwBlAG4AcwBlAC0AcAByAG8AeAB5AC0AaABlAGEAZABlAHIAYQB1AHQAaAAvAGQAcgBtAHQAbwBkAGEAeQAvAFIAaQBnAGgAdABzAE0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAEEAXwBVAFIATAA+ADwATABVAEkAXwBVAFIATAA+AGgAdAB0AHAAcwA6AC8ALwBwAGwAYQB5AHIAZQBhAGQAeQAtAHUAaQAuAGUAeABhAG0AcABsAGUALgBjAG8AbQA8AC8ATABVAEkAXwBVAFIATAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4AcQBOAEkAZQBiAFQAWABzAG8AcgBnAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A' },
+ { kid: [0xfb, 0xb4, 0xb7, 0xf3, 0x4a, 0xbd, 0x31, 0x87, 0x34, 0x4b, 0xce, 0xc4, 0x5f, 0x96, 0x68, 0x88],
+ key: [0x26, 0x52, 0xc3, 0x1d, 0xf7, 0x92, 0xd1, 0x7b, 0x08, 0xa6, 0xfa, 0xd3, 0x7c, 0xb6, 0x25, 0x60],
+ variantId: 'key2',
+ initDataType: 'cenc',
+ initData: 'AAAAlXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAHUIARIQ+7S380q9MYc0S87EX5ZoiBoIY2FzdGxhYnMiTGV5SmhjM05sZEVsa0lqb2liWEEwTFcxMWJIUnBhMlY1TFhObGNYVmxiblJwWVd3aUxDSjJZWEpwWVc1MFNXUWlPaUpyWlhreUluMD0yB2RlZmF1bHQAAANYcHNzaAAAAACaBPB5mEBChquS5lvgiF+VAAADODgDAAABAAEALgM8AFcAUgBNAEgARQBBAEQARQBSACAAeABtAGwAbgBzAD0AIgBoAHQAdABwADoALwAvAHMAYwBoAGUAbQBhAHMALgBtAGkAYwByAG8AcwBvAGYAdAAuAGMAbwBtAC8ARABSAE0ALwAyADAAMAA3AC8AMAAzAC8AUABsAGEAeQBSAGUAYQBkAHkASABlAGEAZABlAHIAIgAgAHYAZQByAHMAaQBvAG4APQAiADQALgAwAC4AMAAuADAAIgA+ADwARABBAFQAQQA+ADwAUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEUAWQBMAEUATgA+ADEANgA8AC8ASwBFAFkATABFAE4APgA8AEEATABHAEkARAA+AEEARQBTAEMAVABSADwALwBBAEwARwBJAEQAPgA8AC8AUABSAE8AVABFAEMAVABJAE4ARgBPAD4APABLAEkARAA+ADgANwBlADAAKwA3ADEASwBoAHoARQAwAFMAOAA3AEUAWAA1AFoAbwBpAEEAPQA9ADwALwBLAEkARAA+ADwATABBAF8AVQBSAEwAPgBoAHQAdABwAHMAOgAvAC8AbABpAGMALgBzAHQAYQBnAGkAbgBnAC4AZAByAG0AdABvAGQAYQB5AC4AYwBvAG0ALwBsAGkAYwBlAG4AcwBlAC0AcAByAG8AeAB5AC0AaABlAGEAZABlAHIAYQB1AHQAaAAvAGQAcgBtAHQAbwBkAGEAeQAvAFIAaQBnAGgAdABzAE0AYQBuAGEAZwBlAHIALgBhAHMAbQB4ADwALwBMAEEAXwBVAFIATAA+ADwATABVAEkAXwBVAFIATAA+AGgAdAB0AHAAcwA6AC8ALwBwAGwAYQB5AHIAZQBhAGQAeQAtAHUAaQAuAGUAeABhAG0AcABsAGUALgBjAG8AbQA8AC8ATABVAEkAXwBVAFIATAA+ADwAQwBIAEUAQwBLAFMAVQBNAD4ARgB0AGkASQBoADYAUwBKAG0AcABZAD0APAAvAEMASABFAEMASwBTAFUATQA+ADwALwBEAEEAVABBAD4APAAvAFcAUgBNAEgARQBBAEQARQBSAD4A' } ] },
+
'webm' : { audio : { type: 'audio/webm; codecs="opus"' },
video : { type: 'video/webm; codecs="vp8"',
path: '/encrypted-media/content/test-encrypted.webm' },
@@ -143,9 +224,11 @@ function getMultikeyInitDatas( contentitem, initDataType )
function getProprietaryInitDatas( contentitem )
{
+ var keysWithInitData = contentitem.keys.filter( function( k ) { return k.initData; } );
return { initDataType: contentitem.initDataType,
- initDatas : contentitem.keys.filter( function( k ) { return k.initData; } )
- .map( function( k ) { return k.initData; } ) };
+ initDatas : keysWithInitData.map( function( k ) { return k.initData; } ),
+ variantIds: keysWithInitData.map( function( k ) { return k.variantId; } )
+ };
}
// Returns a promise that resolves to the following object
diff --git a/tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_clear_dashinit.mp4 b/tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_clear_dashinit.mp4
new file mode 100644
index 00000000000..33ac63f6bfd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_clear_dashinit.mp4
Binary files differ
diff --git a/tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_clear_enc_dashinit.mp4 b/tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_clear_enc_dashinit.mp4
new file mode 100644
index 00000000000..dca23449af7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_clear_enc_dashinit.mp4
Binary files differ
diff --git a/tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_enc_clear_dashinit.mp4 b/tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_enc_clear_dashinit.mp4
new file mode 100644
index 00000000000..d837ac65005
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_enc_clear_dashinit.mp4
Binary files differ
diff --git a/tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_multikey_dashinit.mp4 b/tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_multikey_dashinit.mp4
new file mode 100644
index 00000000000..659a61cdcf1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_multikey_dashinit.mp4
Binary files differ
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/.gitkeep b/tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_multikey_key1_dashinit.mp4
index e69de29bb2d..e69de29bb2d 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/.gitkeep
+++ b/tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_multikey_key1_dashinit.mp4
diff --git a/tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_multikey_key2_dashinit.mp4 b/tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_multikey_key2_dashinit.mp4
new file mode 100644
index 00000000000..0b9b457a6b3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/content/video_512x288_h264-360k_multikey_key2_dashinit.mp4
Binary files differ
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-events-session-closed-event.html b/tests/wpt/web-platform-tests/encrypted-media/drm-events-session-closed-event.html
new file mode 100644
index 00000000000..425d17646ca
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-events-session-closed-event.html
@@ -0,0 +1,39 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions - Test MediaKeySession closed event with DRM, mp4</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/events-session-closed-event.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <script>
+ var keysystem = getSupportedKeySystem(),
+ contentItem = content['mp4-basic'],
+ config = {
+ keysystem: keysystem,
+ content: contentItem,
+ initDataType: contentItem.initDataType,
+ audioType: contentItem.audio.type,
+ videoType: contentItem.video.type
+ };
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-events.html b/tests/wpt/web-platform-tests/encrypted-media/drm-events.html
index 118ed204a36..880376d60da 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/drm-events.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-events.html
@@ -42,7 +42,7 @@
initDataType,
initData;
- var contentWithExplicitInitData = supported.filter( function( s ) { return s.content.initDataType; } );
+ var contentWithExplicitInitData = supported.filter( function( s ) { return s.content.keys && s.content.initDataType; } );
if ( contentWithExplicitInitData.length > 0 )
{
content = contentWithExplicitInitData[ 0 ].content;
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-expiration.html b/tests/wpt/web-platform-tests/encrypted-media/drm-expiration.html
new file mode 100644
index 00000000000..6dec511470b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-expiration.html
@@ -0,0 +1,67 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: Expiration with DRM</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for DRM servers -->
+ <script src=/encrypted-media/util/drm-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/expiration.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <script>
+ var keysystem = getSupportedKeySystem();
+
+ getSupportedContentAndInitDataTypes( keysystem ).then( function( supported ) {
+ // This test requires initData for supported content.
+ // We prefer explicit initData configured for the content, but
+ // otherwise we will generate initData for a supported initDataType
+ // FIXME: Move me to a utility function
+ var content,
+ initDataType,
+ initData;
+
+ var contentWithExplicitInitData = supported.filter( function( s ) { return s.content.initDataType && s.content.keys; } );
+ if ( contentWithExplicitInitData.length > 0 ) {
+ content = contentWithExplicitInitData[ 0 ].content;
+ initDataType = content.keys[ 0 ].initDataType;
+ initData = base64DecodeToUnit8Array( content.keys[ 0 ].initData );
+ } else {
+ content = supported[ 0 ].content;
+ initDataType = supported[ 0 ].initDataTypes[ 0 ];
+ initData = getInitData( content, initDataType );
+ }
+
+ var handler = new MessageHandler( keysystem, content );
+
+ runTest( { keysystem: keysystem,
+ content: content,
+ messagehandler: handler.messagehandler,
+ initDataType: initDataType,
+ initData: initData,
+ expiration: Date.now().valueOf() + 120000 // Two minutes from now
+ } );
+ } );
+
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-invalid-license.html b/tests/wpt/web-platform-tests/encrypted-media/drm-invalid-license.html
new file mode 100644
index 00000000000..9584f499ce2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-invalid-license.html
@@ -0,0 +1,32 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: Test handling of invalid DRM license</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/invalid-license.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <script>
+ var keysystem = getSupportedKeySystem(),
+ config = {
+ keysystem: keysystem
+ };
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-keystatuses-multiple-sessions.html b/tests/wpt/web-platform-tests/encrypted-media/drm-keystatuses-multiple-sessions.html
index 40aab914182..8ef745c4fa7 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/drm-keystatuses-multiple-sessions.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-keystatuses-multiple-sessions.html
@@ -2,7 +2,7 @@
<html>
<head>
<meta charset=utf-8>
- <title>Encrypted Media Extensions: Successful Playback, Temporary session with Clear Key, mp4, multiple keys for audio/video</title>
+ <title>Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4, multiple keys for audio/video</title>
<link rel="help" href="https://w3c.github.io/encrypted-media/">
<!-- Web Platform Test Harness scripts -->
@@ -18,7 +18,7 @@
<!-- Content metadata -->
<script src=/encrypted-media/content/content-metadata.js></script>
- <!-- Message handler for Clear Key keysystem -->
+ <!-- Message handler for DRM server -->
<script src=/encrypted-media/util/drm-messagehandler.js></script>
<!-- The script for this specific test -->
@@ -38,7 +38,7 @@
.then( function( contents ) {
// Select a content item with multiple keys and initData
- var contentitem = contents.filter( function( item ) { return item.keys.length > 1 && item.initDataType && !item.associatedInitData; } )[ 0 ],
+ var contentitem = contents.filter( function( item ) { return item.keys && item.keys.length > 1 && item.initDataType && !item.associatedInitData; } )[ 0 ],
handler = new MessageHandler( keysystem, contentitem ),
config = { keysystem: keysystem,
content: contentitem,
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-keystatuses.html b/tests/wpt/web-platform-tests/encrypted-media/drm-keystatuses.html
index de2cfd2a552..de7ff395d03 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/drm-keystatuses.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-keystatuses.html
@@ -33,7 +33,7 @@
getSupportedContent( keysystem ).then( function( contents ) {
// Select a content item with multiple keys and initData that retrieves all keys
var contentitem = contents.filter( function( item ) {
- return item.keys.length > 1 && item.initDataType && item.associatedInitData;
+ return item.keys && item.keys.length > 1 && item.initDataType && item.associatedInitData;
} )[ 0 ];
var handler = new MessageHandler( keysystem, contentitem );
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-onencrypted.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-onencrypted.html
new file mode 100644
index 00000000000..9e4aff330d4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-onencrypted.html
@@ -0,0 +1,47 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: Encrypted fired on encrypted media file with DRM, mp4</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/onencrypted.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var contentItem = content['mp4-av-multikey'],
+ config = {
+ video: document.getElementById('videoelement'),
+ content: contentItem,
+ audioType: contentItem.audio.type,
+ videoType: contentItem.video.type,
+ audioPath: contentItem.audio.path,
+ videoPath: contentItem.video.path,
+ initDataType: contentItem.initDataType,
+ keys: contentItem.keys
+ };
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-retrieve-destroy-persistent-license.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-retrieve-destroy-persistent-license.html
index 3a164617462..d70dc9811f0 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-retrieve-destroy-persistent-license.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-retrieve-destroy-persistent-license.html
@@ -37,7 +37,8 @@
var keysystem = getSupportedKeySystem(),
contentitem = content['mp4-basic'],
handler = new MessageHandler( keysystem, contentitem, 'persistent-license' ),
- config = { video: document.getElementById('videoelement'),
+ config = { content: contentitem,
+ video: document.getElementById('videoelement'),
keysystem: keysystem,
messagehandler: handler.messagehandler,
audioPath: contentitem.audio.path,
@@ -51,4 +52,4 @@
runTest(config);
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-clear-encrypted.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-clear-encrypted.html
new file mode 100644
index 00000000000..a8621ba2552
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-clear-encrypted.html
@@ -0,0 +1,53 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4, clear then encrypted</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for DRM servers -->
+ <script src=/encrypted-media/util/drm-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/playback-temporary.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var keysystem = getSupportedKeySystem(),
+ contentitem = content['mp4-clear-encrypted'],
+ handler = new MessageHandler(keysystem, contentitem),
+ config = { video: document.getElementById('videoelement'),
+ keysystem: keysystem,
+ messagehandler: handler.messagehandler,
+ audioPath: contentitem.audio.path,
+ videoPath: contentitem.video.path,
+ audioType: contentitem.audio.type,
+ videoType: contentitem.video.type,
+ initDataType: contentitem.initDataType,
+ testcase: 'single key, clear then encrypted content',
+ duration: 4 };
+
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-encrypted-clear-sources.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-encrypted-clear-sources.html
new file mode 100644
index 00000000000..491e32a6fe8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-encrypted-clear-sources.html
@@ -0,0 +1,59 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <meta name="timeout" content="long">
+ <title>Encrypted Media Extensions: Successful Playback, alternate Encrypted and Clear playbacks, Temporary, mp4, DRM</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for DRM -->
+ <script src=/encrypted-media/util/drm-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/playback-temporary-encrypted-clear-sources.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var keysystem = getSupportedKeySystem(),
+ encryptedcontentitem = content['mp4-basic'],
+ clearcontentitem = content['mp4-clear'],
+ handler = new MessageHandler(keysystem, encryptedcontentitem),
+ configEncrypted = { video: document.getElementById('videoelement'),
+ keysystem: keysystem,
+ messagehandler: handler.messagehandler,
+ audioPath: encryptedcontentitem.audio.path,
+ videoPath: encryptedcontentitem.video.path,
+ audioType: encryptedcontentitem.audio.type,
+ videoType: encryptedcontentitem.video.type,
+ initDataType: encryptedcontentitem.initDataType
+ },
+ configClear = { audioPath: clearcontentitem.audio.path,
+ videoPath: clearcontentitem.video.path,
+ audioType: clearcontentitem.audio.type,
+ videoType: clearcontentitem.video.type,
+ };
+
+ runTest(configEncrypted,configClear);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-encrypted-clear.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-encrypted-clear.html
new file mode 100644
index 00000000000..ed5ff23632e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-encrypted-clear.html
@@ -0,0 +1,53 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4, encrypted then clear</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for DRM servers -->
+ <script src=/encrypted-media/util/drm-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/playback-temporary.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var keysystem = getSupportedKeySystem(),
+ contentitem = content['mp4-encrypted-clear'],
+ handler = new MessageHandler(keysystem, contentitem),
+ config = { video: document.getElementById('videoelement'),
+ keysystem: keysystem,
+ messagehandler: handler.messagehandler,
+ audioPath: contentitem.audio.path,
+ videoPath: contentitem.video.path,
+ audioType: contentitem.audio.type,
+ videoType: contentitem.video.type,
+ initDataType: contentitem.initDataType,
+ testcase: 'single key, clear then encrypted content',
+ duration: 4 };
+
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-expired.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-expired.html
new file mode 100644
index 00000000000..a87687fbaca
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-expired.html
@@ -0,0 +1,53 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <meta name="timeout" content="long">
+ <title>Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4, expired license</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for DRM servers -->
+ <script src=/encrypted-media/util/drm-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/playback-temporary-expired.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var keysystem = getSupportedKeySystem(),
+ contentitem = content['mp4-basic'],
+ handler = new MessageHandler(keysystem, contentitem),
+ config = { video: document.getElementById('videoelement'),
+ keysystem: keysystem,
+ messagehandler: handler.messagehandler,
+ audioPath: contentitem.audio.path,
+ videoPath: contentitem.video.path,
+ audioType: contentitem.audio.type,
+ videoType: contentitem.video.type,
+ initDataType: contentitem.initDataType
+ };
+
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-multikey-sequential-readyState.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-multikey-sequential-readyState.html
new file mode 100644
index 00000000000..42d563a5de3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-multikey-sequential-readyState.html
@@ -0,0 +1,58 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <meta name="timeout" content="long">
+ <title>Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4, multiple keys in sequence, check readyState</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for Clear Key keysystem -->
+ <script src=/encrypted-media/util/drm-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/playback-temporary-multikey-sequential.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var keysystem = getSupportedKeySystem(),
+ contentitem = content['mp4-multikey-sequential'],
+ handler = new MessageHandler(keysystem, contentitem),
+ initdatas = getProprietaryInitDatas(contentitem),
+ config = { video: document.getElementById('videoelement'),
+ keysystem: keysystem,
+ messagehandler: handler.messagehandler,
+ audioPath: contentitem.audio.path,
+ videoPath: contentitem.video.path,
+ audioType: contentitem.audio.type,
+ videoType: contentitem.video.type,
+ initDataType: contentitem.initDataType,
+ initData: initdatas.initDatas.map(base64DecodeToUnit8Array),
+ variantIds: initdatas.variantIds,
+ duration: 5,
+ checkReadyState: true
+ };
+
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-multikey-sequential.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-multikey-sequential.html
new file mode 100644
index 00000000000..0b23721b6fa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-multikey-sequential.html
@@ -0,0 +1,57 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <meta name="timeout" content="long">
+ <title>Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4, multiple keys in sequence</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for Clear Key keysystem -->
+ <script src=/encrypted-media/util/drm-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/playback-temporary-multikey-sequential.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var keysystem = getSupportedKeySystem(),
+ contentitem = content['mp4-multikey-sequential'],
+ handler = new MessageHandler( keysystem, contentitem ),
+ initdatas = getProprietaryInitDatas(contentitem),
+ config = { video: document.getElementById('videoelement'),
+ keysystem: keysystem,
+ messagehandler: handler.messagehandler,
+ audioPath: contentitem.audio.path,
+ videoPath: contentitem.video.path,
+ audioType: contentitem.audio.type,
+ videoType: contentitem.video.type,
+ initDataType: contentitem.initDataType,
+ initData: initdatas.initDatas.map(base64DecodeToUnit8Array),
+ variantIds: initdatas.variantIds,
+ duration: 5
+ };
+
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-multisession.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-multisession.html
index 4289af4a3c4..391ebf90724 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-multisession.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-multisession.html
@@ -36,6 +36,7 @@
var keysystem = getSupportedKeySystem(),
contentitem = content['mp4-multikey'],
handler = new MessageHandler( keysystem, contentitem ),
+ proprietaryInitDatas = getProprietaryInitDatas(contentitem),
config = { video: document.getElementById('videoelement'),
keysystem: keysystem,
messagehandler: handler.messagehandler,
@@ -44,7 +45,8 @@
audioType: contentitem.audio.type,
videoType: contentitem.video.type,
initDataType: contentitem.initDataType,
- initData: getProprietaryInitDatas(contentitem).initDatas.map( base64DecodeToUnit8Array ),
+ initData: proprietaryInitDatas.initDatas.map( base64DecodeToUnit8Array ),
+ variantIds: proprietaryInitDatas.variantIds,
testcase: 'multikey video' };
runTest(config);
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-two-videos.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-two-videos.html
index 6109662b765..1aafba40fbd 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-two-videos.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-playback-temporary-two-videos.html
@@ -2,7 +2,7 @@
<html>
<head>
<meta charset=utf-8>
- <title>Encrypted Media Extensions: Successful Playback, Temporary session with Clear Key, mp4, two videos</title>
+ <title>Encrypted Media Extensions: Successful Playback, Temporary session with DRM, mp4, two videos</title>
<link rel="help" href="https://w3c.github.io/encrypted-media/">
<!-- Web Platform Test Harness scripts -->
@@ -18,7 +18,7 @@
<!-- Content metadata -->
<script src=/encrypted-media/content/content-metadata.js></script>
- <!-- Message handler for Clear Key keysystem -->
+ <!-- Message handler for DRM server -->
<script src=/encrypted-media/util/drm-messagehandler.js></script>
<!-- The script for this specific test -->
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-requestmediakeysystemaccess.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-requestmediakeysystemaccess.html
new file mode 100644
index 00000000000..2656f8feb55
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-requestmediakeysystemaccess.html
@@ -0,0 +1,41 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <meta name="timeout" content="long">
+ <title>Encrypted Media Extensions: requestMediaKeySystemAccess tests, DRM</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/requestmediakeysystemaccess.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <script>
+ var contentitem = content['mp4-basic'],
+ keySystem = getSupportedKeySystem(),
+ config = { keysystem: keySystem,
+ audioType: contentitem.audio.type,
+ videoType: contentitem.video.type,
+ initDataType: getSupportedInitDataTypes( keySystem )[ 0 ]
+ };
+
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-reset-src-after-setmediakeys.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-reset-src-after-setmediakeys.html
new file mode 100644
index 00000000000..b91211df444
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-reset-src-after-setmediakeys.html
@@ -0,0 +1,46 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions - Reset MediaSource after setMediaKeys for DRM, mp4</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/reset-src-after-setmediakeys.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var contentItem = content['mp4-av-multikey'],
+ keysystem = getSupportedKeySystem(),
+ config = {
+ video: document.getElementById('videoelement'),
+ keysystem: keysystem,
+ content: contentItem,
+ initDataType: contentItem.initDataType,
+ audioType: contentItem.audio.type,
+ videoType: contentItem.video.type,
+ audioPath: contentItem.audio.path,
+ videoPath: contentItem.video.path,
+ };
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-again-after-playback.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-again-after-playback.html
new file mode 100644
index 00000000000..d215036fae7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-again-after-playback.html
@@ -0,0 +1,52 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: setMediaKeys again after playback with DRM</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for DRM servers -->
+ <script src=/encrypted-media/util/drm-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/setmediakeys-again-after-playback.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var keysystem = getSupportedKeySystem(),
+ contentitem = content['mp4-basic'],
+ handler = new MessageHandler(keysystem, contentitem );
+ getSupportedContent( keysystem ).then( function( contents ) {
+ runTest( { video: document.getElementById('videoelement'),
+ keysystem: keysystem,
+ messagehandler: handler.messagehandler,
+ content: contentitem,
+ audioPath: contentitem.audio.path,
+ videoPath: contentitem.video.path,
+ audioType: contentitem.audio.type,
+ videoType: contentitem.video.type
+ } );
+ } );
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-again-after-resetting-src.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-again-after-resetting-src.html
new file mode 100644
index 00000000000..d1723b5ce9c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-again-after-resetting-src.html
@@ -0,0 +1,52 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: setMediaKeys again after resetting src attribute on video element with DRM</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for DRM servers -->
+ <script src=/encrypted-media/util/drm-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/setmediakeys-again-after-resetting-src.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var keysystem = getSupportedKeySystem(),
+ contentitem = content['mp4-basic'],
+ handler = new MessageHandler(keysystem, contentitem );
+ getSupportedContent( keysystem ).then( function( contents ) {
+ runTest( { video: document.getElementById('videoelement'),
+ keysystem: keysystem,
+ messagehandler: handler.messagehandler,
+ content: contentitem,
+ audioPath: contentitem.audio.path,
+ videoPath: contentitem.video.path,
+ audioType: contentitem.audio.type,
+ videoType: contentitem.video.type
+ } );
+ } );
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-at-same-time.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-at-same-time.html
new file mode 100644
index 00000000000..581d22f4af0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-at-same-time.html
@@ -0,0 +1,44 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: setMediaKeys multiple at same time with DRM</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for DRM servers -->
+ <script src=/encrypted-media/util/drm-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/setmediakeys-at-same-time.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var keysystem = getSupportedKeySystem();
+ getSupportedContent( keysystem ).then( function( contents ) {
+ runTest( { video: document.getElementById('videoelement'),
+ keysystem: keysystem,
+ content: contents[ 0 ]
+ } );
+ } );
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-multiple-times-with-different-mediakeys.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-multiple-times-with-different-mediakeys.html
new file mode 100644
index 00000000000..7d3fe096383
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-multiple-times-with-different-mediakeys.html
@@ -0,0 +1,50 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: setMediaKeys multiple times with different mediakeys with DRM</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for DRM servers -->
+ <script src=/encrypted-media/util/drm-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/setmediakeys-multiple-times-with-different-mediakeys.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var keysystem = getSupportedKeySystem(),
+ contentitem = content['mp4-basic'];
+ getSupportedContent( keysystem ).then( function( contents ) {
+ runTest( { video: document.getElementById('videoelement'),
+ keysystem: keysystem,
+ content: contentitem,
+ audioPath: contentitem.audio.path,
+ videoPath: contentitem.video.path,
+ audioType: contentitem.audio.type,
+ videoType: contentitem.video.type
+ } );
+ } );
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-multiple-times-with-the-same-mediakeys.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-multiple-times-with-the-same-mediakeys.html
new file mode 100644
index 00000000000..efc6d19780d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-multiple-times-with-the-same-mediakeys.html
@@ -0,0 +1,50 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: setMediaKeys multiple times with the same mediakeys with DRM</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for DRM servers -->
+ <script src=/encrypted-media/util/drm-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/setmediakeys-multiple-times-with-the-same-mediakeys.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var keysystem = getSupportedKeySystem(),
+ contentitem = content['mp4-basic'];
+ getSupportedContent( keysystem ).then( function( contents ) {
+ runTest( { video: document.getElementById('videoelement'),
+ keysystem: keysystem,
+ content: contentitem,
+ audioPath: contentitem.audio.path,
+ videoPath: contentitem.video.path,
+ audioType: contentitem.audio.type,
+ videoType: contentitem.video.type
+ } );
+ } );
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-to-multiple-video-elements.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-to-multiple-video-elements.html
new file mode 100644
index 00000000000..bd78cb930de
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys-to-multiple-video-elements.html
@@ -0,0 +1,48 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: setMediaKeys to multiple video elements with DRM</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for DRM servers -->
+ <script src=/encrypted-media/util/drm-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/setmediakeys-to-multiple-video-elements.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video1'>
+ <video id="videoelement1" width="200px"></video>
+ </div>
+ <div id='video2'>
+ <video id="videoelement2" width="200px"></video>
+ </div>
+
+ <script>
+ var keysystem = getSupportedKeySystem();
+ getSupportedContent( keysystem ).then( function( contents ) {
+ runTest( { video1: document.getElementById('videoelement1'),
+ video2: document.getElementById('videoelement2'),
+ keysystem: keysystem,
+ content: contents[ 0 ]
+ } );
+ } );
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys.html
new file mode 100644
index 00000000000..1a74a6236a6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-setmediakeys.html
@@ -0,0 +1,44 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: setMediaKeys with DRM</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for DRM servers -->
+ <script src=/encrypted-media/util/drm-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/setmediakeys.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var keysystem = getSupportedKeySystem();
+ getSupportedContent( keysystem ).then( function( contents ) {
+ runTest( { video: document.getElementById('videoelement'),
+ keysystem: keysystem,
+ content: contents[ 0 ]
+ } );
+ } );
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-syntax-mediakeys.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-syntax-mediakeys.html
new file mode 100644
index 00000000000..f6d03926132
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-syntax-mediakeys.html
@@ -0,0 +1,43 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions - Test MediaKeys attribute, setServerCertificate and setServerCertificate exception syntax for DRM, mp4</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/syntax-mediakeys.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+ <script>
+ var keysystem = getSupportedKeySystem();
+ var contentItem = content['mp4-basic'],
+ config = {
+ keysystem: keysystem,
+ content: contentItem,
+ initData: stringToUint8Array(atob(contentItem.keys[0].initData)),
+ initDataType: contentItem.initDataType,
+ audioType: contentItem.audio.type,
+ videoType: contentItem.video.type
+ };
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-syntax-mediakeysession.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-syntax-mediakeysession.html
new file mode 100644
index 00000000000..0c737df9eff
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-syntax-mediakeysession.html
@@ -0,0 +1,43 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions - Test MediaKeySession attribute and function syntax for DRM, mp4</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/syntax-mediakeysession.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+ <script>
+ var keysystem = getSupportedKeySystem();
+ var contentItem = content['mp4-basic'],
+ config = {
+ keysystem: keysystem,
+ content: contentItem,
+ initData: stringToUint8Array(atob(contentItem.keys[0].initData)),
+ initDataType: contentItem.initDataType,
+ audioType: contentItem.audio.type,
+ videoType: contentItem.video.type
+ };
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-syntax-mediakeysystemaccess.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-syntax-mediakeysystemaccess.html
new file mode 100644
index 00000000000..d54e1943765
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-syntax-mediakeysystemaccess.html
@@ -0,0 +1,43 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions - Test navigator.requestmediakeysystemaccess exception and MediaKeySystemAccess attribute syntax for DRM, mp4</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/syntax-mediakeysystemaccess.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+ <script>
+ var keysystem = getSupportedKeySystem();
+ var contentItem = content['mp4-basic'],
+ config = {
+ keysystem: keysystem,
+ content: contentItem,
+ initData: stringToUint8Array(atob(contentItem.keys[0].initData)),
+ initDataType: contentItem.initDataType,
+ audioType: contentItem.audio.type,
+ videoType: contentItem.video.type
+ };
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-unique-origin.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-unique-origin.html
new file mode 100644
index 00000000000..a344ae5c070
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-unique-origin.html
@@ -0,0 +1,44 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: Unique origin with DRM, mp4</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/unique-origin.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var contentItem = content['mp4-av-multikey'],
+ keysystem = getSupportedKeySystem(),
+ config = {
+ video: document.getElementById('videoelement'),
+ keysystem: keysystem,
+ initDataType: contentItem.initDataType,
+ audioType: contentItem.audio.type,
+ videoType: contentItem.video.type,
+ audioPath: contentItem.audio.path,
+ videoPath: contentItem.video.path
+ };
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-waiting-for-a-key.html b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-waiting-for-a-key.html
new file mode 100644
index 00000000000..508afcacb15
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-mp4-waiting-for-a-key.html
@@ -0,0 +1,52 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions - Waiting for a key for DRM, mp4</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+
+ <!-- Message handler for DRM servers -->
+ <script src=/encrypted-media/util/drm-messagehandler.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/waiting-for-a-key.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+ <div id='video'>
+ <video id="videoelement" width="200px"></video>
+ </div>
+
+ <script>
+ var contentItem = content['mp4-basic'],
+ keysystem = getSupportedKeySystem(),
+ handler = new MessageHandler( keysystem, contentItem ),
+ config = {
+ video: document.getElementById('videoelement'),
+ keysystem: keysystem,
+ content: contentItem,
+ messageHandler: handler.messagehandler,
+ initDataType: contentItem.initDataType,
+ audioType: contentItem.audio.type,
+ videoType: contentItem.video.type,
+ audioPath: contentItem.audio.path,
+ videoPath: contentItem.video.path,
+ };
+ runTest(config);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-not-callable-after-createsession.html b/tests/wpt/web-platform-tests/encrypted-media/drm-not-callable-after-createsession.html
index e147560248c..22d9a1359ec 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/drm-not-callable-after-createsession.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-not-callable-after-createsession.html
@@ -2,7 +2,7 @@
<html>
<head>
<meta charset=utf-8>
- <title>Encrypted Media Extensions: Test MediaKeySession not callable immediately after CreateSession().</title>
+ <title>Encrypted Media Extensions: Test MediaKeySession not callable immediately after CreateSession(), DRM.</title>
<link rel="help" href="https://w3c.github.io/encrypted-media/">
<!-- Web Platform Test Harness scripts -->
@@ -14,8 +14,8 @@
<script src=/encrypted-media/util/utf8.js></script>
<script src=/encrypted-media/util/fetch.js></script>
- <!-- Message handler for Clear Key -->
- <script src=/encrypted-media/util/clearkey-messagehandler.js></script>
+ <!-- Message handler for DRM server -->
+ <script src=/encrypted-media/util/drm-messagehandler.js></script>
<!-- The script for this specific test -->
<script src=/encrypted-media/scripts/not-callable-after-createsession.js></script>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/drm-temporary-license-type.html b/tests/wpt/web-platform-tests/encrypted-media/drm-temporary-license-type.html
new file mode 100644
index 00000000000..a4b54dac3b8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/drm-temporary-license-type.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Encrypted Media Extensions: Test that persistent license cannot be ingested into temporary session</title>
+ <link rel="help" href="https://w3c.github.io/encrypted-media/">
+
+ <!-- Web Platform Test Harness scripts -->
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+
+ <!-- Helper scripts for Encrypted Media Extensions tests -->
+ <script src=/encrypted-media/util/utils.js></script>
+ <script src=/encrypted-media/util/utf8.js></script>
+ <script src=/encrypted-media/util/fetch.js></script>
+ <script src=/encrypted-media/util/testmediasource.js></script>
+
+ <!-- Content metadata -->
+ <script src=/encrypted-media/content/content-metadata.js></script>
+
+ <!-- Message handler for DRM servers -->
+ <script src=/encrypted-media/util/drm-messagehandler.js></script>
+
+ <!-- The script for this specific test -->
+ <script src=/encrypted-media/scripts/temporary-license-type.js></script>
+
+ </head>
+ <body>
+ <div id='log'></div>
+
+ <script>
+ var keysystem = getSupportedKeySystem();
+
+ getSupportedContentAndInitDataTypes( keysystem )
+ .then( function( supported )
+ {
+ // This test requires initData for supported content.
+ // We prefer explicit initData configured for the content, but
+ // otherwise we will generate initData for a supported initDataType
+ // FIXME: Move me to a utility function
+ var content,
+ initDataType,
+ initData;
+
+ var contentWithExplicitInitData = supported.filter( function( s ) { return s.content.keys && s.content.initDataType; } );
+ if ( contentWithExplicitInitData.length > 0 )
+ {
+ content = contentWithExplicitInitData[ 0 ].content;
+ initDataType = content.keys[ 0 ].initDataType;
+ initData = base64DecodeToUnit8Array( content.keys[ 0 ].initData );
+ }
+ else
+ {
+ content = supported[ 0 ].content;
+ initDataType = supported[ 0 ].initDataTypes[ 0 ];
+ initData = getInitData( content, initDataType );
+ }
+
+ var handler = new MessageHandler( keysystem, content, 'persistent-license' );
+
+ runTest( { keysystem: keysystem,
+ content: content,
+ messagehandler: handler.messagehandler,
+ initDataType: initDataType,
+ initData: initData
+ } );
+ } );
+
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/polyfill/chrome-polyfill.js b/tests/wpt/web-platform-tests/encrypted-media/polyfill/chrome-polyfill.js
index 346da6c67cc..2f11497ccaf 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/polyfill/chrome-polyfill.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/polyfill/chrome-polyfill.js
@@ -1,5 +1,6 @@
(function(){
- if(navigator.userAgent.toLowerCase().indexOf('chrome') > -1){
+ if( navigator.userAgent.toLowerCase().indexOf('edge') === -1
+ && navigator.userAgent.toLowerCase().indexOf('chrome') > -1){
if ( ( /chrome\/([0-9]*)\./.exec( navigator.userAgent.toLowerCase() )[1] | 0 ) < 54 ) {
diff --git a/tests/wpt/web-platform-tests/encrypted-media/polyfill/edge-keystatuses.js b/tests/wpt/web-platform-tests/encrypted-media/polyfill/edge-keystatuses.js
new file mode 100644
index 00000000000..8861444591b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/polyfill/edge-keystatuses.js
@@ -0,0 +1,144 @@
+(function() {
+
+ // This polyfill fixes the following problems with Edge browser
+ // (1) Various maplike methods for keystatuses are not supported or suported incorrectly
+ // (2) Key Ids exposed in keystatuses are incorrect (byte swaps)
+ if ( navigator.userAgent.toLowerCase().indexOf('edge') > -1 ) {
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ // The following function is the core of this JS patch. The rest of this file is infrastructure
+ // required to enable this function
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ function _proxyKeyStatusesChange( event ) {
+ this._keyStatuses.clear();
+ var keyStatuses = [];
+ this._session.keyStatuses.forEach( function( keyId, status ) {
+ var newKeyId = new Uint8Array( keyId );
+
+ function swap( arr, a, b ) { var t = arr[a]; arr[a] = arr[b]; arr[b] = t; }
+ swap( newKeyId, 0, 3 );
+ swap( newKeyId, 1, 2 );
+ swap( newKeyId, 4, 5 );
+ swap( newKeyId, 6, 7 );
+
+ keyStatuses.push( { key: newKeyId, status: status, ord: arrayBufferAsString( newKeyId ) } );
+ });
+
+ function lexicographical( a, b ) { return a < b ? -1 : a === b ? 0 : +1; }
+ function lexicographicalkey( a, b ) { return lexicographical( a.ord, b.ord ); }
+
+ keyStatuses.sort( lexicographicalkey ).forEach( function( obj ) {
+ this._keyStatuses._set( obj.key, obj.status );
+ }.bind( this ) );
+
+ this.dispatchEvent( event );
+ };
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+
+ // Override MediaKeys.createSession
+ var _mediaKeysCreateSession = MediaKeys.prototype.createSession;
+ MediaKeys.prototype.createSession = function ( sessionType ) {
+ return new MediaKeySession( _mediaKeysCreateSession.call( this, sessionType ) );
+ };
+
+ // MediaKeySession proxy
+ function MediaKeySession( session ) {
+ EventTarget.call( this );
+ this._session = session;
+ this._keyStatuses = new MediaKeyStatusMap();
+ this._session.addEventListener("keystatuseschange",this._onKeyStatusesChange.bind(this));
+ this._session.addEventListener("message",this.dispatchEvent.bind(this));
+ }
+
+ MediaKeySession.prototype = Object.create( EventTarget.prototype );
+
+ Object.defineProperties( MediaKeySession.prototype, {
+ sessionId: { get: function() { return this._session.sessionId; } },
+ expiration: { get: function() { return this._session.expiration; } },
+ closed: { get: function() { return this._session.closed; } },
+ keyStatuses:{ get: function() { return this._keyStatuses; } }
+ });
+
+ [ "generateRequest", "load", "update", "remove", "close" ].forEach( function( fnname ) {
+ MediaKeySession.prototype[ fnname ] = function() {
+ return window.MediaKeySession.prototype[ fnname ].apply( this._session, arguments );
+ }
+ } );
+
+ MediaKeySession.prototype._onKeyStatusesChange = _proxyKeyStatusesChange;
+
+ // MediaKeyStatusMap proxy
+ //
+ // We need a proxy class to replace the broken MediaKeyStatusMap one. We cannot use a
+ // regular Map directly because we need get and has methods to compare by value not
+ // as references.
+ function MediaKeyStatusMap() { this._map = new Map(); }
+
+ Object.defineProperties( MediaKeyStatusMap.prototype, {
+ size: { get: function() { return this._map.size; } },
+ forEach: { get: function() { return function( f ) { return this._map.forEach( f ); } } },
+ entries: { get: function() { return function() { return this._map.entries(); } } },
+ values: { get: function() { return function() { return this._map.values(); } } },
+ keys: { get: function() { return function() { return this._map.keys(); } } },
+ clear: { get: function() { return function() { return this._map.clear(); } } } } );
+
+ MediaKeyStatusMap.prototype[ Symbol.iterator ] = function() { return this._map[ Symbol.iterator ]() };
+
+ MediaKeyStatusMap.prototype.has = function has( keyId ) {
+ for ( var k of this._map.keys() ) { if ( arrayBufferEqual( k, keyId ) ) return true; }
+ return false;
+ };
+
+ MediaKeyStatusMap.prototype.get = function get( keyId ) {
+ for ( var k of this._map.entries() ) { if ( arrayBufferEqual( k[ 0 ], keyId ) ) return k[ 1 ]; }
+ };
+
+ MediaKeyStatusMap.prototype._set = function _set( keyId, status ) {
+ this._map.set( new Uint8Array( keyId ), status );
+ };
+
+ function arrayBufferEqual(buf1, buf2)
+ {
+ if (buf1.byteLength !== buf2.byteLength) return false;
+ var a1 = Array.from( new Int8Array(buf1) ), a2 = Array.from( new Int8Array(buf2) );
+ return a1.every( function( x, i ) { return x === a2[i]; } );
+ }
+
+ // EventTarget
+ function EventTarget(){
+ this.listeners = {};
+ };
+
+ EventTarget.prototype.listeners = null;
+
+ EventTarget.prototype.addEventListener = function(type, callback){
+ if(!(type in this.listeners)) {
+ this.listeners[type] = [];
+ }
+ this.listeners[type].push(callback);
+ };
+
+ EventTarget.prototype.removeEventListener = function(type, callback){
+ if(!(type in this.listeners)) {
+ return;
+ }
+ var stack = this.listeners[type];
+ for(var i = 0, l = stack.length; i < l; i++){
+ if(stack[i] === callback){
+ stack.splice(i, 1);
+ return this.removeEventListener(type, callback);
+ }
+ }
+ };
+
+ EventTarget.prototype.dispatchEvent = function(event){
+ if(!(event.type in this.listeners)) {
+ return;
+ }
+ var stack = this.listeners[event.type];
+ event.target = this;
+ for(var i = 0, l = stack.length; i < l; i++) {
+ stack[i].call(this, event);
+ }
+ };
+ }
+})();
diff --git a/tests/wpt/web-platform-tests/encrypted-media/polyfill/edge-polyfill.js b/tests/wpt/web-platform-tests/encrypted-media/polyfill/edge-persistent-usage-record.js
index 7f86f0c0589..7f86f0c0589 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/polyfill/edge-polyfill.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/polyfill/edge-persistent-usage-record.js
diff --git a/tests/wpt/web-platform-tests/encrypted-media/polyfill/firefox-polyfill.js b/tests/wpt/web-platform-tests/encrypted-media/polyfill/firefox-polyfill.js
index 0e42187971f..ce241af362a 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/polyfill/firefox-polyfill.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/polyfill/firefox-polyfill.js
@@ -20,4 +20,4 @@
return _requestMediaKeySystemAccess( keysystem, supported_configurations );
}
}
-}()) \ No newline at end of file
+}()); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/encrypted-media/polyfill/make-polyfill-tests.py b/tests/wpt/web-platform-tests/encrypted-media/polyfill/make-polyfill-tests.py
index 7e7dc496e80..b4248569a92 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/polyfill/make-polyfill-tests.py
+++ b/tests/wpt/web-platform-tests/encrypted-media/polyfill/make-polyfill-tests.py
@@ -8,7 +8,8 @@ scripts = '''
<!-- Polyfill files (NOTE: These are added by auto-generation script) -->
<script src=/encrypted-media/polyfill/chrome-polyfill.js></script>
<script src=/encrypted-media/polyfill/firefox-polyfill.js></script>
- <script src=/encrypted-media/polyfill/edge-polyfill.js></script>
+ <script src=/encrypted-media/polyfill/edge-persistent-usage-record.js></script>
+ <script src=/encrypted-media/polyfill/edge-keystatuses.js></script>
<script src=/encrypted-media/polyfill/clearkey-polyfill.js></script>'''
def process_file( infile, outfile ) :
diff --git a/tests/wpt/web-platform-tests/encrypted-media/resources/drm-retrieve-destroy-persistent-license.html b/tests/wpt/web-platform-tests/encrypted-media/resources/drm-retrieve-destroy-persistent-license.html
index 21a05e87943..39798fe43ef 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/resources/drm-retrieve-destroy-persistent-license.html
+++ b/tests/wpt/web-platform-tests/encrypted-media/resources/drm-retrieve-destroy-persistent-license.html
@@ -24,44 +24,44 @@
<script>
// Wait for a message from the main window with details of our task
- window.addEventListener( 'message', function( event ) {
+ window.addEventListener('message', function(event) {
var config = event.data.config,
- configuration = { initDataTypes: [ config.initDataType ],
- audioCapabilities: [ { contentType: config.audioType } ],
- videoCapabilities: [ { contentType: config.videoType } ],
- sessionTypes: [ 'persistent-license' ] },
- assertions = [ ];
+ configuration = { initDataTypes: [config.initDataType],
+ audioCapabilities: [{contentType: config.audioType}],
+ videoCapabilities: [{contentType: config.videoType}],
+ sessionTypes: ['persistent-license']},
+ assertions = [];
var _mediaKeys,
_mediaKeySession;
config.video = document.getElementById('videoelement');
- config.messagehandler = (new MessageHandler( config.keysystem, undefined, 'persistent-license' ) ).messagehandler;
+ config.messagehandler = (new MessageHandler(config.keysystem, config.content, 'persistent-license')).messagehandler;
-function onComplete() {
+ function onComplete() {
window.opener.postMessage(assertions, '*');
}
function onFailure(error) {
- assertions.push( { actual: false, expected: true, message: error.toString() } );
+ assertions.push({actual: false, expected: true, message: error.toString()});
onComplete();
}
function onMessage( messageevent )
{
- assertions.push( { expected: true, actual: messageevent instanceof window.MediaKeyMessageEvent, message: "event is of correct class" } );
- assertions.push( { expected: 'message', actual: messageevent.type, message: "event type is message" } );
- assertions.push( { expected: 'license-release', actual: messageevent.messageType, message: "message type is license-release" } );
-
- config.messagehandler( messageevent.messageType, messageevent.message )
- .then( function( response ) {
- messageevent.target.update( response ).catch(onFailure);
- });
+ assertions.push({expected: true, actual: messageevent instanceof window.MediaKeyMessageEvent, message: "event is of correct class"});
+ assertions.push({expected: 'message', actual: messageevent.type, message: "event type is message"});
+ assertions.push({expected: 'license-release', actual: messageevent.messageType, message: "message type is license-release"});
+
+ config.messagehandler(messageevent.messageType, messageevent.message)
+ .then( function(response) {
+ return messageevent.target.update(response);
+ }).catch(onFailure);
}
function onTimeupdate(event) {
- if ( config.video.currentTime > ( config.duration || 1 ) ) {
+ if (config.video.currentTime > (config.duration || 1)) {
config.video.pause();
config.video.removeAttribute('src');
config.video.load();
@@ -71,14 +71,14 @@ function onComplete() {
function onClosed() {
// Try and reload and check this fails
- var mediaKeySession = _mediaKeys.createSession( 'persistent-license' );
- mediaKeySession.load( event.data.sessionId ).then( function( success ) {
- assertions.push( { expected: false, actual: success, message: "Load of removed session should fail" } );
+ var mediaKeySession = _mediaKeys.createSession('persistent-license');
+ mediaKeySession.load(event.data.sessionId ).then( function(success) {
+ assertions.push({expected: false, actual: success, message: "Load of removed session should fail"});
onComplete();
}).catch(onFailure);
}
- navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ] )
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration] )
.then(function(access) {
return access.createMediaKeys();
}).then(function(mediaKeys) {
@@ -86,13 +86,13 @@ function onComplete() {
return config.video.setMediaKeys(mediaKeys);
}).then(function() {
config.video.addEventListener('timeupdate', onTimeupdate, true);
- _mediaKeySession = _mediaKeys.createSession( 'persistent-license' );
- _mediaKeySession.addEventListener( 'message', onMessage );
+ _mediaKeySession = _mediaKeys.createSession('persistent-license');
+ _mediaKeySession.addEventListener('message', onMessage);
_mediaKeySession.closed.then(onClosed);
- return _mediaKeySession.load( event.data.sessionId );
- }).then(function( success ) {
- assertions.push( { actual: success, expected: true, message: "Expect load session to succeed" } );
- if ( !success ) throw new DOMException();
+ return _mediaKeySession.load(event.data.sessionId);
+ }).then(function(success) {
+ assertions.push({actual: success, expected: true, message: "Expect load session to succeed"});
+ if (!success) throw new DOMException();
return testmediasource(config);
}).then(function(source) {
config.video.src = URL.createObjectURL(source);
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/clearkey-update-non-ascii-input.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/clearkey-update-non-ascii-input.js
new file mode 100644
index 00000000000..b34c493fd11
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/clearkey-update-non-ascii-input.js
@@ -0,0 +1,48 @@
+// This test is only applicable to clearkey
+function runTest(config, qualifier)
+{
+ var testname = testnamePrefix(qualifier, config.keysystem) + ' test handling of non-ASCII responses for update()';
+
+ var configuration = getSimpleConfigurationForContent(config.content);
+
+ if (config.initDataType) {
+ configuration.initDataTypes = [config.initDataType];
+ }
+
+ promise_test(function (test) {
+ var initDataType;
+ var initData;
+ var mediaKeySession;
+ var messageEventFired = false;
+
+ return navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function (access) {
+ initDataType = access.getConfiguration().initDataTypes[0];
+ initData = getInitData(config.content, initDataType);
+ return access.createMediaKeys();
+ }).then(function (mediaKeys) {
+ mediaKeySession = mediaKeys.createSession();
+ var eventWatcher = new EventWatcher(test, mediaKeySession, ['message']);
+ var promise = eventWatcher.wait_for('message');
+ mediaKeySession.generateRequest(initDataType, initData);
+ return promise;
+ }).then(function (messageEvent) {
+ // |jwkSet| contains a non-ASCII character \uDC00.
+ var jwkSet = '{"keys":[{'
+ + '"kty":"oct",'
+ + '"k":"MDEyMzQ1Njc4OTAxMjM0NQ",'
+ + '"kid":"MDEyMzQ1Njc4O\uDC00TAxMjM0NQ"'
+ + '}]}';
+ messageEventFired = true;
+ return messageEvent.target.update(stringToUint8Array(jwkSet));
+ }).then(function () {
+ assert_unreached('Error: update() should fail because the processed message has non-ASCII character.');
+ }).catch(function (error) {
+ if(messageEventFired){
+ assert_equals(error.name, 'TypeError');
+ }
+ else {
+ assert_unreached('Error: ' + error.name);
+ }
+ });
+ }, testname);
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/events-session-closed-event.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/events-session-closed-event.js
new file mode 100644
index 00000000000..44f683eac85
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/events-session-closed-event.js
@@ -0,0 +1,52 @@
+function runTest(config, qualifier)
+{
+ var testname = testnamePrefix(qualifier, config.keysystem) + ' test MediaKeySession closed event.';
+
+ var configuration = {
+ initDataTypes: [config.initDataType],
+ audioCapabilities: [{
+ contentType: config.audioType
+ }],
+ videoCapabilities: [{
+ contentType: config.videoType
+ }],
+ sessionTypes: ['temporary']
+ };
+
+ promise_test(function (test) {
+ var initDataType;
+ var initData;
+ var mediaKeySession;
+
+ return navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function (access) {
+ initDataType = access.getConfiguration().initDataTypes[0];
+ return access.createMediaKeys();
+ }).then(function (mediaKeys) {
+ mediaKeySession = mediaKeys.createSession();
+ if(config.initData) {
+ initData = config.initData;
+ } else {
+ initData = stringToUint8Array(atob(config.content.keys[0].initData));
+ }
+ return mediaKeySession.generateRequest(initDataType, initData);
+ }).then(function() {
+ // close() should result in the closed promise being
+ // fulfilled.
+ return mediaKeySession.close();
+ }).then(function (result) {
+ assert_equals(result, undefined);
+ // Wait for the session to be closed.
+ return mediaKeySession.closed;
+ }).then(function (result) {
+ assert_equals(result, undefined);
+ // Now that the session is closed, verify that the
+ // closed attribute immediately returns a fulfilled
+ // promise.
+ return mediaKeySession.closed;
+ }).then(function (result) {
+ assert_equals(result, undefined);
+ }).catch(function(error) {
+ assert_unreached('Error: ' + error.name);
+ });
+ }, testname);
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/events.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/events.js
index 5286ac0c75c..85c86ae78d1 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/scripts/events.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/events.js
@@ -1,10 +1,12 @@
function runTest(config,qualifier) {
- var testname = testnamePrefix( qualifier, config.keysystem ) + ', basic events';
+ var testname = testnamePrefix(qualifier, config.keysystem) + ', basic events';
- var configuration = getSimpleConfigurationForContent( config.content );
+ var configuration = getSimpleConfigurationForContent(config.content);
- if ( config.initDataType && config.initData ) configuration.initDataTypes = [ config.initDataType ]
+ if (config.initDataType && config.initData) {
+ configuration.initDataTypes = [config.initDataType];
+ }
async_test(function(test)
{
@@ -12,21 +14,21 @@ function runTest(config,qualifier) {
var initData;
var mediaKeySession;
+ function onFailure(error) {
+ forceTestFailureFromPromise(test, error);
+ }
+
function processMessage(event)
{
assert_true(event instanceof window.MediaKeyMessageEvent);
assert_equals(event.target, mediaKeySession);
assert_equals(event.type, 'message');
- assert_any( assert_equals,
- event.messageType,
- [ 'license-request', 'individualization-request' ] );
+ assert_in_array(event.messageType,['license-request', 'individualization-request']);
- config.messagehandler( event.messageType, event.message ).then( function( response ) {
+ config.messagehandler( event.messageType, event.message ).then(function(response) {
waitForEventAndRunStep('keystatuseschange', mediaKeySession, test.step_func(processKeyStatusesChange), test);
- mediaKeySession.update( response ).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- });
+ return mediaKeySession.update( response );
+ }).catch(onFailure);
}
function processKeyStatusesChange(event)
@@ -37,10 +39,10 @@ function runTest(config,qualifier) {
test.done();
}
- navigator.requestMediaKeySystemAccess( config.keysystem, [ configuration ] ).then(function(access) {
+ navigator.requestMediaKeySystemAccess(config.keysystem,[configuration]).then(function(access) {
initDataType = access.getConfiguration().initDataTypes[0];
- if ( config.initDataType && config.initData ) {
+ if (config.initDataType && config.initData) {
initData = config.initData;
} else {
initData = getInitData(config.content, initDataType);
@@ -51,9 +53,7 @@ function runTest(config,qualifier) {
mediaKeySession = mediaKeys.createSession();
waitForEventAndRunStep('message', mediaKeySession, test.step_func(processMessage), test);
return mediaKeySession.generateRequest(initDataType, initData);
- })).catch(test.step_func(function(error) {
- forceTestFailureFromPromise(test, error);
- }));
+ })).catch(onFailure);
}, testname );
}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/expiration.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/expiration.js
new file mode 100644
index 00000000000..96b7fbfeef9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/expiration.js
@@ -0,0 +1,43 @@
+function runTest(config,qualifier) {
+
+ var testname = testnamePrefix(qualifier, config.keysystem) + ', expiration';
+
+ var configuration = getSimpleConfigurationForContent(config.content);
+ if (config.initDataType && config.initData) {
+ configuration.initDataTypes = [config.initDataType];
+ }
+
+ async_test(function(test) {
+
+ var _mediaKeys,
+ _mediaKeySession;
+
+ function onFailure(error) {
+ forceTestFailureFromPromise(test, error);
+ }
+
+ function onMessage(event) {
+ assert_equals(event.target, _mediaKeySession);
+ assert_true(event instanceof window.MediaKeyMessageEvent);
+ assert_equals(event.type, 'message');
+
+ assert_in_array(event.messageType, [ 'license-request', 'individualization-request' ] );
+
+ config.messagehandler(event.messageType, event.message, {expiration: config.expiration}).then(function(response) {
+ return event.target.update(response);
+ }).then(test.step_func(function() {
+ assert_approx_equals(event.target.expiration, config.expiration, 4000, "expiration attribute should equal provided expiration time");
+ test.done();
+ })).catch(onFailure);
+ }
+
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
+ return access.createMediaKeys();
+ }).then(function(mediaKeys) {
+ _mediaKeys = mediaKeys;
+ _mediaKeySession = _mediaKeys.createSession( 'temporary' );
+ waitForEventAndRunStep('message', _mediaKeySession, onMessage, test);
+ return _mediaKeySession.generateRequest(config.initDataType, config.initData);
+ }).catch(onFailure);
+ }, testname);
+}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/generate-request-disallowed-input.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/generate-request-disallowed-input.js
index cbacc018b98..8b883ccacff 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/scripts/generate-request-disallowed-input.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/generate-request-disallowed-input.js
@@ -1,92 +1,73 @@
function runTest(config,qualifier) {
-
- // Create a "temporary" session for |keysystem| and call generateRequest()
- // with the provided initData. generateRequest() should fail with an
- // TypeError. Returns a promise that is resolved
- // if the error occurred and rejected otherwise.
- function test_session(keysystem, initDataType, initData)
- {
- return isInitDataTypeSupported(initDataType).then(function(result) {
- // If |initDataType| is not supported, simply succeed.
- if (!result)
- return Promise.resolve('Not supported');
-
- return navigator.requestMediaKeySystemAccess(keysystem, getSimpleConfigurationForInitDataType(initDataType)).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- var mediaKeySession = mediaKeys.createSession("temporary");
- return mediaKeySession.generateRequest(initDataType, initData);
- }).then(function() {
- assert_unreached('generateRequest() succeeded unexpectedly');
- }, function(error) {
- assert_equals(error.name, 'TypeError');
- return Promise.resolve('success');
- });
- })
+ var tests = [ ], initData, keyId;
+ function push_test(keysystem, initDataType, initData, testname) {
+ tests.push({ keysystem: keysystem, initDataType: initDataType, initData: initData, testname: testname });
}
- promise_test(function()
- {
- var initData = new Uint8Array(70000);
- return test_session(config.keysystem, 'webm', initData);
- }, testnamePrefix( qualifier, config.keysystem ) + ', temporary, webm, initData longer than 64Kb characters');
+ initData = new Uint8Array(70000);
+ push_test(config.keysystem, 'webm', initData, testnamePrefix( qualifier, config.keysystem ) + ', temporary, webm, initData longer than 64Kb characters');
+
+ initData = new Uint8Array(70000);
+ push_test(config.keysystem, 'cenc', initData, testnamePrefix( qualifier, config.keysystem ) + ', temporary, cenc, initData longer than 64Kb characters');
- promise_test(function()
- {
- var initData = new Uint8Array(70000);
- return test_session(config.keysystem, 'cenc', initData);
- }, testnamePrefix( qualifier, config.keysystem ) + ', temporary, cenc, initData longer than 64Kb characters');
+ initData = new Uint8Array(70000);
+ push_test(config.keysystem, 'keyids', initData, testnamePrefix( qualifier, config.keysystem ) + ', temporary, keyids, initData longer than 64Kb characters');
- promise_test(function()
- {
- var initData = new Uint8Array(70000);
- return test_session(config.keysystem, 'keyids', initData);
- }, testnamePrefix( qualifier, config.keysystem ) + ', temporary, keyids, initData longer than 64Kb characters');
+ // Invalid 'pssh' box as the size specified is larger than what
+ // is provided.
+ initData = new Uint8Array([
+ 0x00, 0x00, 0xff, 0xff, // size = huge
+ 0x70, 0x73, 0x73, 0x68, // 'pssh'
+ 0x00, // version = 0
+ 0x00, 0x00, 0x00, // flags
+ 0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02, // Common SystemID
+ 0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B,
+ 0x00, 0x00, 0x00, 0x00 // datasize
+ ]);
+ push_test(config.keysystem, 'cenc', initData, testnamePrefix( qualifier, config.keysystem ) + ', temporary, cenc, invalid initdata (invalid pssh)');
- promise_test(function()
- {
- // Invalid 'pssh' box as the size specified is larger than what
- // is provided.
- var initData = new Uint8Array([
- 0x00, 0x00, 0xff, 0xff, // size = huge
- 0x70, 0x73, 0x73, 0x68, // 'pssh'
- 0x00, // version = 0
- 0x00, 0x00, 0x00, // flags
- 0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02, // Common SystemID
- 0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B,
- 0x00, 0x00, 0x00, 0x00 // datasize
- ]);
- return test_session(config.keysystem, 'cenc', initData);
- }, testnamePrefix( qualifier, config.keysystem ) + ', temporary, cenc, invalid initdata (invalid pssh)');
+ // Invalid data as type = 'psss'.
+ initData = new Uint8Array([
+ 0x00, 0x00, 0x00, 0x00, // size = 0
+ 0x70, 0x73, 0x73, 0x73, // 'psss'
+ 0x00, // version = 0
+ 0x00, 0x00, 0x00, // flags
+ 0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02, // Common SystemID
+ 0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B,
+ 0x00, 0x00, 0x00, 0x00 // datasize
+ ]);
+ push_test(config.keysystem, 'cenc', initData, testnamePrefix( qualifier, config.keysystem ) + ', temporary, cenc, invalid initdata (not pssh)');
- promise_test(function()
- {
- // Invalid data as type = 'psss'.
- var initData = new Uint8Array([
- 0x00, 0x00, 0x00, 0x00, // size = 0
- 0x70, 0x73, 0x73, 0x73, // 'psss'
- 0x00, // version = 0
- 0x00, 0x00, 0x00, // flags
- 0x10, 0x77, 0xEF, 0xEC, 0xC0, 0xB2, 0x4D, 0x02, // Common SystemID
- 0xAC, 0xE3, 0x3C, 0x1E, 0x52, 0xE2, 0xFB, 0x4B,
- 0x00, 0x00, 0x00, 0x00 // datasize
- ]);
- return test_session(config.keysystem, 'cenc', initData);
- }, testnamePrefix( qualifier, config.keysystem ) + ', temporary, cenc, invalid initdata (not pssh)');
+ // Valid key ID size must be at least 1 character for keyids.
+ keyId = new Uint8Array(0);
+ initData = stringToUint8Array(createKeyIDs(keyId));
+ push_test(config.keysystem, 'keyids', initData, testnamePrefix( qualifier, config.keysystem ) + ', temporary, keyids, invalid initdata (too short key ID)');
- promise_test(function()
- {
- // Valid key ID size must be at least 1 character for keyids.
- var keyId = new Uint8Array(0);
- var initData = stringToUint8Array(createKeyIDs(keyId));
- return test_session(config.keysystem, 'keyids', initData);
- }, testnamePrefix( qualifier, config.keysystem ) + ', temporary, keyids, invalid initdata (too short key ID)');
+ // Valid key ID size must be less than 512 characters for keyids.
+ keyId = new Uint8Array(600);
+ initData = stringToUint8Array(createKeyIDs(keyId));
+ push_test(config.keysystem, 'keyids', initData, testnamePrefix( qualifier, config.keysystem ) + ', temporary, keyids, invalid initdata (too long key ID)');
- promise_test(function()
- {
- // Valid key ID size must be less than 512 characters for keyids.
- var keyId = new Uint8Array(600);
- var initData = stringToUint8Array(createKeyIDs(keyId));
- return test_session(config.keysystem, 'keyids', initData);
- }, testnamePrefix( qualifier, config.keysystem ) + ', temporary, keyids, invalid initdata (too long key ID)');
+ Promise.all( tests.map(function(testspec) {
+ return isInitDataTypeSupported(testspec.keysystem,testspec.initDataType);
+ })).then(function(results) {
+ tests.filter(function(testspec, i) { return results[i]; } ).forEach(function(testspec) {
+ promise_test(function(test) {
+ // Create a "temporary" session for |keysystem| and call generateRequest()
+ // with the provided initData. generateRequest() should fail with an
+ // TypeError. Returns a promise that is resolved
+ // if the error occurred and rejected otherwise.
+ return navigator.requestMediaKeySystemAccess(testspec.keysystem, getSimpleConfigurationForInitDataType(testspec.initDataType)).then(function(access) {
+ return access.createMediaKeys();
+ }).then(function(mediaKeys) {
+ var mediaKeySession = mediaKeys.createSession("temporary");
+ return mediaKeySession.generateRequest(testspec.initDataType, testspec.initData);
+ }).then(test.step_func(function() {
+ assert_unreached('generateRequest() succeeded unexpectedly');
+ }), test.step_func(function(error) {
+ assert_equals(error.name, 'TypeError');
+ }));
+ },testspec.testname);
+ });
+ });
}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/invalid-license.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/invalid-license.js
new file mode 100644
index 00000000000..992eef5dcf7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/invalid-license.js
@@ -0,0 +1,33 @@
+function runTest(config)
+{
+ promise_test(function (test) {
+ var initDataType;
+ var initData;
+ var keySystem = config.keysystem;
+ var invalidLicense = new Uint8Array([0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77]);
+ var messageEventFired = false;
+
+ return navigator.requestMediaKeySystemAccess(keySystem, getSimpleConfiguration()).then(function (access) {
+ initDataType = access.getConfiguration().initDataTypes[0];
+ initData = getInitData(initDataType);
+ return access.createMediaKeys();
+ }).then(function (mediaKeys) {
+ var keySession = mediaKeys.createSession();
+ var eventWatcher = new EventWatcher(test, keySession, ['message']);
+ var promise = eventWatcher.wait_for('message');
+ keySession.generateRequest(initDataType, initData);
+ return promise;
+ }).then(function (messageEvent) {
+ messageEventFired = true;
+ return messageEvent.target.update(invalidLicense);
+ }).then(function () {
+ assert_unreached('Error: update() should fail because of an invalid license.');
+ }).catch(function (error) {
+ if(messageEventFired) {
+ assert_equals(error.name, 'TypeError');
+ } else {
+ assert_unreached('Error: ' + error.name);
+ }
+ });
+ }, 'Update with invalid Clear Key license');
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/keystatuses-multiple-sessions.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/keystatuses-multiple-sessions.js
index 4553c2bb253..e9bf10e8860 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/scripts/keystatuses-multiple-sessions.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/keystatuses-multiple-sessions.js
@@ -1,10 +1,10 @@
function runTest(config,qualifier)
{
- var testname = testnamePrefix( qualifier, config.keysystem ) + ', temporary, keystatuses, multiple sessions';
+ var testname = testnamePrefix(qualifier, config.keysystem) + ', temporary, keystatuses, multiple sessions';
- var configuration = getSimpleConfigurationForContent( config.content );
+ var configuration = getSimpleConfigurationForContent(config.content);
- if ( config.initDataType && config.initData ) configuration.initDataTypes = [ config.initDataType ];
+ if (config.initDataType && config.initData) configuration.initDataTypes = [config.initDataType];
async_test(function(test)
{
@@ -13,8 +13,14 @@ function runTest(config,qualifier)
// Even though key ids are uint8, using printable values so that
// they can be verified easily.
- var key1 = new Uint8Array( config.content.keys[ 0 ].kid ),
- key2 = new Uint8Array( config.content.keys[ 1 ].kid );
+ var key1 = new Uint8Array(config.content.keys[0].kid),
+ key2 = new Uint8Array(config.content.keys[1].kid),
+ variant1 = config.content.keys[0].variantId,
+ variant2 = config.content.keys[1].variantId;
+
+ function onFailure(error) {
+ forceTestFailureFromPromise(test,error);
+ }
function processMessage1(event)
{
@@ -22,15 +28,12 @@ function runTest(config,qualifier)
assert_equals(event.target, mediaKeySession1);
// No keys added yet.
- verifyKeyStatuses(mediaKeySession1.keyStatuses, { expected: [], unexpected: [key1, key2] });
+ verifyKeyStatuses(mediaKeySession1.keyStatuses, {expected: [], unexpected: [key1, key2]});
// Add key1 to session1.
- config.messagehandler( event.messageType, event.message ).then( function( response ) {
-
- event.target.update( response ).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- });
+ config.messagehandler(event.messageType, event.message, {variantId:variant1}).then(function(response) {
+ return event.target.update(response);
+ }).catch(onFailure);
}
@@ -40,12 +43,10 @@ function runTest(config,qualifier)
assert_equals(event.target, mediaKeySession1);
// Check that keyStatuses contains the expected key1 only.
- verifyKeyStatuses(mediaKeySession1.keyStatuses, { expected: [key1], unexpected: [key2] });
+ verifyKeyStatuses(mediaKeySession1.keyStatuses, {expected: [key1], unexpected: [key2]});
// Now trigger a message event on session2.
- mediaKeySession2.generateRequest(config.initDataType, config.initData[ 1 ]).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
+ mediaKeySession2.generateRequest(config.initDataType, config.initData[1]).catch(onFailure);
}
function processMessage2(event)
@@ -54,18 +55,15 @@ function runTest(config,qualifier)
assert_equals(event.target, mediaKeySession2);
// session2 has no keys added yet.
- verifyKeyStatuses(mediaKeySession2.keyStatuses, { expected: [], unexpected: [key1, key2] });
+ verifyKeyStatuses(mediaKeySession2.keyStatuses, {expected: [], unexpected: [key1, key2]});
// session1 should still have 1 key.
- verifyKeyStatuses(mediaKeySession1.keyStatuses, { expected: [key1], unexpected: [key2] });
+ verifyKeyStatuses(mediaKeySession1.keyStatuses, {expected: [key1], unexpected: [key2]});
// Add key2 to session2.
- config.messagehandler( event.messageType, event.message ).then( function( response ) {
-
- event.target.update( response ).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- });
+ config.messagehandler(event.messageType, event.message, {variantId:variant2}).then(function(response) {
+ return event.target.update(response);
+ }).catch(onFailure);
}
function processKeyStatusesChange2(event)
@@ -74,23 +72,23 @@ function runTest(config,qualifier)
assert_equals(event.target, mediaKeySession2);
// Check that keyStatuses contains the expected key2 only.
- verifyKeyStatuses(mediaKeySession2.keyStatuses, { expected: [key2], unexpected: [key1] });
+ verifyKeyStatuses(mediaKeySession2.keyStatuses, {expected: [key2], unexpected: [key1]});
// session1 should still have 1 key.
- verifyKeyStatuses(mediaKeySession1.keyStatuses, { expected: [key1], unexpected: [key2] });
+ verifyKeyStatuses(mediaKeySession1.keyStatuses, {expected: [key1], unexpected: [key2]});
test.done();
}
- navigator.requestMediaKeySystemAccess( config.keysystem, [ configuration ] ).then(function(access) {
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
return access.createMediaKeys();
}).then(function(mediaKeys) {
mediaKeySession1 = mediaKeys.createSession();
mediaKeySession2 = mediaKeys.createSession();
// There should be no keys defined on either session.
- verifyKeyStatuses(mediaKeySession1.keyStatuses, { expected: [], unexpected: [key1, key2] });
- verifyKeyStatuses(mediaKeySession2.keyStatuses, { expected: [], unexpected: [key1, key2] });
+ verifyKeyStatuses(mediaKeySession1.keyStatuses, {expected: [], unexpected: [key1, key2]});
+ verifyKeyStatuses(mediaKeySession2.keyStatuses, {expected: [], unexpected: [key1, key2]});
// Bind all the event handlers now.
waitForEventAndRunStep('message', mediaKeySession1, processMessage1, test);
@@ -99,9 +97,7 @@ function runTest(config,qualifier)
waitForEventAndRunStep('keystatuseschange', mediaKeySession2, processKeyStatusesChange2, test);
// Generate a request on session1.
- return mediaKeySession1.generateRequest(config.initDataType, config.initData[ 0 ] );
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
+ return mediaKeySession1.generateRequest(config.initDataType, config.initData[0]);
+ }).catch(onFailure);
}, testname );
}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/keystatuses.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/keystatuses.js
index a39f0247660..8d33dd42100 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/scripts/keystatuses.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/keystatuses.js
@@ -1,10 +1,12 @@
function runTest(config,qualifier)
{
- var testname = testnamePrefix( qualifier, config.keysystem ) + ', temporary, keystatuses';
+ var testname = testnamePrefix(qualifier, config.keysystem) + ', temporary, keystatuses';
- var configuration = getSimpleConfigurationForContent( config.content );
+ var configuration = getSimpleConfigurationForContent(config.content);
- if ( config.initDataType && config.initData ) configuration.initDataTypes = [ config.initDataType ];
+ if (config.initDataType && config.initData) {
+ configuration.initDataTypes = [config.initDataType];
+ }
async_test(function(test)
{
@@ -15,8 +17,8 @@ function runTest(config,qualifier)
// Even though key ids are uint8, using printable values so that
// they can be verified easily.
- var key1 = new Uint8Array( config.content.keys[ 0 ].kid ),
- key2 = new Uint8Array( config.content.keys[ 1 ].kid ),
+ var key1 = new Uint8Array(config.content.keys[0].kid),
+ key2 = new Uint8Array(config.content.keys[1].kid),
key1String = arrayBufferAsString(key1),
key2String = arrayBufferAsString(key2);
@@ -32,9 +34,9 @@ function runTest(config,qualifier)
waitForEventAndRunStep('keystatuseschange', mediaKeySession, processKeyStatusesChange, test);
// Add keys to session
- config.messagehandler( event.messageType, event.message ).then( function( response ) {
- event.target.update( response ).catch(onFailure);
- });
+ config.messagehandler(event.messageType, event.message).then(function(response) {
+ return event.target.update(response);
+ }).catch(onFailure);
}
function checkKeyStatusFor2Keys()
@@ -49,10 +51,11 @@ function runTest(config,qualifier)
}
function lexicographical( a, b ) { return a < b ? -1 : a === b ? 0 : +1; }
function lexicographicalkey( a, b ) { return lexicographical( a.key, b.key ); }
- var expected = [{ key: key1String, value: 'usable'}, { key: key2String, value: 'usable'}].sort( lexicographicalkey );
- assert_equals(JSON.stringify(result),
- JSON.stringify(expected),
- "keystatuses should have the two expected keys with keystatus 'usable'");
+ var expected1 = [{ key: key1String, value: 'usable'}, { key: key2String, value: 'usable'}].sort( lexicographicalkey );
+ var expected2 = [{ key: key1String, value: 'status-pending'}, { key: key2String, value: 'status-pending'}].sort( lexicographicalkey );
+ assert_in_array( JSON.stringify(result),
+ [ JSON.stringify(expected1),JSON.stringify(expected2) ],
+ "keystatuses should have the two expected keys with keystatus 'usable' or 'status-pending'");
// |keyStatuses| must contain both keys.
result = [];
@@ -63,38 +66,39 @@ function runTest(config,qualifier)
[key1String, key2String].sort( lexicographical ),
"keyStatuses.keys() should return an iterable over the two expected keys");
- // Both values in |mediaKeySession| should be 'usable'.
+ // Both values in |mediaKeySession| should be 'usable' or 'status-pending'.
result = [];
for (var value of mediaKeySession.keyStatuses.values()) {
result.push(value);
}
- assert_array_equals(result,
- ['usable', 'usable'],
- "keyStatuses.values() should return an iterable with two 'usable' values");
+
+ assert_equals( result.length, 2, "keyStatuses.values() should have two elements" );
+ assert_equals( result[0], result[1], "the values in keyStatuses.values() should be equal" );
+ assert_in_array( result[0], [ 'usable', 'status-pending' ] );
// Check |keyStatuses.entries()|.
result = [];
for (var entry of mediaKeySession.keyStatuses.entries()) {
result.push({ key: arrayBufferAsString(entry[0]), value: entry[1] });
}
- assert_equals(JSON.stringify(result),
- JSON.stringify(expected),
- "keyStatuses.entries() should return an iterable over the two expected keys, with keystatus 'usable'");
+ assert_in_array(JSON.stringify(result),
+ [ JSON.stringify(expected1), JSON.stringify(expected2) ],
+ "keyStatuses.entries() should return an iterable over the two expected keys, with keystatus 'usable' or 'status-pending'");
// forEach() should return both entries.
result = [];
mediaKeySession.keyStatuses.forEach(function(status, keyId) {
result.push({ key: arrayBufferAsString(keyId), value: status });
});
- assert_equals(JSON.stringify(result),
- JSON.stringify(expected),
- "keyStatuses.forEach() should iterate over the two expected keys, with keystatus 'usable'");
+ assert_in_array(JSON.stringify(result),
+ [ JSON.stringify(expected1), JSON.stringify(expected2) ],
+ "keyStatuses.forEach() should iterate over the two expected keys, with keystatus 'usable' or 'status-pending'");
// has() and get() should return the expected values.
assert_true(mediaKeySession.keyStatuses.has(key1), "keyStatuses should have key1");
assert_true(mediaKeySession.keyStatuses.has(key2), "keyStatuses should have key2");
- assert_equals(mediaKeySession.keyStatuses.get(key1), 'usable', "key1 should have status 'usable'");
- assert_equals(mediaKeySession.keyStatuses.get(key2), 'usable', "key2 should have status 'usable'");
+ assert_in_array(mediaKeySession.keyStatuses.get(key1), [ 'usable', 'status-pending' ], "key1 should have status 'usable' or 'status-pending'");
+ assert_in_array(mediaKeySession.keyStatuses.get(key2), [ 'usable', 'status-pending' ], "key2 should have status 'usable' or 'status-pending'");
// Try some invalid keyIds.
var invalid1 = key1.subarray(0, key1.length - 1);
@@ -128,7 +132,7 @@ function runTest(config,qualifier)
function processKeyStatusesChange(event)
{
- if ( !closed )
+ if (!closed)
{
// The first keystatuseschange (caused by update())
// should include both keys.
@@ -146,7 +150,7 @@ function runTest(config,qualifier)
}
}
- navigator.requestMediaKeySystemAccess( config.keysystem, [ configuration ] ).then(function(access) {
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
return access.createMediaKeys();
}).then(test.step_func(function(mediaKeys) {
mediaKeySession = mediaKeys.createSession();
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/onencrypted.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/onencrypted.js
new file mode 100644
index 00000000000..dbeb99d5d44
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/onencrypted.js
@@ -0,0 +1,48 @@
+function runTest(config) {
+ var expectedInitData = [];
+ expectedInitData.push(stringToUint8Array(atob(config.keys[0].initData)));
+ expectedInitData.push(stringToUint8Array(atob(config.keys[1].initData)));
+
+ // Will get 2 identical events, one for audio, one for video.
+ var expectedEvents = 2;
+ var currentData;
+
+ async_test(function (test) {
+ var video = config.video,
+ mediaSource,
+ onEncrypted = function (event) {
+ currentData = new Uint8Array(event.initData);
+ assert_equals(event.target, config.video);
+ assert_true(event instanceof window.MediaEncryptedEvent);
+ assert_equals(event.type, 'encrypted');
+ assert_equals(event.initDataType, 'cenc');
+ // At this point we do not know if the event is related to audio or video. So check for both expected init data
+ assert_true(checkInitData(currentData, expectedInitData[0]) || checkInitData(currentData, expectedInitData[1]));
+
+ if (--expectedEvents === 0) {
+ test.done();
+ }
+ };
+
+ waitForEventAndRunStep('encrypted', video, onEncrypted, test);
+ return testmediasource(config).then(function (source) {
+ mediaSource = source;
+ config.video.src = URL.createObjectURL(mediaSource);
+ return source.done;
+ }).then(function(){
+ video.play();
+ });
+ }, 'encrypted fired on encrypted media file.');
+}
+
+function checkInitData(data, expectedData) {
+ if (data.length !== expectedData.length) {
+ return false;
+ }
+ for (var i = 0; i < data.length; i++) {
+ if (data[i] !== expectedData[i]) {
+ return false;
+ }
+ }
+ return true;
+}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-destroy-persistent-license.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-destroy-persistent-license.js
index dd315993eda..8a6cacedb40 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-destroy-persistent-license.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-destroy-persistent-license.js
@@ -10,8 +10,7 @@ function runTest(config,qualifier) {
videoCapabilities: [ { contentType: config.videoType } ],
sessionTypes: [ 'persistent-license' ] };
-
- async_test( function( test ) {
+ async_test( function(test) {
var _video = config.video,
_mediaKeys,
@@ -25,14 +24,13 @@ function runTest(config,qualifier) {
}
function onMessage(event) {
- assert_equals( event.target, _mediaKeySession );
- assert_true( event instanceof window.MediaKeyMessageEvent );
- assert_equals( event.type, 'message');
+ assert_equals(event.target, _mediaKeySession);
+ assert_true(event instanceof window.MediaKeyMessageEvent);
+ assert_equals(event.type, 'message');
- config.messagehandler( event.messageType, event.message )
- .then( function( response ) {
- _mediaKeySession.update( response ).catch(onFailure);
- });
+ config.messagehandler(event.messageType, event.message).then(function(response) {
+ return _mediaKeySession.update(response);
+ }).catch(onFailure);
}
function onEncrypted(event) {
@@ -49,8 +47,8 @@ function runTest(config,qualifier) {
}
function onTimeupdate(event) {
- if ( _video.currentTime > ( config.duration || 1 ) && !_startedReleaseSequence ) {
- _video.removeEventListener('timeupdate', onTimeupdate );
+ if (_video.currentTime > ( config.duration || 1 ) && !_startedReleaseSequence) {
+ _video.removeEventListener('timeupdate', onTimeupdate);
_video.pause();
_video.removeAttribute('src');
_video.load();
@@ -70,27 +68,27 @@ function runTest(config,qualifier) {
function onClosed() {
// Try and reload and check this fails
var mediaKeySession = _mediaKeys.createSession( 'persistent-license' );
- mediaKeySession.load( _sessionId ).then( test.step_func(function( success ) {
+ mediaKeySession.load(_sessionId).then( test.step_func(function(success) {
assert_false( success, "Load of removed session shouold fail" );
test.done();
})).catch(onFailure);
}
- navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) {
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
return access.createMediaKeys();
}).then(function(mediaKeys) {
_mediaKeys = mediaKeys;
return _video.setMediaKeys(_mediaKeys);
- return;
}).then(function() {
- _mediaKeySession = _mediaKeys.createSession( 'persistent-license' );
+ _mediaKeySession = _mediaKeys.createSession('persistent-license');
waitForEventAndRunStep('encrypted', _video, onEncrypted, test);
waitForEventAndRunStep('playing', _video, onPlaying, test);
- }).then(function() {
return testmediasource(config);
}).then(function(source) {
_mediaSource = source;
_video.src = URL.createObjectURL(_mediaSource);
+ return source.done;
+ }).then(function(){
_video.play();
}).catch(onFailure);
}, testname);
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-persistent-license-events.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-persistent-license-events.js
index d087e11d88c..d5049a5f1b3 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-persistent-license-events.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-persistent-license-events.js
@@ -1,8 +1,8 @@
function runTest(config,qualifier) {
- var testname = testnamePrefix( qualifier, config.keysystem )
+ var testname = testnamePrefix(qualifier, config.keysystem)
+ ', persistent-license, '
- + /video\/([^;]*)/.exec( config.videoType )[ 1 ]
+ + /video\/([^;]*)/.exec(config.videoType)[1]
+ ', playback, check events';
var configuration = { initDataTypes: [ config.initDataType ],
@@ -11,8 +11,7 @@ function runTest(config,qualifier) {
sessionTypes: [ 'persistent-license' ] };
- async_test( function( test ) {
-
+ async_test(function(test) {
var _video = config.video,
_mediaKeys,
_mediaKeySession,
@@ -34,47 +33,42 @@ function runTest(config,qualifier) {
assert_true( event instanceof window.MediaKeyMessageEvent );
assert_equals( event.type, 'message');
- if ( !_startedReleaseSequence ) {
- assert_in_array( event.messageType, [ 'license-request', 'individualization-request' ] );
+ if (!_startedReleaseSequence) {
+ assert_in_array(event.messageType, ['license-request', 'individualization-request']);
} else {
- assert_equals( event.messageType, 'license-release' );
+ assert_equals(event.messageType, 'license-release');
}
- if ( event.messageType !== 'individualization-request' ) {
- _events.push( event.messageType );
+ if (event.messageType !== 'individualization-request') {
+ _events.push(event.messageType);
}
- config.messagehandler( event.messageType, event.message ).then( function( response ) {
- _events.push( event.messageType + '-response');
- _mediaKeySession.update( response ).then( test.step_func( function() {
- _events.push('updated');
- if ( event.messageType === 'license-release' ) {
- assert_array_equals( _events,
- [
- 'generaterequest',
- 'license-request',
- 'license-request-response',
- 'updated',
+ config.messagehandler(event.messageType, event.message ).then(function(response) {
+ _events.push(event.messageType + '-response');
+ return _mediaKeySession.update(response);
+ }).then(test.step_func(function() {
+ _events.push('update-resolved');
+ if (event.messageType === 'license-release') {
+ checkEventSequence( _events,
+ ['generaterequest',
+ ['license-request', 'license-request-response', 'update-resolved'], // potentially repeating
'keystatuseschange',
'playing',
- 'remove',
+ 'remove-resolved',
'keystatuseschange',
'license-release',
'license-release-response',
- 'closed-promise',
- 'updated'
- ],
- "Expected events sequence" );
- test.done();
- }
- })).catch(onFailure);
- });
+ 'closed-attribute-resolved',
+ 'update-resolved' ]);
+ test.done();
+ }
+ })).catch(onFailure);
}
function onKeyStatusesChange(event) {
- assert_equals(event.target, _mediaKeySession );
- assert_true(event instanceof window.Event );
- assert_equals(event.type, 'keystatuseschange' );
+ assert_equals(event.target, _mediaKeySession);
+ assert_true(event instanceof window.Event);
+ assert_equals(event.type, 'keystatuseschange');
_events.push('keystatuseschange');
}
@@ -84,7 +78,7 @@ function runTest(config,qualifier) {
assert_equals(event.type, 'encrypted');
_mediaKeySession.generateRequest( config.initData ? config.initDataType : event.initDataType,
- config.initData || event.initData ).then( recordEventFunc( 'generaterequest' )
+ config.initData || event.initData ).then(recordEventFunc('generaterequest')
).catch(onFailure);
}
@@ -96,7 +90,7 @@ function runTest(config,qualifier) {
_video.load();
_startedReleaseSequence = true;
- _mediaKeySession.remove().then( recordEventFunc( 'remove' ) ).catch(onFailure);
+ _mediaKeySession.remove().then(recordEventFunc('remove-resolved')).catch(onFailure);
}
}
@@ -118,14 +112,14 @@ function runTest(config,qualifier) {
_mediaKeySession = _mediaKeys.createSession( 'persistent-license' );
waitForEventAndRunStep('keystatuseschange', _mediaKeySession, onKeyStatusesChange, test);
waitForEventAndRunStep('message', _mediaKeySession, onMessage, test);
- _mediaKeySession.closed.then( recordEventFunc( 'closed-promise' ) );
+ _mediaKeySession.closed.then( recordEventFunc( 'closed-attribute-resolved' ) );
return testmediasource(config);
}).then(function(source) {
_mediaSource = source;
_video.src = URL.createObjectURL(_mediaSource);
+ return source.done;
+ }).then(function(){
_video.play();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
+ }).catch(onFailure);
}, testname);
}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-persistent-license.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-persistent-license.js
index d3bbfa69f99..c7e56e3aeaf 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-persistent-license.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-persistent-license.js
@@ -1,8 +1,8 @@
function runTest(config,qualifier) {
- var testname = testnamePrefix( qualifier, config.keysystem )
+ var testname = testnamePrefix(qualifier, config.keysystem)
+ ', persistent-license, '
- + /video\/([^;]*)/.exec( config.videoType )[ 1 ]
+ + /video\/([^;]*)/.exec(config.videoType)[1]
+ 'playback';
var configuration = { initDataTypes: [ config.initDataType ],
@@ -11,8 +11,7 @@ function runTest(config,qualifier) {
sessionTypes: [ 'persistent-license' ] };
- async_test( function( test ) {
-
+ async_test(function(test) {
var _video = config.video,
_mediaKeys,
_mediaKeySession,
@@ -29,11 +28,9 @@ function runTest(config,qualifier) {
assert_in_array( event.messageType, [ 'license-request', 'individualization-request' ] );
- config.messagehandler( event.messageType, event.message )
- .then( function( response ) {
- _mediaKeySession.update( response )
- .catch(onFailure);
- });
+ config.messagehandler(event.messageType, event.message).then( function( response ) {
+ return _mediaKeySession.update(response)
+ }).catch(onFailure);
}
function onEncrypted(event) {
@@ -47,7 +44,7 @@ function runTest(config,qualifier) {
}
function onTimeupdate(event) {
- if ( _video.currentTime > ( config.duration || 1 ) ) {
+ if (_video.currentTime > (config.duration || 1)) {
_video.pause();
test.done();
}
@@ -68,11 +65,12 @@ function runTest(config,qualifier) {
_mediaKeySession = _mediaKeys.createSession( 'persistent-license' );
waitForEventAndRunStep('encrypted', _video, onEncrypted, test);
waitForEventAndRunStep('playing', _video, onPlaying, test);
- }).then(function() {
return testmediasource(config);
}).then(function(source) {
_mediaSource = source;
_video.src = URL.createObjectURL(_mediaSource);
+ return source.done;
+ }).then(function(){
_video.play();
}).catch(onFailure);
}, testname);
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-persistent-usage-record-events.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-persistent-usage-record-events.js
index b1150f02b35..e8e1e54790b 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-persistent-usage-record-events.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-persistent-usage-record-events.js
@@ -1,18 +1,17 @@
function runTest(config,qualifier) {
- var testname = testnamePrefix( qualifier, config.keysystem )
+ var testname = testnamePrefix(qualifier, config.keysystem)
+ ', persistent-usage-record, '
- + /video\/([^;]*)/.exec( config.videoType )[ 1 ]
+ + /video\/([^;]*)/.exec(config.videoType)[1]
+ ', playback, check events';
- var configuration = { initDataTypes: [ config.initDataType ],
- audioCapabilities: [ { contentType: config.audioType } ],
- videoCapabilities: [ { contentType: config.videoType } ],
- sessionTypes: [ 'persistent-usage-record' ] };
+ var configuration = { initDataTypes: [config.initDataType ],
+ audioCapabilities: [{contentType: config.audioType}],
+ videoCapabilities: [{contentType: config.videoType}],
+ sessionTypes: ['persistent-usage-record']};
- async_test( function( test ) {
-
+ async_test(function(test) {
var _video = config.video,
_mediaKeys,
_mediaKeySession,
@@ -20,8 +19,8 @@ function runTest(config,qualifier) {
_timeupdateEvent = false,
_events = [ ];
- function recordEventFunc( eventType ) {
- return function() { _events.push( eventType ); };
+ function recordEventFunc(eventType) {
+ return function() { _events.push(eventType); };
}
function onFailure(error) {
@@ -29,44 +28,38 @@ function runTest(config,qualifier) {
}
function onMessage(event) {
- assert_equals( event.target, _mediaKeySession );
- assert_true( event instanceof window.MediaKeyMessageEvent );
- assert_equals( event.type, 'message');
+ assert_equals(event.target, _mediaKeySession);
+ assert_true(event instanceof window.MediaKeyMessageEvent);
+ assert_equals(event.type, 'message');
- if ( event.messageType !== 'individualization-request' ) {
- _events.push( event.messageType );
+ if (event.messageType !== 'individualization-request') {
+ _events.push(event.messageType);
}
- config.messagehandler( event.messageType, event.message ).then( function( response ) {
- _events.push( event.messageType + '-response' );
- _mediaKeySession.update( response ).then( test.step_func(function() {
- _events.push( 'update-done' );
- if ( event.messageType === 'license-release' ) {
- consoleWrite( _events );
- assert_array_equals( _events,
- [ 'encrypted',
- 'generaterequest-done',
- 'license-request',
- 'license-request-response',
- 'update-done',
- 'keystatuseschange',
- 'playing',
- 'remove-done',
- 'keystatuseschange',
- 'license-release',
- 'license-release-response',
- 'closed-promise',
- 'update-done'
- ],
- "Expected events sequence" );
- test.done();
- }
-
- if ( event.messageType === 'license-request' ) {
- _video.setMediaKeys( _mediaKeys );
- }
- })).catch(onFailure);
- });
+ config.messagehandler(event.messageType, event.message).then(function(response) {
+ _events.push(event.messageType + '-response');
+ return _mediaKeySession.update(response);
+ }).then(test.step_func(function() {
+ _events.push('update-resolved');
+ if (event.messageType === 'license-release') {
+ checkEventSequence( _events,
+ ['encrypted','generaterequest-done',
+ ['license-request', 'license-request-response', 'update-resolved'], // potentially repeating
+ 'keystatuseschange',
+ 'playing',
+ 'remove-resolved',
+ 'keystatuseschange',
+ 'license-release',
+ 'license-release-response',
+ 'closed-attribute-resolved',
+ 'update-resolved' ]);
+ test.done();
+ }
+
+ if ( event.messageType === 'license-request' ) {
+ _video.setMediaKeys(_mediaKeys);
+ }
+ })).catch(onFailure);
}
function onEncrypted(event) {
@@ -81,14 +74,14 @@ function runTest(config,qualifier) {
}
function onTimeupdate(event) {
- if ( _video.currentTime > ( config.duration || 1 ) && !_timeupdateEvent ) {
+ if (_video.currentTime > (config.duration || 1) && !_timeupdateEvent) {
_timeupdateEvent = true;
_video.pause();
- _mediaKeySession.remove().then( recordEventFunc('remove-done') ).catch(onFailure);
+ _mediaKeySession.remove().then(recordEventFunc('remove-resolved')).catch(onFailure);
}
}
- navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) {
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
return access.createMediaKeys();
}).then(function(mediaKeys) {
_mediaKeys = mediaKeys;
@@ -102,13 +95,14 @@ function runTest(config,qualifier) {
_mediaKeySession = _mediaKeys.createSession( 'persistent-usage-record' );
waitForEventAndRunStep('message', _mediaKeySession, onMessage, test);
waitForEventAndRunStep('keystatuseschange', _mediaKeySession, recordEventFunc('keystatuseschange'), test);
- _mediaKeySession.closed.then( recordEventFunc('closed-promise') );
- }).then(function() {
- return config.servercertificate ? _mediaKeys.setServerCertificate( config.servercertificate ) : true;
+ _mediaKeySession.closed.then(recordEventFunc('closed-attribute-resolved'));
+ return config.servercertificate ? _mediaKeys.setServerCertificate(config.servercertificate) : true;
}).then(function( success ) {
return testmediasource(config);
}).then(function(source) {
_video.src = URL.createObjectURL(source);
+ return source.done;
+ }).then(function(){
_video.play();
}).catch(onFailure);
}, testname);
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-persistent-usage-record.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-persistent-usage-record.js
index ca7fa1d654a..1772b4bd5f3 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-persistent-usage-record.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-persistent-usage-record.js
@@ -1,8 +1,8 @@
function runTest(config,qualifier) {
- var testname = testnamePrefix( qualifier, config.keysystem )
+ var testname = testnamePrefix(qualifier, config.keysystem)
+ ', persistent-usage-record, '
- + /video\/([^;]*)/.exec( config.videoType )[ 1 ]
+ + /video\/([^;]*)/.exec(config.videoType)[1]
+ 'playback';
var configuration = { initDataTypes: [ config.initDataType ],
@@ -11,8 +11,7 @@ function runTest(config,qualifier) {
sessionTypes: [ 'persistent-usage-record' ] };
- async_test( function( test ) {
-
+ async_test(function(test) {
var _video = config.video,
_mediaKeys,
_mediaKeySession,
@@ -24,29 +23,29 @@ function runTest(config,qualifier) {
}
function onMessage(event) {
- assert_equals( event.target, _mediaKeySession );
+ assert_equals(event.target, _mediaKeySession);
// event instance verification failing on CastTV
// assert_true( event instanceof window.MediaKeyMessageEvent );
- assert_equals( event.type, 'message');
+ assert_equals(event.type, 'message');
- if ( !_releaseSequence )
+ if (!_releaseSequence)
{
- assert_in_array( event.messageType, [ 'license-request', 'individualization-request' ] );
+ assert_in_array(event.messageType, ['license-request', 'individualization-request']);
}
else
{
- assert_equals( event.messageType, 'license-release' );
+ assert_equals(event.messageType, 'license-release');
}
- config.messagehandler( event.messageType, event.message ).then( function( response ) {
- _mediaKeySession.update( response ).then(function() {
- if(event.messageType === 'license-request') {
- return _video.setMediaKeys(_mediaKeys);
- } else if(event.messageType === 'license-release') {
- test.done();
- }
- }).catch(onFailure);
- });
+ config.messagehandler(event.messageType, event.message).then(function(response) {
+ return _mediaKeySession.update(response);
+ }).then(function() {
+ if(event.messageType === 'license-request') {
+ return _video.setMediaKeys(_mediaKeys);
+ } else if(event.messageType === 'license-release') {
+ test.done();
+ }
+ }).catch(onFailure);
}
function onEncrypted(event) {
@@ -66,20 +65,19 @@ function runTest(config,qualifier) {
}
function onTimeupdate(event) {
- if ( _video.currentTime > ( config.duration || 1 ) && !_releaseSequence ) {
+ if (_video.currentTime > ( config.duration || 1) && !_releaseSequence) {
_video.removeEventListener('timeupdate', onTimeupdate );
_video.pause();
_releaseSequence = true;
- _mediaKeySession.closed.then( test.step_func( onClosed ) );
+ _mediaKeySession.closed.then(test.step_func(onClosed));
_mediaKeySession.remove().catch(onFailure);
- _video.removeEventListener('timeupdate', onTimeupdate );
+ _video.removeEventListener('timeupdate', onTimeupdate);
}
}
function onPlaying(event) {
-
// Not using waitForEventAndRunStep() to avoid too many
// EVENT(onTimeUpdate) logs.
_video.addEventListener('timeupdate', onTimeupdate, true);
@@ -89,16 +87,17 @@ function runTest(config,qualifier) {
return access.createMediaKeys();
}).then(function(mediaKeys) {
_mediaKeys = mediaKeys;
- _mediaKeySession = _mediaKeys.createSession( 'persistent-usage-record' );
+ _mediaKeySession = _mediaKeys.createSession('persistent-usage-record');
waitForEventAndRunStep('encrypted', _video, onEncrypted, test);
waitForEventAndRunStep('playing', _video, onPlaying, test);
- }).then(function() {
- return config.servercertificate ? _mediaKeys.setServerCertificate( config.servercertificate ) : true;
- }).then(function( success ) {
+ return config.servercertificate ? _mediaKeys.setServerCertificate(config.servercertificate) : true;
+ }).then(function(success) {
return testmediasource(config);
}).then(function(source) {
_mediaSource = source;
_video.src = URL.createObjectURL(_mediaSource);
+ return source.done;
+ }).then(function(){
_video.play();
}).catch(onFailure);
}, testname);
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-retrieve-persistent-license.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-retrieve-persistent-license.js
index fe55de3eab4..03b6b53ac1b 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-retrieve-persistent-license.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-retrieve-persistent-license.js
@@ -1,8 +1,8 @@
function runTest(config,qualifier) {
- var testname = testnamePrefix( qualifier, config.keysystem )
+ var testname = testnamePrefix(qualifier, config.keysystem)
+ ', persistent-license, '
- + /video\/([^;]*)/.exec( config.videoType )[ 1 ]
+ + /video\/([^;]*)/.exec(config.videoType)[1]
+ ', ' + config.testcase;
var configuration = { initDataTypes: [ config.initDataType ],
@@ -11,7 +11,7 @@ function runTest(config,qualifier) {
sessionTypes: [ 'persistent-license' ] };
- async_test( function( test ) {
+ async_test( function(test) {
var _video = config.video,
_mediaKeys,
_mediaKeySession,
@@ -35,16 +35,15 @@ function runTest(config,qualifier) {
}
function onMessage(event) {
- assert_equals( event.target, _mediaKeySession );
- assert_true( event instanceof window.MediaKeyMessageEvent );
- assert_equals( event.type, 'message');
+ assert_equals(event.target, _mediaKeySession);
+ assert_true(event instanceof window.MediaKeyMessageEvent);
+ assert_equals(event.type, 'message');
- assert_in_array( event.messageType, [ 'license-request', 'individualization-request' ] );
+ assert_in_array(event.messageType, ['license-request', 'individualization-request']);
- config.messagehandler( event.messageType, event.message ).then( function( response ) {
- _mediaKeySession.update( response )
- .catch(onFailure);
- });
+ config.messagehandler(event.messageType, event.message).then(function(response) {
+ return _mediaKeySession.update(response);
+ }).catch(onFailure);
}
function onPlaying(event) {
@@ -54,24 +53,24 @@ function runTest(config,qualifier) {
}
function onTimeupdate(event) {
- if ( _video.currentTime > ( config.duration || 1 ) ) {
- _video.removeEventListener('timeupdate', onTimeupdate );
+ if (_video.currentTime > (config.duration || 1)) {
+ _video.removeEventListener('timeupdate', onTimeupdate);
_video.pause();
_video.removeAttribute('src');
_video.load()
- _mediaKeySession.closed.then( test.step_func( onClosed ) );
+ _mediaKeySession.closed.then(test.step_func(onClosed));
_mediaKeySession.close();
}
}
function onClosed() {
// Open a new window in which we will attempt to play with the persisted license
- var win = window.open( config.windowscript );
+ var win = window.open(config.windowscript);
// Lisen for an event from the new window containing its test assertions
- window.addEventListener('message', test.step_func(function( messageEvent ) {
- messageEvent.data.forEach(test.step_func(function( assertion ) {
+ window.addEventListener('message', test.step_func(function(messageEvent) {
+ messageEvent.data.forEach(test.step_func(function(assertion) {
assert_equals(assertion.actual, assertion.expected, assertion.message);
}));
@@ -85,23 +84,24 @@ function runTest(config,qualifier) {
// Post the config and session id to the new window when it is ready
win.onload = function() {
- win.postMessage( { config: config, sessionId: _sessionId }, '*' );
+ win.postMessage({config: config, sessionId: _sessionId}, '*');
}
}
- navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) {
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
return access.createMediaKeys();
}).then(function(mediaKeys) {
_mediaKeys = mediaKeys;
_video.setMediaKeys( mediaKeys );
- _mediaKeySession = _mediaKeys.createSession( 'persistent-license' );
+ _mediaKeySession = _mediaKeys.createSession('persistent-license');
waitForEventAndRunStep('encrypted', _video, onEncrypted, test);
waitForEventAndRunStep('playing', _video, onPlaying, test);
- }).then(function() {
return testmediasource(config);
}).then(function(source) {
_mediaSource = source;
_video.src = URL.createObjectURL(_mediaSource);
+ return source.done;
+ }).then(function(){
_video.play();
}).catch(onFailure);
}, testname);
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-retrieve-persistent-usage-record.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-retrieve-persistent-usage-record.js
index 92af9bc8174..9467fd5d867 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-retrieve-persistent-usage-record.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-retrieve-persistent-usage-record.js
@@ -1,8 +1,8 @@
function runTest(config,qualifier) {
- var testname = testnamePrefix( qualifier, config.keysystem )
+ var testname = testnamePrefix(qualifier, config.keysystem)
+ ', persistent-usage-record, '
- + /video\/([^;]*)/.exec( config.videoType )[ 1 ]
+ + /video\/([^;]*)/.exec(config.videoType)[1]
+ ', playback, retrieve in new window';
var configuration = { initDataTypes: [ config.initDataType ],
@@ -12,7 +12,6 @@ function runTest(config,qualifier) {
async_test( function( test ) {
-
var _video = config.video,
_mediaKeys,
_mediaKeySession,
@@ -37,17 +36,17 @@ function runTest(config,qualifier) {
}
function onMessage(event) {
- assert_equals( event.target, _mediaKeySession );
- assert_true( event instanceof window.MediaKeyMessageEvent );
- assert_equals( event.type, 'message');
+ assert_equals(event.target, _mediaKeySession);
+ assert_true(event instanceof window.MediaKeyMessageEvent);
+ assert_equals(event.type, 'message');
- assert_in_array( event.messageType, [ 'license-request', 'individualization-request' ] );
+ assert_in_array( event.messageType,['license-request', 'individualization-request']);
- config.messagehandler( event.messageType, event.message ).then( function( response ) {
- _mediaKeySession.update( response ).then(function() {
- _video.setMediaKeys(_mediaKeys);
- }).catch(onFailure);
- });
+ config.messagehandler( event.messageType, event.message ).then(function(response) {
+ return _mediaKeySession.update(response);
+ }).then(function() {
+ _video.setMediaKeys(_mediaKeys);
+ }).catch(onFailure);
}
function onPlaying(event) {
@@ -57,11 +56,11 @@ function runTest(config,qualifier) {
}
function onTimeupdate(event) {
- if ( !_isClosing && _video.currentTime > ( config.duration || 1 ) ) {
+ if (!_isClosing && _video.currentTime > (config.duration || 1)) {
_isClosing = true;
- _video.removeEventListener('timeupdate', onTimeupdate );
+ _video.removeEventListener('timeupdate', onTimeupdate);
_video.pause();
- _mediaKeySession.closed.then( test.step_func( onClosed ) );
+ _mediaKeySession.closed.then( test.step_func(onClosed));
_mediaKeySession.close();
}
}
@@ -70,9 +69,9 @@ function runTest(config,qualifier) {
_video.src = "";
_video.setMediaKeys( null );
- var win = window.open( config.windowscript );
- window.addEventListener('message', test.step_func(function( event ) {
- event.data.forEach(test.step_func(function( assertion ) {
+ var win = window.open(config.windowscript);
+ window.addEventListener('message', test.step_func(function(event) {
+ event.data.forEach(test.step_func(function(assertion) {
assert_equals(assertion.actual, assertion.expected, assertion.message);
}));
@@ -84,25 +83,27 @@ function runTest(config,qualifier) {
delete config.messagehandler;
win.onload = function() {
- win.postMessage( { config: config, sessionId: _sessionId }, '*' );
+ win.postMessage({ config: config, sessionId: _sessionId }, '*');
}
}
- navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) {
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
return access.createMediaKeys();
}).then(function(mediaKeys) {
_mediaKeys = mediaKeys;
- return _video.setMediaKeys( mediaKeys );
+ return _video.setMediaKeys(mediaKeys);
}).then(function(){
_mediaKeySession = _mediaKeys.createSession( 'persistent-usage-record' );
waitForEventAndRunStep('encrypted', _video, onEncrypted, test);
waitForEventAndRunStep('playing', _video, onPlaying, test);
- return config.servercertificate ? _mediaKeys.setServerCertificate( config.servercertificate ) : true;
- }).then(function( success ) {
+ return config.servercertificate ? _mediaKeys.setServerCertificate(config.servercertificate) : true;
+ }).then(function(success) {
return testmediasource(config);
}).then(function(source) {
_mediaSource = source;
_video.src = URL.createObjectURL(_mediaSource);
+ return source.done;
+ }).then(function(){
_video.play();
}).catch(onFailure);
}, testname);
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-encrypted-clear-sources.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-encrypted-clear-sources.js
new file mode 100644
index 00000000000..41ea183f2ee
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-encrypted-clear-sources.js
@@ -0,0 +1,109 @@
+function runTest(configEncrypted,configClear,qualifier) {
+
+ var testname = testnamePrefix(qualifier, configEncrypted.keysystem)
+ + ', temporary, '
+ + /video\/([^;]*)/.exec(configEncrypted.videoType)[1]
+ + ', playback, encrypted and clear sources';
+
+ var configuration = { initDataTypes: [ configEncrypted.initDataType ],
+ audioCapabilities: [ { contentType: configEncrypted.audioType } ],
+ videoCapabilities: [ { contentType: configEncrypted.videoType } ],
+ sessionTypes: [ 'temporary' ] };
+
+ async_test(function(test) {
+ var playbackCount = 0,
+ _video = configEncrypted.video,
+ _mediaKeys,
+ _mediaKeySession,
+ _mediaSource;
+
+ function onFailure(error) {
+ forceTestFailureFromPromise(test, error);
+ }
+
+ function onMessage(event) {
+ assert_equals(event.target, _mediaKeySession);
+ assert_true(event instanceof window.MediaKeyMessageEvent);
+ assert_equals(event.type, 'message');
+ assert_in_array(event.messageType, ['license-request', 'individualization-request']);
+
+ configEncrypted.messagehandler(event.messageType, event.message).then(function(response) {
+ return _mediaKeySession.update( response );
+ }).catch(onFailure);
+ }
+
+ function onEncrypted(event) {
+ assert_equals(event.target, _video);
+ assert_true(event instanceof window.MediaEncryptedEvent);
+ assert_equals(event.type, 'encrypted');
+
+ waitForEventAndRunStep('message', _mediaKeySession, onMessage, test);
+ _mediaKeySession.generateRequest(configEncrypted.initData ? configEncrypted.initDataType : event.initDataType,
+ configEncrypted.initData || event.initData).then(function(){
+ return _video.setMediaKeys(_mediaKeys);
+ }).catch(onFailure);
+ }
+
+ function onPlaying(event)
+ {
+ // Not using waitForEventAndRunStep() to avoid too many
+ // EVENT(onTimeUpdate) logs.
+ _video.addEventListener('timeupdate', onTimeUpdate, true);
+ }
+
+ function onTimeUpdate(event) {
+ if (_video.currentTime < (configEncrypted.duration || 0.5)) {
+ return;
+ }
+
+ _video.removeEventListener('timeupdate', onTimeUpdate, true);
+
+ resetSrc().then(function(){
+ if (playbackCount >= 2) {
+ test.done();
+ } else {
+ playbackCount++;
+ startPlayback();
+ }
+ }).catch(onFailure);
+ }
+
+ function resetSrc() {
+ _video.pause();
+ _video.removeAttribute('src');
+ _video.load();
+ return _video.setMediaKeys(null);
+ }
+
+ function startPlayback() {
+ // Alternate between encrypted and unencrypted files.
+ if (playbackCount % 2) {
+ // Unencrypted files don't require MediaKeys
+ testmediasource( configClear ).then(function( source ) {
+ _mediaSource = source;
+ _video.src = URL.createObjectURL(_mediaSource);
+ _video.play();
+ }).catch(onFailure);
+ } else {
+ navigator.requestMediaKeySystemAccess(configEncrypted.keysystem, [ configuration ]).then(function(access) {
+ return access.createMediaKeys();
+ }).then(function(mediaKeys) {
+ _mediaKeys = mediaKeys;
+ _mediaKeySession = _mediaKeys.createSession( 'temporary' );
+ }).then(function() {
+ return testmediasource(configEncrypted);
+ }).then(function(source) {
+ _mediaSource = source;
+ _video.src = URL.createObjectURL(_mediaSource);
+ return source.done;
+ }).then(function(){
+ _video.play();
+ }).catch(onFailure);
+ }
+ }
+
+ waitForEventAndRunStep('encrypted', _video, onEncrypted, test);
+ waitForEventAndRunStep('playing', _video, onPlaying, test);
+ startPlayback();
+ }, testname);
+}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-events.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-events.js
index 095fdba591a..28f45222cfa 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-events.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-events.js
@@ -1,8 +1,8 @@
function runTest(config,qualifier) {
- var testname = testnamePrefix( qualifier, config.keysystem )
+ var testname = testnamePrefix(qualifier, config.keysystem)
+ ', temporary, '
- + /video\/([^;]*)/.exec( config.videoType )[ 1 ]
+ + /video\/([^;]*)/.exec(config.videoType)[1]
+ ', playback, check events';
var configuration = { initDataTypes: [ config.initDataType ],
@@ -10,7 +10,7 @@ function runTest(config,qualifier) {
videoCapabilities: [ { contentType: config.videoType } ],
sessionTypes: [ 'temporary' ] };
- async_test( function( test ) {
+ async_test(function(test) {
var _video = config.video,
_mediaKeys,
_mediaKeySession,
@@ -23,41 +23,40 @@ function runTest(config,qualifier) {
}
function onMessage(event) {
- assert_equals( event.target, _mediaKeySession );
- assert_true( event instanceof window.MediaKeyMessageEvent );
- assert_equals( event.type, 'message');
+ assert_equals(event.target, _mediaKeySession);
+ assert_true(event instanceof window.MediaKeyMessageEvent);
+ assert_equals(event.type, 'message');
- assert_in_array( event.messageType, [ 'license-request', 'individualization-request' ] );
+ assert_in_array( event.messageType, ['license-request', 'individualization-request']);
- if ( event.messageType !== 'individualization-request' ) {
- _events.push( event.messageType );
+ if (event.messageType !== 'individualization-request') {
+ _events.push(event.messageType);
}
- config.messagehandler( event.messageType, event.message ).then( function( response ) {
- _events.push( 'license-response' );
+ config.messagehandler(event.messageType, event.message).then(function(response) {
+ _events.push('license-request-response');
waitForEventAndRunStep('keystatuseschange', _mediaKeySession, onKeyStatusesChange, test);
- _mediaKeySession.update( response ).then( function() {
- _events.push('updated');
- }).catch(onFailure);
- });
+ return _mediaKeySession.update( response );
+ }).then(function() {
+ _events.push('update-resolved');
+ }).catch(onFailure);
}
function onKeyStatusesChange(event) {
- assert_equals(event.target, _mediaKeySession );
- assert_true(event instanceof window.Event );
- assert_equals(event.type, 'keystatuseschange' );
+ assert_equals(event.target, _mediaKeySession);
+ assert_true(event instanceof window.Event);
+ assert_equals(event.type, 'keystatuseschange');
var hasKeys = false, pendingKeys = false;
- _mediaKeySession.keyStatuses.forEach( function( value, keyid ) {
- assert_any( assert_equals, value, [ 'status-pending', 'usable' ] );
+ _mediaKeySession.keyStatuses.forEach(function(value, keyid) {
+ assert_in_array(value, ['status-pending', 'usable']);
hasKeys = true;
- pendingKeys = pendingKeys || ( value === 'status-pending' );
-
+ pendingKeys = pendingKeys || (value === 'status-pending');
});
- if ( !hasKeys ) {
- _events.push( 'emptykeyslist' );
+ if (!hasKeys) {
+ _events.push('emptykeyslist');
} else if (!pendingKeys ) {
- _events.push( 'allkeysusable' );
+ _events.push('allkeysusable');
_video.setMediaKeys(_mediaKeys).catch(onFailure);
} else {
assert_unreached('unexpected ' + event.type + ' event');
@@ -70,57 +69,52 @@ function runTest(config,qualifier) {
assert_equals(event.type, 'encrypted');
waitForEventAndRunStep('message', _mediaKeySession, onMessage, test);
- _mediaKeySession.generateRequest( config.initData ? config.initDataType : event.initDataType,
- config.initData || event.initData ).then( function() {
- _events.push( 'generaterequest' );
+ _mediaKeySession.generateRequest(config.initData ? config.initDataType : event.initDataType,
+ config.initData || event.initData ).then(function() {
+ _events.push('generaterequest');
}).catch(onFailure);
}
function onClosed(event) {
- _events.push( 'closed-promise' );
- setTimeout( test.step_func( function() {
- assert_array_equals( _events,
- [
- 'generaterequest',
- 'license-request',
- 'license-response',
- 'updated',
+ _events.push('closed-attribute-resolved');
+ setTimeout(test.step_func(function() {
+ checkEventSequence( _events,
+ ['generaterequest',
+ ['license-request', 'license-request-response', 'update-resolved'], // potentially repeating
'allkeysusable',
'playing',
- 'closed',
- 'closed-promise',
- 'emptykeyslist'
- ],
- "Expected events sequence" );
+ 'closed-attribute-resolved',
+ 'close-promise-resolved',
+ 'emptykeyslist']);
test.done();
- } ), 0 );
+ } ), 0);
}
function onTimeupdate(event) {
- if ( _video.currentTime > ( config.duration || 1 ) && !_timeupdateEvent ) {
+ if (_video.currentTime > (config.duration || 1) && !_timeupdateEvent) {
_timeupdateEvent = true;
_video.pause();
- _mediaKeySession.closed.then( test.step_func( onClosed ) );
- _mediaKeySession.close().then( function() {
- _events.push( 'closed' );
+ _mediaKeySession.closed.then(test.step_func(onClosed));
+ _mediaKeySession.close().then(function() {
+ _events.push('close-promise-resolved');
}).catch(onFailure);
}
}
function onPlaying(event) {
- _events.push( 'playing' );
+ _events.push('playing');
// Not using waitForEventAndRunStep() to avoid too many
// EVENT(onTimeUpdate) logs.
_video.addEventListener('timeupdate', onTimeupdate, true);
}
- navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) {
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
return access.createMediaKeys();
}).then(function(mediaKeys) {
_mediaKeys = mediaKeys;
- _mediaKeySession = _mediaKeys.createSession( 'temporary' );
+ _mediaKeySession = _mediaKeys.createSession('temporary');
waitForEventAndRunStep('encrypted', _video, onEncrypted, test);
waitForEventAndRunStep('playing', _video, onPlaying, test);
@@ -129,6 +123,8 @@ function runTest(config,qualifier) {
}).then(function(source) {
_mediaSource = source;
_video.src = URL.createObjectURL(_mediaSource);
+ return source.done;
+ }).then(function(){
_video.play();
}).catch(onFailure);
}, testname);
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-expired.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-expired.js
new file mode 100644
index 00000000000..5144ef967f7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-expired.js
@@ -0,0 +1,92 @@
+function runTest(config,qualifier) {
+
+ var testname = testnamePrefix(qualifier, config.keysystem)
+ + ', temporary, '
+ + /video\/([^;]*)/.exec(config.videoType)[1]
+ + ', expired license';
+
+ var configuration = { initDataTypes: [config.initDataType],
+ audioCapabilities: [{contentType: config.audioType}],
+ videoCapabilities: [{contentType: config.videoType}],
+ sessionTypes: ['temporary'] };
+
+ async_test(function(test) {
+
+ var _video = config.video,
+ _mediaKeys,
+ _mediaKeySession,
+ _mediaSource;
+
+ function onFailure(error) {
+ forceTestFailureFromPromise(test, error);
+ }
+
+ function onEncrypted(event) {
+ assert_equals(event.target, _video);
+ assert_true(event instanceof window.MediaEncryptedEvent);
+ assert_equals(event.type, 'encrypted');
+
+ // Only create the session for the first encrypted event
+ if (_mediaKeySession !== undefined) return;
+
+ var initDataType = config.initData ? config.initDataType : event.initDataType;
+ var initData = config.initData || event.initData;
+
+ _mediaKeySession = _mediaKeys.createSession('temporary');
+ waitForEventAndRunStep('message', _mediaKeySession, onMessage, test);
+ _mediaKeySession.generateRequest(initDataType, initData).catch(onFailure);
+ }
+
+ function onMessage(event) {
+ assert_equals(event.target, _mediaKeySession);
+ assert_true(event instanceof window.MediaKeyMessageEvent);
+ assert_equals(event.type, 'message');
+
+ assert_in_array(event.messageType, ['license-request', 'individualization-request']);
+
+ var expiration = Date.now().valueOf() + 1000;
+ config.messagehandler(event.messageType, event.message, { expiration: expiration }).then(function(response) {
+ return event.target.update(response);
+ }).then(test.step_func(function() {
+ // License server may only have second granularity, so check
+ // that session expiration time is close to the desired value.
+ assert_approx_equals(event.target.expiration, expiration, 2000, "expiration attribute should equal provided expiration time");
+
+ // Since the expiration time is in the future, wait 5 seconds
+ // so that the license has expired before calling play().
+ test.step_timeout(function() {
+ assert_greater_than(Date.now().valueOf(), expiration, "Starting play before license expired");
+ _video.play();
+ // Wait 2 seconds to ensure that the video does not play.
+ test.step_timeout(function() { test.done(); }, 2000);
+ }, 5000);
+ })).catch(onFailure);
+ }
+
+ function onPlaying(event) {
+ // Not using waitForEventAndRunStep() to avoid too many
+ // EVENT(onTimeUpdate) logs.
+ _video.addEventListener('timeupdate', test.step_func(onTimeupdate), true);
+ }
+
+ function onTimeupdate(event) {
+ _video.pause();
+ assert_unreached("Playback should not start with expired license");
+ }
+
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
+ return access.createMediaKeys();
+ }).then(function(mediaKeys) {
+ _mediaKeys = mediaKeys;
+ return _video.setMediaKeys(_mediaKeys);
+ }).then(function(){
+ waitForEventAndRunStep('encrypted', _video, onEncrypted, test);
+ waitForEventAndRunStep('playing', _video, onPlaying, test);
+ return testmediasource(config);
+ }).then(function(source) {
+ _mediaSource = source;
+ _video.src = URL.createObjectURL(_mediaSource);
+ return source.done;
+ }).catch(onFailure);
+ }, testname);
+}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-multikey-multisession.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-multikey-multisession.js
deleted file mode 100644
index afea97fc121..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-multikey-multisession.js
+++ /dev/null
@@ -1,89 +0,0 @@
-function runTest(config,qualifier) {
-
- var testname = testnamePrefix( qualifier, config.keysystem )
- + ', temporary, '
- + /video\/([^;]*)/.exec( config.videoType )[ 1 ]
- + ', playback with multiple keys and sessions, '
- + config.testcase;
-
- var configuration = { initDataTypes: [ config.initDataType ],
- audioCapabilities: [ { contentType: config.audioType } ],
- videoCapabilities: [ { contentType: config.videoType } ],
- sessionTypes: [ 'temporary' ] };
-
- async_test( function( test ) {
-
- var _video = config.video,
- _mediaKeys,
- _mediaKeySessions = [ ];
-
- function onFailure( error ) {
- forceTestFailureFromPromise(test, error);
- }
-
- function onMessage(event) {
- consoleWrite( "message " + event.messageType );
- assert_any( assert_equals, event.target, _mediaKeySessions );
- assert_true( event instanceof window.MediaKeyMessageEvent );
- assert_equals( event.type, 'message');
- assert_in_array( event.messageType, [ 'license-request', 'individualization-request' ] );
-
- config.messagehandler( event.messageType, event.message ).then( function( response ) {
- event.target.update( response ).catch(onFailure);
- });
- }
-
- function onWaitingForKey(event) {
- consoleWrite( "waitingforkey");
- }
-
- function onPlaying(event) {
- consoleWrite( "playing");
- waitForEventAndRunStep('pause', _video, onStopped, test);
- waitForEventAndRunStep('waiting', _video, onStopped, test);
- waitForEventAndRunStep('stalled', _video, onStopped, test);
- }
-
- function onStopped(event) {
- consoleWrite( event.type );
- if ( _mediaKeySessions.length < config.initData.length ) {
- var mediaKeySession = _mediaKeys.createSession( 'temporary' );
- waitForEventAndRunStep('message', mediaKeySession, onMessage, test);
- mediaKeySession.generateRequest( config.initDataType, config.initData[ _mediaKeySessions.length ] ).catch(onFailure);
- _mediaKeySessions.push( mediaKeySession );
- }
- }
-
- function onTimeupdate(event) {
- if ( _video.currentTime > ( config.duration || 1 ) ) {
- _video.removeEventListener('timeupdate', onTimeupdate);
- _video.pause();
- test.done();
- }
- }
-
- navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- _mediaKeys = mediaKeys;
- return _video.setMediaKeys(_mediaKeys);
- }).then(function(){
- waitForEventAndRunStep('waitingforkey', _video, onWaitingForKey, test);
- waitForEventAndRunStep('playing', _video, onPlaying, test);
-
- // Not using waitForEventAndRunStep() to avoid too many
- // EVENT(onTimeUpdate) logs.
- _video.addEventListener('timeupdate', onTimeupdate, true);
-
- var mediaKeySession = _mediaKeys.createSession( 'temporary' );
- waitForEventAndRunStep('message', mediaKeySession, onMessage, test);
- _mediaKeySessions.push( mediaKeySession );
- return mediaKeySession.generateRequest( config.initDataType, config.initData[ 0 ] );
- }).then(function() {
- return testmediasource(config);
- }).then(function(source) {
- _video.src = URL.createObjectURL(source);
- _video.play();
- }).catch(onFailure);
- }, testname);
-}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-multikey-sequential.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-multikey-sequential.js
new file mode 100644
index 00000000000..597e8f9b0c9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-multikey-sequential.js
@@ -0,0 +1,122 @@
+function runTest(config,qualifier) {
+
+ // config.initData contains a list of keys. We expect those to be needed in order and get
+ // one waitingforkey event for each one.
+
+ var testname = testnamePrefix(qualifier, config.keysystem)
+ + ', successful playback, temporary, '
+ + /video\/([^;]*)/.exec(config.videoType)[1]
+ + ', multiple keys, sequential'
+ + (config.checkReadyState ? ', readyState' : '');
+
+ var configuration = { initDataTypes: [config.initDataType],
+ audioCapabilities: [{contentType: config.audioType}],
+ videoCapabilities: [{contentType: config.videoType}],
+ sessionTypes: ['temporary'] };
+
+ async_test(function(test) {
+ var _video = config.video,
+ _mediaKeys,
+ _mediaKeySessions = [],
+ _mediaSource,
+ _waitingForKey = false,
+ _playingCount = 0,
+ _canplayCount = 0,
+ _timeupdateWhileWaitingCount = 0;
+
+ function startNewSession() {
+ assert_less_than(_mediaKeySessions.length, config.initData.length);
+ var mediaKeySession = _mediaKeys.createSession('temporary');
+ waitForEventAndRunStep('message', mediaKeySession, onMessage, test);
+ _mediaKeySessions.push(mediaKeySession);
+ mediaKeySession.variantId = config.variantIds ? config.variantIds[_mediaKeySessions.length - 1] : undefined;
+ mediaKeySession.generateRequest(config.initDataType, config.initData[_mediaKeySessions.length - 1]).catch(onFailure);
+ }
+
+ function onFailure(error) {
+ forceTestFailureFromPromise(test, error);
+ }
+
+ function onMessage(event) {
+ var firstMessage = !_video.src;
+ config.messagehandler(event.messageType, event.message, {variantId: event.target.variantId}).then(function(response) {
+ return event.target.update(response);
+ }).then(function(){
+ if (firstMessage) {
+ _video.src = URL.createObjectURL(_mediaSource);
+ return _mediaSource.done;
+ } else if (event.target.keyStatuses.size > 0){
+ _waitingForKey = false;
+ return Promise.resolve();
+ }
+ }).then(function(){
+ if (firstMessage) {
+ _video.play();
+ }
+ }).catch(onFailure);
+ }
+
+ function onWaitingForKey(event) {
+ _waitingForKey = true;
+ if (config.checkReadyState) {
+ // This test does not start playing until the first license has been provided,
+ // so this event should occur when transitioning between keys.
+ // Thus, the frame at the current playback position is available and readyState
+ // should be HAVE_CURRENT_DATA.
+ assert_equals(_video.readyState, _video.HAVE_CURRENT_DATA, "Video readyState should be HAVE_CURRENT_DATA on watingforkey event");
+ }
+ startNewSession();
+ }
+
+ function onPlaying(event) {
+ _playingCount++;
+ assert_equals(_mediaKeySessions.length, _playingCount, "Should get one 'playing' event per key / session added");
+ assert_less_than_equal(_playingCount, 2, "Should not get more than two 'playing' events.");
+ }
+
+ function onCanPlay(event) {
+ _canplayCount++;
+ assert_equals(_mediaKeySessions.length, _canplayCount, "Should get one 'canplay' event per key / session added");
+ assert_less_than_equal(_canplayCount, 2, "Should not get more than two 'canplay' events.");
+ }
+
+ function onTimeupdate(event) {
+ // We should not receive 'timeupdate' events due to playing while waiting for a key, except
+ // when we first start waiting for key we should change the readyState to HAVE_CURRENT_DATA
+ // which will trigger the "If the previous ready state was HAVE_FUTURE_DATA or more, and
+ // the new ready state is HAVE_CURRENT_DATA or less" case of the readyState change
+ // algorithm which requires a "timeupdate" event be fired.
+ if (_waitingForKey) {
+ assert_equals(++_timeupdateWhileWaitingCount, 1, "Should only receive one timeupdate while waiting for key");
+ assert_equals(_video.readyState, _video.HAVE_CURRENT_DATA, "Video readyState should be HAVE_CURRENT_DATA while wating for key");
+ }
+
+ if (_video.currentTime > config.duration) {
+ assert_equals(_mediaKeySessions.length, config.initData.length, "It should require all keys to reach end of content");
+ assert_equals(_timeupdateWhileWaitingCount, 1, "Should have only received exactly one timeupdate while waiting for key");
+ _video.pause();
+ test.done();
+ }
+ }
+
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
+ return access.createMediaKeys();
+ }).then(function(mediaKeys) {
+ _mediaKeys = mediaKeys;
+ return _video.setMediaKeys(_mediaKeys);
+ }).then(function(){
+ // Not using waitForEventAndRunStep() to avoid too many
+ // EVENT(onTimeUpdate) logs.
+ _video.addEventListener('timeupdate', test.step_func(onTimeupdate), true);
+
+ waitForEventAndRunStep('waitingforkey', _video, onWaitingForKey, test);
+ waitForEventAndRunStep('playing', _video, onPlaying, test);
+ waitForEventAndRunStep('canplay', _video, onCanPlay, test);
+
+ return testmediasource(config);
+ }).then(function(source) {
+ _mediaSource = source;
+ startNewSession();
+ }).catch(onFailure);
+ }, testname);
+}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-multisession.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-multisession.js
index e4cf7148c67..d23bd1097e1 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-multisession.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-multisession.js
@@ -2,9 +2,9 @@ function runTest(config,qualifier) {
// This test assumes one session is required for each provided initData
- var testname = testnamePrefix( qualifier, config.keysystem )
+ var testname = testnamePrefix(qualifier, config.keysystem)
+ ', temporary, '
- + /video\/([^;]*)/.exec( config.videoType )[ 1 ]
+ + /video\/([^;]*)/.exec(config.videoType)[1]
+ ', playback with multiple sessions, '
+ config.testcase;
@@ -13,27 +13,26 @@ function runTest(config,qualifier) {
videoCapabilities: [ { contentType: config.videoType } ],
sessionTypes: [ 'temporary' ] };
- async_test( function( test ) {
-
+ async_test(function(test) {
var _video = config.video,
_mediaKeys,
- _mediaKeySessions = [ ],
+ _mediaKeySessions = [],
_mediaSource;
- function onFailure( error ) {
+ function onFailure(error) {
forceTestFailureFromPromise(test, error);
}
function onMessage(event) {
- assert_any( assert_equals, event.target, _mediaKeySessions );
- assert_true( event instanceof window.MediaKeyMessageEvent );
- assert_equals( event.type, 'message');
+ assert_any(assert_equals, event.target, _mediaKeySessions);
+ assert_true(event instanceof window.MediaKeyMessageEvent);
+ assert_equals(event.type, 'message');
- assert_in_array( event.messageType, [ 'license-request', 'individualization-request' ] );
+ assert_in_array(event.messageType, ['license-request', 'individualization-request']);
- config.messagehandler( event.messageType, event.message ).then( function( response ) {
- event.target.update( response ).catch(onFailure);
- });
+ config.messagehandler(event.messageType, event.message, {variantId: event.target._variantId}).then(function(response) {
+ return event.target.update(response);
+ }).catch(onFailure);
}
function onPlaying(event) {
@@ -43,14 +42,14 @@ function runTest(config,qualifier) {
}
function onTimeupdate(event) {
- if ( _video.currentTime > ( config.duration || 1 ) ) {
+ if (_video.currentTime > (config.duration || 1)) {
_video.removeEventListener('timeupdate', onTimeupdate);
_video.pause();
test.done();
}
}
- navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) {
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
return access.createMediaKeys();
}).then(function(mediaKeys) {
_mediaKeys = mediaKeys;
@@ -58,16 +57,19 @@ function runTest(config,qualifier) {
}).then(function() {
waitForEventAndRunStep('playing', _video, onPlaying, test);
- config.initData.forEach( function( initData ) {
+ config.initData.forEach(function(initData,i) {
var mediaKeySession = _mediaKeys.createSession( 'temporary' );
+ mediaKeySession._variantId = config.variantIds ? config.variantIds[i] : undefined;
waitForEventAndRunStep('message', mediaKeySession, onMessage, test);
- _mediaKeySessions.push( mediaKeySession );
- mediaKeySession.generateRequest( config.initDataType, initData ).catch( onFailure );
+ _mediaKeySessions.push(mediaKeySession);
+ mediaKeySession.generateRequest(config.initDataType, initData).catch(onFailure);
} );
return testmediasource(config);
}).then(function(source) {
_mediaSource = source;
_video.src = URL.createObjectURL(_mediaSource);
+ return source.done;
+ }).then(function(){
_video.play();
}).catch(onFailure);
}, testname);
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-setMediaKeys.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-setMediaKeys.js
index 4939daad596..fddcf567741 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-setMediaKeys.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-setMediaKeys.js
@@ -5,15 +5,15 @@ SETMEDIAKEYS_AFTER_UPDATE = 3;
function runTest(config,qualifier) {
- var testcase = ( config.testcase === SETMEDIAKEYS_IMMEDIATELY ) ? 'setMediaKeys first'
- : ( config.testcase === SETMEDIAKEYS_AFTER_SRC ) ? 'setMediaKeys after setting video.src'
- : ( config.testcase === SETMEDIAKEYS_ONENCRYPTED ) ? 'setMediaKeys in encrypted event'
- : ( config.testcase === SETMEDIAKEYS_AFTER_UPDATE ) ? 'setMediaKeys after updating session'
+ var testcase = (config.testcase === SETMEDIAKEYS_IMMEDIATELY) ? 'setMediaKeys first'
+ : (config.testcase === SETMEDIAKEYS_AFTER_SRC) ? 'setMediaKeys after setting video.src'
+ : (config.testcase === SETMEDIAKEYS_ONENCRYPTED) ? 'setMediaKeys in encrypted event'
+ : (config.testcase === SETMEDIAKEYS_AFTER_UPDATE) ? 'setMediaKeys after updating session'
: 'unknown';
- var testname = testnamePrefix( qualifier, config.keysystem )
+ var testname = testnamePrefix(qualifier, config.keysystem)
+ ', temporary, '
- + /video\/([^;]*)/.exec( config.videoType )[ 1 ]
+ + /video\/([^;]*)/.exec(config.videoType)[1]
+ ', playback, ' + testcase;
var configuration = { initDataTypes: [ config.initDataType ],
@@ -21,8 +21,7 @@ function runTest(config,qualifier) {
videoCapabilities: [ { contentType: config.videoType } ],
sessionTypes: [ 'temporary' ] };
- async_test( function( test ) {
-
+ async_test(function(test) {
var _video = config.video,
_mediaKeys,
_mediaKeySession,
@@ -33,19 +32,17 @@ function runTest(config,qualifier) {
}
function onMessage(event) {
- assert_equals( event.target, _mediaKeySession );
- assert_true( event instanceof window.MediaKeyMessageEvent );
- assert_equals( event.type, 'message');
+ assert_equals(event.target, _mediaKeySession);
+ assert_true(event instanceof window.MediaKeyMessageEvent);
+ assert_equals(event.type, 'message');
- assert_any( assert_equals,
- event.messageType,
- [ 'license-request', 'individualization-request' ] );
+ assert_in_array( event.messageType, ['license-request', 'individualization-request']);
- config.messagehandler( event.messageType, event.message ).then( function( response ) {
+ config.messagehandler(event.messageType, event.message).then(function(response) {
return _mediaKeySession.update( response );
- }).then( function() {
- if ( config.testcase === SETMEDIAKEYS_AFTER_UPDATE ) {
- return _video.setMediaKeys( _mediaKeys );
+ }).then(function() {
+ if (config.testcase === SETMEDIAKEYS_AFTER_UPDATE) {
+ return _video.setMediaKeys(_mediaKeys);
}
}).catch(onFailure);
}
@@ -56,7 +53,7 @@ function runTest(config,qualifier) {
assert_equals(event.type, 'encrypted');
var promise = ( config.testcase === SETMEDIAKEYS_ONENCRYPTED )
- ? _video.setMediaKeys( _mediaKeys )
+ ? _video.setMediaKeys(_mediaKeys)
: Promise.resolve();
promise.then( function() {
@@ -67,7 +64,7 @@ function runTest(config,qualifier) {
}
function onTimeupdate(event) {
- if ( _video.currentTime > ( config.duration || 1 ) ) {
+ if (_video.currentTime > (config.duration || 1)) {
_video.pause();
test.done();
}
@@ -79,7 +76,7 @@ function runTest(config,qualifier) {
_video.addEventListener('timeupdate', onTimeupdate, true);
}
- navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) {
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
return access.createMediaKeys();
}).then(test.step_func(function(mediaKeys) {
_mediaKeys = mediaKeys;
@@ -93,14 +90,16 @@ function runTest(config,qualifier) {
waitForEventAndRunStep('playing', _video, onPlaying, test);
return testmediasource(config);
- }).then(test.step_func(function(source) {
+ }).then(function(source) {
_mediaSource = source;
_video.src = URL.createObjectURL(_mediaSource);
+ return source.done;
+ }).then(function(){
_video.play();
- if ( config.testcase === SETMEDIAKEYS_AFTER_SRC ) {
- return _video.setMediaKeys( _mediaKeys );
+ if (config.testcase === SETMEDIAKEYS_AFTER_SRC) {
+ return _video.setMediaKeys(_mediaKeys);
}
- })).catch(onFailure);
+ }).catch(onFailure);
}, testname);
}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-two-videos.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-two-videos.js
index 2e6aea3b19e..b17168d113d 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-two-videos.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-two-videos.js
@@ -1,8 +1,8 @@
function runTest(config,qualifier) {
- var testname = testnamePrefix( qualifier, config.keysystem )
+ var testname = testnamePrefix(qualifier, config.keysystem)
+ ', temporary, '
- + /video\/([^;]*)/.exec( config.videoType )[ 1 ]
+ + /video\/([^;]*)/.exec(config.videoType)[1]
+ ', playback two videos';
var configuration = { initDataTypes: [ config.initDataType ],
@@ -12,12 +12,12 @@ function runTest(config,qualifier) {
promise_test(function(test)
{
- var promises = config.video.map( function( video ) { return play_video_as_promise( test, video ); } );
+ var promises = config.video.map(function(video) { return play_video_as_promise(test,video); });
return Promise.all(promises);
- }, testname );
+ }, testname);
- function play_video_as_promise( test, _video ) {
+ function play_video_as_promise(test, _video) {
var _mediaKeys,
_mediaKeySession,
_mediaSource;
@@ -27,17 +27,15 @@ function runTest(config,qualifier) {
}
function onMessage(event) {
- assert_equals( event.target, _mediaKeySession );
- assert_true( event instanceof window.MediaKeyMessageEvent );
- assert_equals( event.type, 'message');
+ assert_equals(event.target, _mediaKeySession);
+ assert_true(event instanceof window.MediaKeyMessageEvent);
+ assert_equals(event.type, 'message');
- assert_any( assert_equals,
- event.messageType,
- [ 'license-request', 'individualization-request' ] );
+ assert_in_array( event.messageType, ['license-request', 'individualization-request']);
- config.messagehandler( event.messageType, event.message ).then( function( response ) {
- _mediaKeySession.update( response ).catch(onFailure);
- });
+ config.messagehandler(event.messageType, event.message).then(function(response) {
+ return _mediaKeySession.update(response);
+ }).catch(onFailure);
}
function onEncrypted(event) {
@@ -47,16 +45,15 @@ function runTest(config,qualifier) {
waitForEventAndRunStep('message', _mediaKeySession, onMessage, test);
- _mediaKeySession.generateRequest( config.initData ? config.initDataType : event.initDataType,
- config.initData || event.initData )
- .catch(onFailure);
+ _mediaKeySession.generateRequest(config.initData ? config.initDataType : event.initDataType,
+ config.initData || event.initData).catch(onFailure);
}
function wait_for_timeupdate_message(video)
{
return new Promise(function(resolve) {
video.addEventListener('timeupdate', function listener(event) {
- if ( event.target.currentTime > ( config.duration || 1 ) )
+ if (event.target.currentTime > (config.duration || 1))
{
video.removeEventListener('timeupdate', listener);
resolve(event);
@@ -65,18 +62,20 @@ function runTest(config,qualifier) {
});
};
- return navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) {
+ return navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
return access.createMediaKeys();
}).then(function(mediaKeys) {
_mediaKeys = mediaKeys;
return _video.setMediaKeys(_mediaKeys);
}).then(function() {
- _mediaKeySession = _mediaKeys.createSession( 'temporary' );
+ _mediaKeySession = _mediaKeys.createSession('temporary');
waitForEventAndRunStep('encrypted', _video, onEncrypted, test);
return testmediasource(config);
}).then(function(source) {
_mediaSource = source;
_video.src = URL.createObjectURL(_mediaSource);
+ return source.done;
+ }).then(function(){
_video.play();
return wait_for_timeupdate_message(_video);
}).catch(onFailure);
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-waitingforkey.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-waitingforkey.js
index 0edd04a3a2c..daa9f3b1693 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-waitingforkey.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary-waitingforkey.js
@@ -3,53 +3,52 @@ function runTest(config,qualifier) {
// config.initData contains a list of keys. We expect those to be needed in order and get
// one waitingforkey event for each one.
- var testname = testnamePrefix( qualifier, config.keysystem )
+ var testname = testnamePrefix(qualifier, config.keysystem)
+ ', successful playback, temporary, '
- + /video\/([^;]*)/.exec( config.videoType )[ 1 ]
+ + /video\/([^;]*)/.exec(config.videoType)[1]
+ ', waitingforkey event, '
- + config.initData.length + ' key' + ( config.initData.length > 1 ? 's' : '' );
+ + config.initData.length + ' key' + (config.initData.length > 1 ? 's' : '');
var configuration = { initDataTypes: [ config.initDataType ],
audioCapabilities: [ { contentType: config.audioType } ],
videoCapabilities: [ { contentType: config.videoType } ],
sessionTypes: [ 'temporary' ] };
- async_test( function( test ) {
-
+ async_test(function(test) {
var _video = config.video,
_mediaKeys,
- _mediaKeySessions = [ ],
+ _mediaKeySessions = [],
_mediaSource;
- function onFailure( error ) {
+ function onFailure(error) {
forceTestFailureFromPromise(test, error);
}
function onMessage(event) {
config.messagehandler( event.messageType, event.message ).then( function( response ) {
- event.target.update( response ).catch(onFailure);
- });
+ return event.target.update( response );
+ }).catch(onFailure);
}
function onWaitingForKey(event) {
// Expect one waitingforkey event for each initData we were given
- assert_less_than( _mediaKeySessions.length, config.initData.length );
+ assert_less_than(_mediaKeySessions.length, config.initData.length);
var mediaKeySession = _mediaKeys.createSession( 'temporary' );
waitForEventAndRunStep('message', mediaKeySession, onMessage, test);
- _mediaKeySessions.push( mediaKeySession );
- mediaKeySession.generateRequest( config.initDataType, config.initData[ _mediaKeySessions.length - 1 ] ).catch(onFailure);
+ _mediaKeySessions.push(mediaKeySession);
+ mediaKeySession.generateRequest(config.initDataType, config.initData[_mediaKeySessions.length - 1]).catch(onFailure);
}
function onTimeupdate(event) {
- if ( _video.currentTime > ( config.duration || 1 ) ) {
- assert_equals( _mediaKeySessions.length, config.initData.length );
+ if (_video.currentTime > (config.duration || 1)) {
+ assert_equals(_mediaKeySessions.length, config.initData.length);
_video.removeEventListener('timeupdate', onTimeupdate);
_video.pause();
test.done();
}
}
- navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) {
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
return access.createMediaKeys();
}).then(function(mediaKeys) {
_mediaKeys = mediaKeys;
@@ -64,6 +63,8 @@ function runTest(config,qualifier) {
}).then(function(source) {
_mediaSource = source;
_video.src = URL.createObjectURL(_mediaSource);
+ return source.done;
+ }).then(function(){
_video.play();
}).catch(onFailure);
}, testname);
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary.js
index bd77ab5efdd..2f79824ec74 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/playback-temporary.js
@@ -1,8 +1,8 @@
function runTest(config,qualifier) {
- var testname = testnamePrefix( qualifier, config.keysystem )
+ var testname = testnamePrefix(qualifier, config.keysystem)
+ ', temporary, '
- + /video\/([^;]*)/.exec( config.videoType )[ 1 ]
+ + /video\/([^;]*)/.exec(config.videoType)[1]
+ ', playback, ' + config.testcase;
var configuration = { initDataTypes: [ config.initDataType ],
@@ -10,7 +10,7 @@ function runTest(config,qualifier) {
videoCapabilities: [ { contentType: config.videoType } ],
sessionTypes: [ 'temporary' ] };
- async_test( function( test ) {
+ async_test(function(test) {
var _video = config.video,
_mediaKeys,
@@ -27,28 +27,26 @@ function runTest(config,qualifier) {
assert_equals(event.type, 'encrypted');
// Only create the session for the firs encrypted event
- if ( _mediaKeySession !== undefined ) return;
+ if (_mediaKeySession !== undefined) return;
var initDataType = config.initData ? config.initDataType : event.initDataType;
var initData = config.initData || event.initData;
- _mediaKeySession = _mediaKeys.createSession( 'temporary' );
+ _mediaKeySession = _mediaKeys.createSession('temporary');
waitForEventAndRunStep('message', _mediaKeySession, onMessage, test);
_mediaKeySession.generateRequest( initDataType, initData ).catch(onFailure);
}
function onMessage(event) {
- assert_equals( event.target, _mediaKeySession );
- assert_true( event instanceof window.MediaKeyMessageEvent );
- assert_equals( event.type, 'message');
+ assert_equals(event.target, _mediaKeySession);
+ assert_true(event instanceof window.MediaKeyMessageEvent);
+ assert_equals(event.type, 'message');
- assert_any( assert_equals,
- event.messageType,
- [ 'license-request', 'individualization-request' ] );
+ assert_in_array(event.messageType, ['license-request', 'individualization-request']);
- config.messagehandler( event.messageType, event.message ).then( function( response ) {
- event.target.update( response ).catch(onFailure);
- });
+ config.messagehandler(event.messageType, event.message).then(function(response) {
+ return event.target.update(response);
+ }).catch(onFailure);
}
function onPlaying(event) {
@@ -58,13 +56,13 @@ function runTest(config,qualifier) {
}
function onTimeupdate(event) {
- if ( _video.currentTime > ( config.duration || 1 ) ) {
+ if ( _video.currentTime > (config.duration || 1)) {
_video.pause();
test.done();
}
}
- navigator.requestMediaKeySystemAccess(config.keysystem, [ configuration ]).then(function(access) {
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
return access.createMediaKeys();
}).then(function(mediaKeys) {
_mediaKeys = mediaKeys;
@@ -76,6 +74,8 @@ function runTest(config,qualifier) {
}).then(function(source) {
_mediaSource = source;
_video.src = URL.createObjectURL(_mediaSource);
+ return source.done;
+ }).then(function(){
_video.play();
}).catch(onFailure);
}, testname);
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/requestmediakeysystemaccess.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/requestmediakeysystemaccess.js
new file mode 100644
index 00000000000..a739d38f543
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/requestmediakeysystemaccess.js
@@ -0,0 +1,320 @@
+function runTest(config, qualifier) {
+
+ var prefix = testnamePrefix(qualifier, config.keysystem) + ', requestMediaKeySystemAccess: ';
+
+ function expect_error(keySystem, configurations, expectedError, testname) {
+
+ var audioCapabilities = configurations.length ? configurations[0].audioCapabilities : undefined,
+ videoCapabilities = configurations.length ? configurations[0].videoCapabilities : undefined,
+ audiocontenttypes = audioCapabilities ? audioCapabilities.map( function(ac) { return "'" + ac.contentType + "'"; } ).join(',') : '',
+ videocontenttypes = videoCapabilities ? videoCapabilities.map( function(ac) { return "'" + ac.contentType + "'"; } ).join(',') : '',
+ modifiedtestname = testname.replace( '%audiocontenttype', audiocontenttypes ).replace( '%videocontenttype', videocontenttypes );
+
+ promise_test(function(test) {
+ return navigator.requestMediaKeySystemAccess(keySystem, configurations).then(function(a) {
+ assert_unreached('Unexpected requestMediaKeySystemAccess() success.');
+ }, function(e) {
+ assert_equals(e.name, expectedError);
+ });
+ }, prefix + modifiedtestname + ' should result in ' + expectedError );
+ }
+
+ function assert_subset(actual, expected, path) {
+ if (typeof expected == 'string') {
+ assert_equals(actual, expected, path);
+ } else {
+ if (expected.hasOwnProperty('length')) {
+ assert_equals(actual.length, expected.length, path + '.length');
+ }
+ for (property in expected) {
+ assert_subset(actual[property], expected[property], path + '.' + property);
+ }
+ }
+ }
+
+ function expect_config(keySystem, configurations, expectedConfiguration, testname) {
+ promise_test(function(test) {
+ return navigator.requestMediaKeySystemAccess(keySystem, configurations).then(function(a) {
+ assert_subset(a.getConfiguration(), expectedConfiguration, testname + ': ');
+ });
+ }, testname);
+ }
+
+ // Tests for Key System.
+ expect_error('', [{}], 'TypeError', 'Empty Key System');
+ expect_error('com.example.unsupported', [{}], 'NotSupportedError', 'Unsupported Key System');
+ expect_error(config.keysystem + '.', [{}], 'NotSupportedError', 'Key System ending in "."');
+ expect_error(config.keysystem.toUpperCase(), [{}], 'NotSupportedError', 'Capitalized Key System');
+ expect_error(config.keysystem + '\u028F', [{}], 'NotSupportedError', 'Non-ASCII Key System');
+
+ // Parent of Clear Key not supported.
+ expect_error(config.keysystem.match(/^(.*?)\./)[1], [{}], 'NotSupportedError', 'Root domain of Key System alone');
+ expect_error(config.keysystem.match(/^(.*?)\./)[0], [{}], 'NotSupportedError', 'Root domain of Key System, with dot');
+ expect_error(config.keysystem.match(/^(.*?\..*?)\./)[1], [{}], 'NotSupportedError', 'Domain of Key System along');
+ expect_error(config.keysystem.match(/^(.*?\..*?)\./)[0], [{}], 'NotSupportedError', 'Domain of Key System, with dot');
+
+ // Child of Clear Key not supported.
+ expect_error(config.keysystem+'.foo', [{}], 'NotSupportedError', 'Child of Key System');
+
+ // Prefixed Clear Key not supported.
+ expect_error('webkit-'+config.keysystem, [{}], 'NotSupportedError', 'Prefixed Key System');
+
+ // Incomplete names.
+ expect_error(config.keysystem.substr(0,7)+config.keysystem.substr(8), [{}], 'NotSupportedError', 'Missing characters in middle of Key System name');
+ expect_error(config.keysystem.substr(0,config.keysystem.length-1), [{}], 'NotSupportedError', 'Missing characters at end of Key System name');
+
+ // Spaces in key system name not supported.
+ expect_error(' '+config.keysystem, [{}], 'NotSupportedError', 'Leading space in Key System name');
+ expect_error(config.keysystem.substr(0,6) + ' ' + config.keysystem.substr(6), [{}], 'NotSupportedError', 'Extra space in Key System name');
+ expect_error(config.keysystem + ' ', [{}], 'NotSupportedError', 'Trailing space in Key System name');
+
+ // Extra dots in key systems names not supported.
+ expect_error('.' + config.keysystem, [{}], 'NotSupportedError', 'Leading dot in Key System name');
+ expect_error(config.keysystem.substr(0,6) + '.' + config.keysystem.substr(6), [{}], 'NotSupportedError', 'Extra dot in middle of Key System name');
+ expect_error(config.keysystem + '.', [{}], 'NotSupportedError', 'Trailing dot in Key System name');
+
+ // Key system name is case sensitive.
+ if (config.keysystem !== config.keysystem.toUpperCase()) {
+ expect_error(config.keysystem.toUpperCase(), [{}], 'NotSupportedError', 'Key System name is case sensitive');
+ }
+
+ if (config.keysystem !== config.keysystem.toLowerCase()) {
+ expect_error(config.keysystem.toLowerCase(), [{}], 'NotSupportedError', 'Key System name is case sensitive');
+ }
+
+ // Tests for trivial configurations.
+ expect_error(config.keysystem, [], 'TypeError', 'Empty supportedConfigurations');
+ expect_config(config.keysystem, [{}], {}, 'Empty configuration');
+
+ // Various combinations of supportedConfigurations.
+ expect_config(config.keysystem, [{
+ initDataTypes: [config.initDataType],
+ audioCapabilities: [{contentType: config.audioType}],
+ videoCapabilities: [{contentType: config.videoType}],
+ }], {
+ initDataTypes: [config.initDataType],
+ audioCapabilities: [{contentType: config.audioType}],
+ videoCapabilities: [{contentType: config.videoType}],
+ }, 'Basic supported configuration');
+
+ expect_config(config.keysystem, [{
+ initDataTypes: ['fakeidt', config.initDataType],
+ audioCapabilities: [{contentType: 'audio/fake'}, {contentType: config.audioType}],
+ videoCapabilities: [{contentType: 'video/fake'}, {contentType: config.videoType}],
+ }], {
+ initDataTypes: [config.initDataType],
+ audioCapabilities: [{contentType: config.audioType}],
+ videoCapabilities: [{contentType: config.videoType}],
+ }, 'Partially supported configuration');
+
+ expect_config(config.keysystem, [{
+ audioCapabilities: [{contentType: config.audioType}],
+ }], {
+ audioCapabilities: [{contentType: config.audioType}],
+ }, 'Supported audio codec');
+
+ expect_config(config.keysystem, [{
+ audioCapabilities: [{contentType: config.audioType.replace(/^(.*?);(.*)/, "$1; $2")}],
+ }], {
+ audioCapabilities: [{contentType: config.audioType.replace(/^(.*?);(.*)/, "$1; $2")}],
+ }, 'ContentType formatting must be preserved');
+
+ expect_error(config.keysystem, [{
+ audioCapabilities: [{contentType: 'audio/webm; codecs=fake'}],
+ }], 'NotSupportedError', 'Unsupported audio codec (%audiocontenttype)');
+
+ expect_error(config.keysystem, [{
+ audioCapabilities: [{contentType: 'video/webm; codecs=fake'}],
+ }], 'NotSupportedError', 'Unsupported video codec (%videocontenttype)');
+
+ expect_error(config.keysystem, [{
+ audioCapabilities: [
+ {contentType: 'audio/webm; codecs=mp4a'},
+ {contentType: 'audio/webm; codecs=mp4a.40.2'}
+ ],
+ }], 'NotSupportedError', 'Mismatched audio container/codec (%audiocontenttype)');
+
+ expect_error(config.keysystem, [{
+ audioCapabilities: [{contentType: config.videoType}],
+ }], 'NotSupportedError', 'Video codec specified in audio field (%audiocontenttype)');
+
+ expect_error(config.keysystem, [{
+ videoCapabilities: [{contentType: config.audioType}],
+ }], 'NotSupportedError', 'Audio codec specified in video field (%videocontenttype)');
+
+ expect_error(config.keysystem, [{
+ audioCapabilities: [
+ {contentType: 'audio/webm; codecs=avc1'},
+ {contentType: 'audio/webm; codecs=avc1.42e01e'}
+ ],
+ }], 'NotSupportedError', 'Mismatched audio container/codec (%audiocontenttype)');
+
+ expect_error(config.keysystem, [{
+ audioCapabilities: [
+ {contentType: 'audio/mp4; codecs=vorbis'}
+ ],
+ }], 'NotSupportedError', 'Mismatched audio container/codec (%audiocontenttype)');
+
+ expect_config(config.keysystem, [
+ {initDataTypes: ['fakeidt']},
+ {initDataTypes: [config.initDataType]}
+ ], {initDataTypes: [config.initDataType]}, 'Two configurations, one supported');
+
+ expect_config(config.keysystem, [
+ {initDataTypes: [config.initDataType]},
+ {}
+ ], {initDataTypes: [config.initDataType]}, 'Two configurations, both supported');
+
+ // Audio MIME type does not support video codecs.
+ expect_error(config.keysystem, [{
+ audioCapabilities: [
+ {contentType: 'audio/webm; codecs="vp8,vorbis"'},
+ {contentType: 'audio/webm; codecs="vorbis, vp8"'},
+ {contentType: 'audio/webm; codecs="vp8"'}
+ ],
+ }], 'NotSupportedError', 'Audio MIME type does not support video codecs (webm) (%audiocontenttype)');
+
+ expect_error(config.keysystem, [{
+ audioCapabilities: [
+ {contentType: 'audio/mp4; codecs="avc1"'},
+ {contentType: 'audio/mp4; codecs="avc1.4d401e"'},
+ ],
+ }], 'NotSupportedError', 'Audio MIME type does not support video codecs (mp4) (%audiocontenttype)');
+
+ // Video MIME type does not support audio codecs.
+ expect_error(config.keysystem, [{
+ videoCapabilities: [
+ {contentType: 'video/webm; codecs="vp8,vorbis"'},
+ {contentType: 'video/webm; codecs="vorbis, vp8"'},
+ {contentType: 'video/webm; codecs="vorbis"'}
+ ],
+ }], 'NotSupportedError', 'Video MIME type does not support audio codecs (webm) (%videocontenttype)');
+
+ expect_error(config.keysystem, [{
+ videoCapabilities: [
+ {contentType: 'video/mp4; codecs="mp4a"'},
+ {contentType: 'video/mp4; codecs="mp4a.40.2"'}
+ ],
+ }], 'NotSupportedError', 'Video MIME type does not support audio codecs (mp4) (%videocontenttype)');
+
+ // WebM does not support AVC1/AAC.
+ expect_error(config.keysystem, [{
+ audioCapabilities: [
+ {contentType: 'audio/webm; codecs="aac"'},
+ {contentType: 'audio/webm; codecs="avc1"'},
+ {contentType: 'audio/webm; codecs="vp8,aac"'}
+ ],
+ }], 'NotSupportedError', 'WebM audio does not support AVC1/AAC (%audiocontenttype)');
+
+ expect_error(config.keysystem, [{
+ videoCapabilities: [
+ {contentType: 'video/webm; codecs="aac"'},
+ {contentType: 'video/webm; codecs="avc1"'},
+ {contentType: 'video/webm; codecs="vp8,aac"'}
+ ],
+ }], 'NotSupportedError', 'WebM video does not support AVC1/AAC (%videocontenttype)');
+
+ // Extra space is allowed in contentType.
+ expect_config(config.keysystem, [{
+ videoCapabilities: [{contentType: ' ' + config.videoType}],
+ }], {
+ videoCapabilities: [{contentType: ' ' + config.videoType}],
+ }, 'Leading space in contentType');
+
+ expect_config(config.keysystem, [{
+ videoCapabilities: [{contentType: config.videoType.replace( /^(.*?);(.*)/, "$1 ;$2")}],
+ }], {
+ videoCapabilities: [{contentType: config.videoType.replace( /^(.*?);(.*)/, "$1 ;$2")}],
+ }, 'Space before ; in contentType');
+
+
+ expect_config(config.keysystem, [{
+ videoCapabilities: [{contentType: config.videoType + ' '}],
+ }], {
+ videoCapabilities: [{contentType: config.videoType + ' '}],
+ }, 'Trailing space in contentType');
+
+ expect_config(config.keysystem, [{
+ videoCapabilities: [{contentType: config.videoType.replace( /^(.*?codecs=\")(.*)/, "$1 $2")}],
+ }], {
+ videoCapabilities: [{contentType: config.videoType.replace( /^(.*?codecs=\")(.*)/, "$1 $2")}],
+ }, 'Space at start of codecs parameter');
+
+ expect_config(config.keysystem, [{
+ videoCapabilities: [{contentType: config.videoType.replace( /^(.*?codecs=\".*)\"/, "$1 \"")}],
+ }], {
+ videoCapabilities: [{contentType: config.videoType.replace( /^(.*?codecs=\".*)\"/, "$1 \"")}],
+ }, 'Space at end of codecs parameter');
+
+ // contentType is not case sensitive (except the codec names).
+ expect_config(config.keysystem, [{
+ videoCapabilities: [{contentType: 'V' + config.videoType.substr(1)}],
+ }], {
+ videoCapabilities: [{contentType: 'V' + config.videoType.substr(1)}],
+ }, 'Video/' );
+
+ expect_config(config.keysystem, [{
+ videoCapabilities: [{contentType: config.videoType.replace( /^(.*?)c(odecs.*)/, "$1C$2")}],
+ }], {
+ videoCapabilities: [{contentType: config.videoType.replace( /^(.*?)c(odecs.*)/, "$1C$2")}],
+ }, 'Codecs=');
+
+ var t = config.videoType.match(/(.*?)(;.*)/);
+ expect_config(config.keysystem, [{
+ videoCapabilities: [{contentType: t[1].toUpperCase() + t[2]}],
+ }], {
+ videoCapabilities: [{contentType: t[1].toUpperCase() + t[2]}],
+ }, 'Upper case MIME type');
+
+ t = config.videoType.match(/(.*?)codecs(.*)/);
+ expect_config(config.keysystem, [{
+ videoCapabilities: [{contentType: t[1] + 'CODECS' + t[2]}],
+ }], {
+ videoCapabilities: [{contentType: t[1] + 'CODECS' + t[2]}],
+ }, 'CODECS=');
+
+ // Unrecognized attributes are not allowed.
+ expect_error(config.keysystem, [{
+ videoCapabilities: [{contentType: 'video/webm; foo="bar"'}],
+ }], 'NotSupportedError', 'Unrecognized foo with webm (%videocontenttype)');
+
+ expect_error(config.keysystem, [{
+ videoCapabilities: [{contentType: 'video/mp4; foo="bar"'}],
+ }], 'NotSupportedError', 'Unrecognized foo with mp4 (%videocontenttype)');
+
+ expect_error(config.keysystem, [{
+ videoCapabilities: [{contentType: config.videoType + '; foo="bar"'}],
+ }], 'NotSupportedError', 'Unrecognized foo with codecs (%videocontenttype)');
+
+ // Invalid contentTypes.
+ expect_error(config.keysystem, [{
+ videoCapabilities: [{contentType: 'fake'}],
+ }], 'NotSupportedError', 'contentType: %videocontenttype');
+
+ expect_error(config.keysystem, [{
+ audioCapabilities: [{contentType: 'audio/fake'}],
+ }], 'NotSupportedError', 'contentType: %audiocontenttype');
+
+ expect_error(config.keysystem, [{
+ videoCapabilities: [{contentType: 'video/fake'}],
+ }], 'NotSupportedError', 'contentType: %videocontenttype');
+
+ // The actual codec names are case sensitive.
+ t = config.videoType.match( /(.*?codecs=\")(.*?\")(.*)/ );
+ if (t[2] !== t[2].toUpperCase()) {
+ expect_error(config.keysystem, [{
+ videoCapabilities: [{contentType: t[1] + t[2].toUpperCase() + t[3] }],
+ }], 'NotSupportedError', 'contentType: %videocontenttype');
+ }
+
+ if (t[2] !== t[2].toLowerCase()) {
+ expect_error(config.keysystem, [{
+ videoCapabilities: [{contentType: t[1] + t[2].toLowerCase() + t[3] }],
+ }], 'NotSupportedError', 'contentType: %videocontenttype');
+ }
+
+ // Extra comma is not allowed in codecs.
+ expect_error(config.keysystem, [{
+ videoCapabilities: [{contentType: t[1] + ',' + t[2] + t[3] }],
+ }], 'NotSupportedError', 'contentType: %videocontenttype');
+}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/reset-src-after-setmediakeys.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/reset-src-after-setmediakeys.js
new file mode 100644
index 00000000000..acddd8dd5f4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/reset-src-after-setmediakeys.js
@@ -0,0 +1,61 @@
+function runTest(config)
+{
+ async_test(function(test) {
+ var mediaKeys;
+ var mediaSource;
+ var encryptedEventIndex = 0;
+ var video = config.video;
+ var keysystem = config.keysystem;
+ var configuration = {
+ initDataTypes: [config.initDataType],
+ audioCapabilities: [{
+ contentType: config.audioType
+ }],
+ videoCapabilities: [{
+ contentType: config.videoType
+ }],
+ sessionTypes: ['temporary']
+ };
+
+ assert_not_equals(video, null);
+
+ var onEncrypted = function(event) {
+ ++encryptedEventIndex;
+ assert_equals(video.mediaKeys, mediaKeys);
+
+ // This event is fired once for the audio stream and once
+ // for the video stream each time .src is set.
+ if (encryptedEventIndex === 2) {
+ // Finished first video; Create new media source and wait for two more encrypted events
+ return testmediasource(config).then(function (source) {
+ video.src = URL.createObjectURL(source);
+ }).catch(function (error) {
+ forceTestFailureFromPromise(test, error)
+ });
+ } else if (encryptedEventIndex === 4) {
+ // Finished second video.
+ test.done();
+ }
+ };
+
+ // Create a MediaKeys object and assign it to video.
+ return navigator.requestMediaKeySystemAccess(keysystem, [configuration]).then(test.step_func(function (access) {
+ assert_equals(access.keySystem, keysystem);
+ return access.createMediaKeys();
+ })).then(test.step_func(function (result) {
+ mediaKeys = result;
+ assert_not_equals(mediaKeys, null);
+ return video.setMediaKeys(mediaKeys);
+ })).then(test.step_func(function () {
+ assert_equals(video.mediaKeys, mediaKeys);
+ return testmediasource(config);
+ })).then(function (source) {
+ waitForEventAndRunStep('encrypted', video, onEncrypted, test);
+ mediaSource = source;
+ video.src = URL.createObjectURL(mediaSource);
+ }).catch(function (error) {
+ forceTestFailureFromPromise(test, error);
+ });
+
+ }, 'Reset src after setMediaKeys().');
+}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-again-after-playback.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-again-after-playback.js
new file mode 100644
index 00000000000..772bfcaa872
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-again-after-playback.js
@@ -0,0 +1,79 @@
+function runTest(config, qualifier) {
+ var testname = testnamePrefix(qualifier, config.keysystem)
+ + ', setmediakeys again after playback';
+
+ var configuration = getSimpleConfigurationForContent(config.content);
+
+ if (config.initDataType && config.initData) {
+ configuration.initDataTypes = [config.initDataType];
+ }
+
+ async_test(function(test) {
+ var _video = config.video,
+ _access,
+ _mediaKeys,
+ _mediaKeySession,
+ _mediaSource;
+
+ function onFailure(error) {
+ forceTestFailureFromPromise(test, error);
+ }
+
+ function onMessage(event) {
+ config.messagehandler(event.messageType, event.message).then( function(response) {
+ _mediaKeySession.update(response).catch(onFailure).then(function() {
+ _video.play();
+ });
+ });
+ }
+
+ function onEncrypted(event) {
+ waitForEventAndRunStep('message', _mediaKeySession, onMessage, test);
+ _mediaKeySession.generateRequest( config.initData ? config.initDataType : event.initDataType,
+ config.initData || event.initData )
+ .catch(onFailure);
+ }
+
+ function playVideo()
+ {
+ return new Promise(function(resolve) {
+ _mediaKeySession = _mediaKeys.createSession('temporary');
+ waitForEventAndRunStep('encrypted', _video, onEncrypted, test);
+ _video.src = URL.createObjectURL(_mediaSource);
+ resolve('success');
+ });
+ }
+
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
+ _access = access;
+ return _access.createMediaKeys();
+ }).then(function(result) {
+ _mediaKeys = result;
+ return _video.setMediaKeys(_mediaKeys);
+ }).then(function() {
+ return config.servercertificate ? _mediaKeys.setServerCertificate( config.servercertificate ) : true;
+ }).then(function( success ) {
+ return testmediasource(config);
+ }).then(function(source) {
+ _mediaSource = source;
+ return playVideo();
+ }).then(function(results) {
+ return _access.createMediaKeys();
+ }).then(function(result) {
+ _mediaKeys = result;
+ return waitForEvent('playing', _video);
+ }).then(test.step_func(function(result) {
+ assert_false(_video.ended);
+ return _video.setMediaKeys(_mediaKeys);
+ })).then(function() {
+ // Able to change MediaKeys while playing.
+ // This is not required to fail.
+ _video.src='';
+ test.done();
+ }, test.step_func(function(error) {
+ assert_in_array(error.name, ['InvalidStateError','NotSupportedError']);
+ _video.src='';
+ test.done();
+ })).catch(onFailure);
+ }, testname);
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-again-after-resetting-src.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-again-after-resetting-src.js
new file mode 100644
index 00000000000..a8706009821
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-again-after-resetting-src.js
@@ -0,0 +1,79 @@
+function runTest(config, qualifier) {
+ var testname = testnamePrefix(qualifier, config.keysystem)
+ + ', setmediakeys again after resetting src';
+
+ var configuration = getSimpleConfigurationForContent(config.content);
+
+ if (config.initDataType && config.initData) {
+ configuration.initDataTypes = [config.initDataType];
+ }
+
+ async_test(function(test) {
+ var _video = config.video,
+ _access,
+ _mediaKeys,
+ _mediaKeySession,
+ _mediaSource;
+
+ function onFailure(error) {
+ forceTestFailureFromPromise(test, error);
+ }
+
+ function onMessage(event) {
+ config.messagehandler(event.messageType, event.message).then(function(response) {
+ _mediaKeySession.update(response).catch(onFailure).then(function() {
+ _video.play();
+ });
+ });
+ }
+
+ function onEncrypted(event) {
+ waitForEventAndRunStep('message', _mediaKeySession, onMessage, test);
+ _mediaKeySession.generateRequest( config.initData ? config.initDataType : event.initDataType,
+ config.initData || event.initData )
+ .catch(onFailure);
+ }
+
+ function playVideoAndWaitForTimeupdate()
+ {
+ return new Promise(function(resolve) {
+ testmediasource(config).then(function(source) {
+ _mediaKeySession = _mediaKeys.createSession('temporary');
+ _video.src = URL.createObjectURL(source);
+ });
+ _video.addEventListener('timeupdate', function listener(event) {
+ if (event.target.currentTime < (config.duration || 1))
+ return;
+ _video.removeEventListener('timeupdate', listener);
+ resolve('success');
+ });
+ });
+ }
+
+ waitForEventAndRunStep('encrypted', _video, onEncrypted, test);
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
+ _access = access;
+ return _access.createMediaKeys();
+ }).then(function(result) {
+ _mediaKeys = result;
+ return _video.setMediaKeys(_mediaKeys);
+ }).then(function() {
+ return config.servercertificate ? _mediaKeys.setServerCertificate( config.servercertificate ) : true;
+ }).then(function( success ) {
+ return playVideoAndWaitForTimeupdate();
+ }).then(function(results) {
+ return _access.createMediaKeys();
+ }).then(function(result) {
+ _mediaKeys = result;
+ _video.src = '';
+ return _video.setMediaKeys(_mediaKeys);
+ }).then(function() {
+ return config.servercertificate ? _mediaKeys.setServerCertificate( config.servercertificate ) : true;
+ }).then(function( success ) {
+ return playVideoAndWaitForTimeupdate();
+ }).then(function() {
+ _video.src = '';
+ test.done();
+ }).catch(onFailure);
+ }, testname);
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-at-same-time.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-at-same-time.js
new file mode 100644
index 00000000000..6d67d95b1f0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-at-same-time.js
@@ -0,0 +1,59 @@
+function runTest(config, qualifier) {
+ var testname = testnamePrefix(qualifier, config.keysystem)
+ + ', setmediakeys at same time';
+
+ var configuration = getSimpleConfigurationForContent(config.content);
+
+ async_test(function(test) {
+ var _video = config.video,
+ _access,
+ _mediaKeys1,
+ _mediaKeys2,
+ _mediaKeys3,
+ _mediaKeys4,
+ _mediaKeys5;
+
+ // Test MediaKeys assignment.
+ assert_equals(_video.mediaKeys, null);
+ assert_equals(typeof _video.setMediaKeys, 'function');
+
+ function onFailure(error) {
+ forceTestFailureFromPromise(test, error);
+ }
+
+ function setMediaKeys(mediaKeys) {
+ return _video.setMediaKeys(mediaKeys)
+ .then(function() {return 1}, function() {return 0})
+ }
+
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
+ _access = access;
+ return _access.createMediaKeys();
+ }).then(function(result) {
+ _mediaKeys1 = result;
+ return _access.createMediaKeys();
+ }).then(function(result) {
+ _mediaKeys2 = result;
+ return _access.createMediaKeys();
+ }).then(function(result) {
+ _mediaKeys3 = result;
+ return _access.createMediaKeys();
+ }).then(function(result) {
+ _mediaKeys4 = result;
+ return _access.createMediaKeys();
+ }).then(function(result) {
+ _mediaKeys5 = result;
+ return Promise.all([
+ setMediaKeys(_mediaKeys1),
+ setMediaKeys(_mediaKeys2),
+ setMediaKeys(_mediaKeys3),
+ setMediaKeys(_mediaKeys4),
+ setMediaKeys(_mediaKeys5)
+ ]);
+ }).then(function(results) {
+ var sum = results.reduce((a, b) => a + b, 0);
+ assert_in_array(sum,[1,5]);
+ test.done();
+ }).catch(onFailure);
+ }, testname);
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-multiple-times-with-different-mediakeys.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-multiple-times-with-different-mediakeys.js
new file mode 100644
index 00000000000..ef44477b16f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-multiple-times-with-different-mediakeys.js
@@ -0,0 +1,98 @@
+function runTest(config, qualifier) {
+ var testname = testnamePrefix( qualifier, config.keysystem )
+ + ', setmediakeys multiple times with different mediakeys';
+
+ var configuration = getSimpleConfigurationForContent( config.content );
+
+ async_test (function (test) {
+ var _video = config.video,
+ _access,
+ _mediaKeys1,
+ _mediaKeys2,
+ _usingMediaKeys2 = false;;
+
+ // Test MediaKeys assignment.
+ assert_equals(_video.mediaKeys, null);
+ assert_equals(typeof _video.setMediaKeys, 'function');
+
+ function onFailure(error) {
+ forceTestFailureFromPromise(test, error);
+ }
+
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
+ _access = access;
+ return _access.createMediaKeys();
+ }).then(test.step_func(function(result) {
+ _mediaKeys1 = result;
+ assert_not_equals(_mediaKeys1, null);
+ // Create a second mediaKeys.
+ return _access.createMediaKeys();
+ })).then(test.step_func(function(result) {
+ _mediaKeys2 = result;
+ assert_not_equals(_mediaKeys2, null);
+ // Set _mediaKeys1 on video.
+ return _video.setMediaKeys(_mediaKeys1);
+ })).then(test.step_func(function() {
+ assert_equals(_video.mediaKeys, _mediaKeys1);
+ // Set _mediaKeys2 on video (switching MediaKeys).
+ return _video.setMediaKeys(_mediaKeys2);
+ })).then(test.step_func(function() {
+ assert_equals(_video.mediaKeys, _mediaKeys2);
+ // Clear mediaKeys from video.
+ return _video.setMediaKeys(null);
+ })).then(test.step_func(function() {
+ assert_equals(_video.mediaKeys, null);
+ // Set _mediaKeys1 on video again.
+ return _video.setMediaKeys(_mediaKeys1);
+ })).then(test.step_func(function() {
+ assert_equals(_video.mediaKeys, _mediaKeys1);
+ return testmediasource(config);
+ })).then(function(source) {
+ // Set src attribute on Video Element
+ _video.src = URL.createObjectURL(source);
+ // According to the specification, support for changing the Media Keys object after
+ // the src attribute on the video element has been set is optional. The following operation
+ // may therefore either succeed or fail. We handle both cases.
+ return _video.setMediaKeys(_mediaKeys2);
+ }).then(test.step_func(function() {
+ // Changing the Media Keys object succeeded
+ _usingMediaKeys2 = true;
+ assert_equals(_video.mediaKeys, _mediaKeys2);
+ // Return something so the promise resolves properly.
+ return Promise.resolve();
+ }), test.step_func(function(error) {
+ // Changing the Media Keys object failed
+ _usingMediaKeys2 = false;
+ assert_equals(_video.mediaKeys, _mediaKeys1);
+ // The specification allows either NotSupportedError or InvalidStateError depending on
+ // whether the failure was because changing Media Keys object is not supported
+ // or just not allowed at this time, respectively.
+ assert_in_array(error.name, ['InvalidStateError','NotSupportedError']);
+ assert_not_equals(error.message, '');
+ // Return something so the promise resolves properly.
+ return Promise.resolve();
+ })).then(function() {
+ // According to the specification, support for clearing the Media Keys object associated
+ // with the video element is optional. The following operation
+ // may therefore either succeed or fail. We handle both cases.
+ return _video.setMediaKeys(null);
+ }).then(test.step_func(function() {
+ // Clearing the media keys succeeded
+ assert_equals(_video.mediaKeys, null);
+ test.done();
+ }), test.step_func(function(error) {
+ // Clearing the media keys failed
+ if(!_usingMediaKeys2) {
+ assert_equals(_video.mediaKeys, _mediaKeys1);
+ } else {
+ assert_equals(_video.mediaKeys, _mediaKeys2);
+ }
+ // The specification allows either NotSupportedError or InvalidStateError depending on
+ // whether the failure was because changing Media Keys object is not supported
+ // or just not allowed at this time, respectively.
+ assert_in_array(error.name, ['InvalidStateError','NotSupportedError']);
+ assert_not_equals(error.message, '');
+ test.done();
+ })).catch(onFailure);
+ }, testname);
+}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-multiple-times-with-the-same-mediakeys.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-multiple-times-with-the-same-mediakeys.js
new file mode 100644
index 00000000000..f6af8267f24
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-multiple-times-with-the-same-mediakeys.js
@@ -0,0 +1,46 @@
+function runTest(config, qualifier) {
+ var testname = testnamePrefix( qualifier, config.keysystem )
+ + ', setmediakeys multiple times with the same mediakeys';
+
+ var configuration = getSimpleConfigurationForContent( config.content );
+
+ if ( config.initDataType && config.initData ) {
+ configuration.initDataTypes = [ config.initDataType ];
+ }
+
+ async_test (function (test) {
+ var _video = config.video,
+ _mediaKeys;
+
+ // Test MediaKeys assignment.
+ assert_equals(_video.mediaKeys, null);
+ assert_equals(typeof _video.setMediaKeys, 'function');
+
+ function onFailure(error) {
+ forceTestFailureFromPromise(test, error);
+ }
+
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
+ return access.createMediaKeys();
+ }).then(function(result) {
+ _mediaKeys = result;
+ // Set mediaKeys for first time on video should work.
+ return _video.setMediaKeys(_mediaKeys);
+ }).then(function(result) {
+ assert_equals(_video.mediaKeys, _mediaKeys);
+ // Set mediaKeys on video again should return a resolved promise.
+ return _video.setMediaKeys(_mediaKeys);
+ }).then(function (result) {
+ assert_equals(_video.mediaKeys, _mediaKeys);
+ return testmediasource(config);
+ }).then(function(source) {
+ // Set src attribute on Video Element
+ _video.src = URL.createObjectURL(source);
+ // Set mediaKeys again on video should still return a resolved promise.
+ return _video.setMediaKeys(_mediaKeys);
+ }).then(function() {
+ assert_equals(_video.mediaKeys, _mediaKeys);
+ test.done();
+ }).catch(onFailure);
+ }, testname);
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-to-multiple-video-elements.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-to-multiple-video-elements.js
new file mode 100644
index 00000000000..d98f33f0c1a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys-to-multiple-video-elements.js
@@ -0,0 +1,54 @@
+function runTest(config, qualifier) {
+ var testname = testnamePrefix(qualifier, config.keysystem)
+ + ', setMediaKeys to multiple video elements';
+
+ var configuration = getSimpleConfigurationForContent(config.content);
+
+ if ( config.initDataType && config.initData ) {
+ configuration.initDataTypes = [ config.initDataType ];
+ }
+
+ async_test (function (test) {
+ var _video1 = config.video1,
+ _video2 = config.video2,
+ _mediaKeys;
+
+ function onFailure(error) {
+ forceTestFailureFromPromise(test, error);
+ }
+
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
+ assert_equals(access.keySystem, config.keysystem)
+ return access.createMediaKeys();
+ }).then(function(result) {
+ _mediaKeys = result;
+ assert_not_equals(_mediaKeys, null);
+ assert_equals(typeof _mediaKeys.createSession, 'function');
+ return _video1.setMediaKeys(_mediaKeys);
+ }).then(function(result) {
+ assert_not_equals(_video1.mediaKeys, null);
+ assert_true(_video1.mediaKeys === _mediaKeys);
+ // The specification allows this to fail, but it is not required to fail.
+ return _video2.setMediaKeys(_mediaKeys);
+ }).then(function(result) {
+ // Second setMediaKeys is not required to fail.
+ assert_true(_video2.mediaKeys === _mediaKeys);
+ return Promise.resolve();
+ }, function(error) {
+ assert_equals(error.name, 'QuotaExceededError');
+ assert_not_equals(error.message, '');
+ // Return something so the promise resolves properly.
+ return Promise.resolve();
+ }).then(function() {
+ // Now clear it from video1.
+ return _video1.setMediaKeys(null);
+ }).then(function() {
+ // Should be assignable to video2.
+ return _video2.setMediaKeys(_mediaKeys);
+ }).then(function(result) {
+ assert_not_equals(_video2.mediaKeys, null);
+ assert_true(_video2.mediaKeys === _mediaKeys);
+ test.done();
+ }).catch(onFailure);
+ }, testname);
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys.js
new file mode 100644
index 00000000000..f161e6712fd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/setmediakeys.js
@@ -0,0 +1,49 @@
+function runTest(config, qualifier) {
+ var testname = testnamePrefix( qualifier, config.keysystem )
+ + ', setMediaKeys';
+
+ var configuration = getSimpleConfigurationForContent( config.content );
+
+ if ( config.initDataType && config.initData ) {
+ configuration.initDataTypes = [ config.initDataType ];
+ }
+
+ async_test (function (test) {
+ var _video = config.video,
+ _mediaKeys;
+
+ // Test MediaKeys assignment.
+ assert_equals(_video.mediaKeys, null);
+ assert_equals(typeof _video.setMediaKeys, 'function');
+
+ function onFailure(error) {
+ forceTestFailureFromPromise(test, error);
+ }
+
+ // Try setting mediaKeys to null.
+ _video.setMediaKeys(null).then(function(result) {
+ assert_equals(_video.mediaKeys, null);
+
+ // setMediaKeys should fail when setting to the wrong type of object - Date.
+ return _video.setMediaKeys(new Date());
+ }).then(function (result) {
+ assert_unreached('setMediaKeys should fail when setting to wrong kind of object (Date)');
+ }, function(error) {
+ // The error should be TypeError.
+ assert_equals(error.name, 'TypeError', 'setMediaKeys should return a TypeError when setting to wrong kind of object (Date)');
+ return navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]);
+ }).then(function(access) {
+ assert_equals(access.keySystem, config.keysystem)
+ return access.createMediaKeys();
+ }).then(function(result) {
+ _mediaKeys = result;
+ assert_not_equals(_mediaKeys, null);
+ assert_equals(typeof _mediaKeys.createSession, 'function');
+ return _video.setMediaKeys(_mediaKeys);
+ }).then(function(result) {
+ assert_not_equals(_video.mediaKeys, null);
+ assert_equals(_video.mediaKeys, _mediaKeys);
+ test.done();
+ }).catch(onFailure);
+ }, testname);
+}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/syntax-mediakeys.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/syntax-mediakeys.js
new file mode 100644
index 00000000000..4ec6551e8fd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/syntax-mediakeys.js
@@ -0,0 +1,184 @@
+function runTest(config) {
+ var keysystem = config.keysystem;
+ var testname = testnamePrefix(null, config.keysystem);
+ var initDataType = config.initDataType;
+ var configuration = {
+ initDataTypes: [config.initDataType],
+ audioCapabilities: [{contentType: config.audioType}],
+ videoCapabilities: [{contentType: config.videoType}],
+ sessionTypes: ['temporary']
+ };
+
+ function createMediaKeysAttributeTest() {
+ return new Promise(function (resolve, reject) {
+ var access;
+ isInitDataTypeSupported(keysystem, initDataType).then(function (isTypeSupported) {
+ assert_equals(typeof navigator.requestMediaKeySystemAccess, 'function');
+ assert_true(isTypeSupported, "initDataType should be supported");
+ return navigator.requestMediaKeySystemAccess(keysystem, [configuration]);
+ }).then(function (result) {
+ access = result;
+ assert_equals(access.keySystem, keysystem);
+ return access.createMediaKeys();
+ }).then(function (mediaKeys) {
+ assert_not_equals(mediaKeys, null);
+ assert_equals(typeof mediaKeys, 'object');
+ assert_equals(typeof mediaKeys.createSession, 'function');
+ assert_equals(typeof mediaKeys.setServerCertificate, 'function');
+
+ // Test creation of a second MediaKeys.
+ // The extra parameter is ignored.
+ return access.createMediaKeys('extra');
+ }).then(function (mediaKeys) {
+ assert_not_equals(mediaKeys, null);
+ assert_equals(typeof mediaKeys, 'object');
+ assert_equals(typeof mediaKeys.createSession, 'function');
+ assert_equals(typeof mediaKeys.setServerCertificate, 'function');
+ resolve();
+ }).catch(function (error) {
+ reject(error);
+ });
+ })
+ }
+
+ promise_test(function() {
+ return createMediaKeysAttributeTest();
+ }, testname + ' test MediaKeys attribute syntax');
+
+ var kSetServerCertificateExceptionsTestCases = [
+ // Too few parameters.
+ {
+ exception: 'TypeError',
+ func: function (mk) {
+ return mk.setServerCertificate();
+ }
+ },
+ // Invalid parameters.
+ {
+ exception: 'TypeError',
+ func: function (mk) {
+ return mk.setServerCertificate('');
+ }
+ },
+ {
+ exception: 'TypeError',
+ func: function (mk) {
+ return mk.setServerCertificate(null);
+ }
+ },
+ {
+ exception: 'TypeError',
+ func: function (mk) {
+ return mk.setServerCertificate(undefined);
+ }
+ },
+ {
+ exception: 'TypeError',
+ func: function (mk) {
+ return mk.setServerCertificate(1);
+ }
+ },
+ // Empty array.
+ {
+ exception: 'TypeError',
+ func: function (mk) {
+ return mk.setServerCertificate(new Uint8Array(0));
+ }
+ }
+ ];
+
+
+ function setServerCertificateTestExceptions() {
+ return new Promise(function(resolve, reject) {
+ isInitDataTypeSupported(keysystem, initDataType).then(function (isTypeSupported) {
+ assert_equals(typeof navigator.requestMediaKeySystemAccess, 'function');
+ assert_true(isTypeSupported, "initDataType not supported");
+ return navigator.requestMediaKeySystemAccess(keysystem, [configuration]);
+ }).then(function (access) {
+ return access.createMediaKeys();
+ }).then(function (mediaKeys) {
+ var promises = kSetServerCertificateExceptionsTestCases.map(function (testCase) {
+ return test_exception(testCase, mediaKeys);
+ });
+ assert_not_equals(promises.length, 0);
+ return Promise.all(promises);
+ }).then(function () {
+ resolve();
+ }).catch(function (error) {
+ reject(error);
+ });
+ })
+ }
+ promise_test(function() {
+ return setServerCertificateTestExceptions();
+ }, testname + ' test MediaKeys setServerCertificate() exceptions.');
+
+ // All calls to |func| in this group resolve. setServerCertificate with these cert may either resolve with true
+ // for clearkey or throw a DOMException.
+ var kSetServerCertificateTestCases = [
+ {
+ // Pass in ArrayBufferView
+ func: function (mk) {
+ var cert = new Uint8Array(200);
+ assert_true(ArrayBuffer.isView(cert));
+
+ return new Promise(function (resolve, reject) {
+ mk.setServerCertificate(cert).then(function (value) {
+ resolve(value);
+ }).catch(function (error) {
+ if (Object.prototype.toString.call(error) === "[object DOMException]") {
+ resolve(false);
+ }
+ });
+ })
+ },
+ expected: false
+ },
+ {
+ // Pass in ArrayBuffer.
+ func: function (mk) {
+ var cert = new ArrayBuffer(200);
+ assert_false(ArrayBuffer.isView(cert));
+ return new Promise(function (resolve) {
+ mk.setServerCertificate(cert).then(function (resolveValue) {
+ resolve(resolveValue);
+ }).catch(function (error) {
+ if (Object.prototype.toString.call(error) === "[object DOMException]") {
+ resolve(false);
+ }
+ });
+ })
+ },
+ expected: false
+ }
+ ];
+ function setServerCertificateTest(){
+ return new Promise(function(resolve, reject){
+ var expected_result;
+ isInitDataTypeSupported(keysystem, initDataType).then(function (isTypeSupported) {
+ assert_equals(typeof navigator.requestMediaKeySystemAccess, 'function');
+ assert_true(isTypeSupported, "initDataType not supported");
+ return navigator.requestMediaKeySystemAccess(keysystem, [configuration]);
+ }).then(function (access) {
+ return access.createMediaKeys();
+ }).then(function (mediaKeys) {
+ var promises = kSetServerCertificateTestCases.map(function (testCase) {
+ return testCase.func.call(null, mediaKeys);
+ });
+ expected_result = kSetServerCertificateTestCases.map(function (testCase) {
+ return testCase.expected;
+ });
+ assert_not_equals(promises.length, 0);
+ return Promise.all(promises);
+ }).then(function (result) {
+ assert_array_equals(result, expected_result);
+ resolve();
+ }).catch(function (error) {
+ reject(error);
+ });
+ })
+ }
+ promise_test(function() {
+ return setServerCertificateTest();
+ }, testname + ' test MediaKeys setServerCertificate() syntax with non-empty certificate.');
+}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/syntax-mediakeysession.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/syntax-mediakeysession.js
new file mode 100644
index 00000000000..3663a7b930d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/syntax-mediakeysession.js
@@ -0,0 +1,445 @@
+function runTest(config) {
+ var keysystem = config.keysystem;
+ var testname = testnamePrefix(null, config.keysystem);
+ var initDataType = config.initDataType;
+ var initData = config.initData;
+ var configuration = {
+ initDataTypes: [config.initDataType],
+ audioCapabilities: [{contentType: config.audioType}],
+ videoCapabilities: [{contentType: config.videoType}],
+ sessionTypes: ['temporary']
+ };
+
+ var kTypeSpecificGenerateRequestExceptionsTestCases = [
+ // Tests in this set use a shortened parameter name due to
+ // format_value() only returning the first 60 characters as the
+ // result. With a longer name the first 60 characters is not
+ // enough to determine which test failed. Even with the
+ // shortened name, the error message for the last couple of
+ // tests is the same.
+
+ // Too few parameters.
+ {
+ exception: 'TypeError',
+ func: function (mk1, type) {
+ return mk1.createSession().generateRequest(type);
+ }
+ },
+ // Invalid parameters.
+ {
+ exception: 'TypeError',
+ func: function (mk2, type) {
+ return mk2.createSession().generateRequest(type, '');
+ }
+ },
+ {
+ exception: 'TypeError',
+ func: function (mk3, type) {
+ return mk3.createSession().generateRequest(type, null);
+ }
+ },
+ {
+ exception: 'TypeError',
+ func: function (mk4, type) {
+ return mk4.createSession().generateRequest(type, undefined);
+ }
+ },
+ {
+ exception: 'TypeError',
+ func: function (mk5, type) {
+ return mk5.createSession().generateRequest(type, 1);
+ }
+ },
+ // (new Uint8Array(0)) returns empty array. So 'TypeError' should
+ // be returned.
+ {
+ exception: 'TypeError',
+ func: function (mk6, type) {
+ return mk6.createSession().generateRequest(type, new Uint8Array(0));
+ }
+ }
+ ];
+ function generateRequestTestExceptions(){
+ return new Promise(function(resolve, reject){
+ isInitDataTypeSupported(keysystem, initDataType).then(function (isTypeSupported) {
+ assert_true(isTypeSupported, "initDataType not supported");
+ return navigator.requestMediaKeySystemAccess(keysystem, [configuration]);
+ }).then(function (access) {
+ return access.createMediaKeys();
+ }).then(function (mediaKeys) {
+ var mp4SessionPromises = kTypeSpecificGenerateRequestExceptionsTestCases.map(function (testCase) {
+ return test_exception(testCase, mediaKeys, initDataType, initData);
+ });
+ assert_not_equals(mp4SessionPromises.length, 0);
+ return Promise.all(mp4SessionPromises);
+ }).then(function (result) {
+ resolve();
+ }).catch(function (error) {
+ reject(error);
+ });
+ })
+ }
+ promise_test(function() {
+ return generateRequestTestExceptions();
+ }, testname + ' test MediaKeySession generateRequest() exceptions.');
+
+ var kLoadExceptionsTestCases = [
+ // Too few parameters.
+ {
+ exception: 'TypeError',
+ func: function (mk1) {
+ return mk1.createSession('temporary').load();
+ }
+ },
+ {
+ exception: 'TypeError',
+ func: function (mk3) {
+ return mk3.createSession('temporary').load('');
+ }
+ },
+ {
+ exception: 'TypeError',
+ func: function (mk4) {
+ return mk4.createSession('temporary').load(1);
+ }
+ },
+ {
+ exception: 'TypeError',
+ func: function (mk5) {
+ return mk5.createSession('temporary').load('!@#$%^&*()');
+ }
+ },
+ {
+ exception: 'TypeError',
+ func: function (mk6) {
+ return mk6.createSession('temporary').load('1234');
+ }
+ }
+ ];
+ function loadTestExceptions(){
+ return new Promise(function(resolve, reject){
+ isInitDataTypeSupported(keysystem, initDataType).then(function (isTypeSupported) {
+ assert_true(isTypeSupported, "initDataType not supported");
+ return navigator.requestMediaKeySystemAccess(keysystem, [configuration]);
+ }).then(function (access) {
+ return access.createMediaKeys();
+ }).then(function (mediaKeys) {
+ var sessionPromises = kLoadExceptionsTestCases.map(function (testCase) {
+ return test_exception(testCase, mediaKeys);
+ });
+ assert_not_equals(sessionPromises.length, 0);
+ return Promise.all(sessionPromises);
+ }).then(function () {
+ resolve();
+ }).catch(function (error) {
+ reject(error);
+ });
+ })
+ }
+ promise_test(function() {
+ return loadTestExceptions();
+ }, testname + ' test MediaKeySession load() exceptions.');
+
+ // All calls to |func| in this group are supposed to succeed.
+ // However, the spec notes that some things are optional for
+ // Clear Key. In particular, support for persistent sessions
+ // is optional. Since some implementations won't support some
+ // features, a NotSupportedError is treated as a success
+ // if |isNotSupportedAllowed| is true.
+ var kCreateSessionTestCases = [
+ // Use the default sessionType.
+ {
+ func: function(mk) { return mk.createSession(); },
+ isNotSupportedAllowed: false
+ },
+ // Try variations of sessionType.
+ {
+ func: function(mk) { return mk.createSession('temporary'); },
+ isNotSupportedAllowed: false
+ },
+ {
+ func: function(mk) { return mk.createSession(undefined); },
+ isNotSupportedAllowed: false
+ },
+ {
+ // Since this is optional, some Clear Key implementations
+ // will succeed, others will return a "NotSupportedError".
+ // Both are allowed results.
+ func: function(mk) { return mk.createSession('persistent-license'); },
+ isNotSupportedAllowed: true
+ },
+ // Try additional parameter, which should be ignored.
+ {
+ func: function(mk) { return mk.createSession('temporary', 'extra'); },
+ isNotSupportedAllowed: false
+ }
+ ];
+ // This function checks that calling generateRequest() works for
+ // various sessions. |testCase.func| creates a MediaKeySession
+ // object, and then generateRequest() is called on that object. It
+ // allows for an NotSupportedError to be generated and treated as a
+ // success, if allowed. See comment above kCreateSessionTestCases.
+ function test_generateRequest(testCase, mediaKeys, type, initData) {
+ var mediaKeySession;
+ try {
+ mediaKeySession = testCase.func.call(null, mediaKeys);
+ } catch (e) {
+ assert_true(testCase.isNotSupportedAllowed);
+ assert_equals(e.name, 'NotSupportedError');
+ return Promise.resolve('not supported');
+ }
+ return mediaKeySession.generateRequest(type, initData);
+ }
+ function generateRequestForVariousSessions(){
+ return new Promise(function(resolve, reject){
+ isInitDataTypeSupported(keysystem, initDataType).then(function (isTypeSupported) {
+ assert_true(isTypeSupported, "initDataType should be supported");
+ return navigator.requestMediaKeySystemAccess(keysystem, [configuration]);
+ }).then(function (access) {
+ return access.createMediaKeys();
+ }).then(function (mediaKeys) {
+ var mp4SessionPromises = kCreateSessionTestCases.map(function (testCase) {
+ return test_generateRequest(testCase, mediaKeys, initDataType, initData);
+ });
+ assert_not_equals(mp4SessionPromises.length, 0);
+ return Promise.all(mp4SessionPromises);
+ }).then(function () {
+ resolve();
+ }).catch(function (error) {
+ reject(error);
+ });
+ })
+ }
+ promise_test(function() {
+ return generateRequestForVariousSessions();
+ }, testname + ' test if MediaKeySession generateRequest() resolves for various sessions');
+
+ var kUpdateSessionExceptionsTestCases = [
+ // Tests in this set use a shortened parameter name due to
+ // format_value() only returning the first 60 characters as the
+ // result. With a longer name (mediaKeySession) the first 60
+ // characters is not enough to determine which test failed.
+
+ // Too few parameters.
+ {
+ exception: 'TypeError',
+ func: function (s) {
+ return s.update();
+ }
+ },
+ // Invalid parameters.
+ {
+ exception: 'TypeError',
+ func: function (s) {
+ return s.update('');
+ }
+ },
+ {
+ exception: 'TypeError',
+ func: function (s) {
+ return s.update(null);
+ }
+ },
+ {
+ exception: 'TypeError',
+ func: function (s) {
+ return s.update(undefined);
+ }
+ },
+ {
+ exception: 'TypeError',
+ func: function (s) {
+ return s.update(1);
+ }
+ },
+ // (new Uint8Array(0)) returns empty array. So 'TypeError' should
+ // be returned.
+ {
+ exception: 'TypeError',
+ func: function (s) {
+ return s.update(new Uint8Array(0));
+ }
+ }
+ ];
+
+ function updateTestExceptions(){
+ return new Promise(function(resolve, reject){
+ isInitDataTypeSupported(keysystem, initDataType).then(function (isTypeSupported) {
+ assert_true(isTypeSupported, "initDataType not supported");
+ return navigator.requestMediaKeySystemAccess(keysystem, [configuration]);
+ }).then(function (access) {
+ return access.createMediaKeys();
+ }).then(function (mediaKeys) {
+ var mp4SessionPromises = kUpdateSessionExceptionsTestCases.map(function (testCase) {
+ var mediaKeySession = mediaKeys.createSession();
+ return mediaKeySession.generateRequest(initDataType, initData).then(function (result) {
+ return test_exception(testCase, mediaKeySession);
+ });
+ });
+ assert_not_equals(mp4SessionPromises.length, 0);
+ return Promise.all(mp4SessionPromises);
+ }).then(function () {
+ resolve();
+ }).catch(function (error) {
+ reject(error);
+ });
+ })
+ }
+ promise_test(function() {
+ return updateTestExceptions();
+ }, testname + ' test MediaKeySession update() exceptions.');
+
+ function create_close_exception_test(mediaKeys) {
+ var mediaKeySession = mediaKeys.createSession();
+ return mediaKeySession.close().then(function (result) {
+ assert_unreached('close() should not succeed if session uninitialized');
+ }).catch(function (error) {
+ assert_equals(error.name, 'InvalidStateError');
+ // Return something so the promise resolves.
+ return Promise.resolve();
+ });
+ }
+ function closeTestExceptions(){
+ return new Promise(function(resolve, reject){
+ isInitDataTypeSupported(keysystem, initDataType).then(function (isTypeSupported) {
+ assert_true(isTypeSupported, "initDataType not supported");
+ return navigator.requestMediaKeySystemAccess(keysystem, [configuration]);
+ }).then(function (access) {
+ return access.createMediaKeys();
+ }).then(function (mediaKeys) {
+ return create_close_exception_test(mediaKeys);
+ }).then(function () {
+ resolve();
+ }).catch(function (error) {
+ reject(error);
+ });
+ });
+ }
+ promise_test(function() {
+ return closeTestExceptions();
+ }, testname + ' test MediaKeySession close() exceptions.');
+
+ function create_remove_exception_test(mediaKeys, type, initData) {
+ // remove() on an uninitialized session should fail.
+ var mediaKeySession = mediaKeys.createSession('temporary');
+ return mediaKeySession.remove().then(function (result) {
+ assert_unreached('remove() should not succeed if session uninitialized');
+ }, function (error) {
+ assert_equals(error.name, 'InvalidStateError');
+ });
+ }
+ function removeTestException(){
+ return new Promise(function(resolve, reject){
+ isInitDataTypeSupported(keysystem, initDataType).then(function (isTypeSupported) {
+ assert_true(isTypeSupported, "initDataType not supported");
+ return navigator.requestMediaKeySystemAccess(keysystem, [configuration]);
+ }).then(function (access) {
+ return access.createMediaKeys();
+ }).then(function (mediaKeys) {
+ return create_remove_exception_test(mediaKeys, initDataType, initData);
+ }).then(function () {
+ resolve();
+ }).catch(function (error) {
+ reject(error);
+ });
+ });
+ }
+ promise_test(function() {
+ return removeTestException();
+ }, testname + ' test MediaKeySession remove() exceptions.');
+
+ // All calls to |func| in this group are supposed to succeed.
+ // However, the spec notes that some things are optional for
+ // Clear Key. In particular, support for persistent sessions
+ // is optional. Since some implementations won't support some
+ // features, a NotSupportedError is treated as a success
+ // if |isNotSupportedAllowed| is true.
+ var kCreateSessionTestCases = [
+ // Use the default sessionType.
+ {
+ func: function (mk) {
+ return mk.createSession();
+ },
+ isNotSupportedAllowed: false
+ },
+ // Try variations of sessionType.
+ {
+ func: function (mk) {
+ return mk.createSession('temporary');
+ },
+ isNotSupportedAllowed: false
+ },
+ {
+ func: function (mk) {
+ return mk.createSession(undefined);
+ },
+ isNotSupportedAllowed: false
+ },
+ {
+ // Since this is optional, some Clear Key implementations
+ // will succeed, others will return a "NotSupportedError".
+ // Both are allowed results.
+ func: function (mk) {
+ return mk.createSession('persistent-license');
+ },
+ isNotSupportedAllowed: true
+ },
+ // Try additional parameter, which should be ignored.
+ {
+ func: function (mk) {
+ return mk.createSession('temporary', 'extra');
+ },
+ isNotSupportedAllowed: false
+ }
+ ];
+
+ // This function checks that calling |testCase.func| creates a
+ // MediaKeySession object with some default values. It also
+ // allows for an NotSupportedError to be generated and treated as a
+ // success, if allowed. See comment above kCreateSessionTestCases.
+ function test_createSession(testCase, mediaKeys) {
+ var mediaKeySession;
+ try {
+ mediaKeySession = testCase.func.call(null, mediaKeys);
+ } catch (e) {
+ assert_true(testCase.isNotSupportedAllowed);
+ return;
+ }
+ assert_equals(typeof mediaKeySession, 'object');
+ assert_equals(typeof mediaKeySession.addEventListener, 'function');
+ assert_equals(typeof mediaKeySession.sessionId, 'string');
+ assert_equals(typeof mediaKeySession.expiration, 'number');
+ assert_equals(typeof mediaKeySession.closed, 'object');
+ assert_equals(typeof mediaKeySession.keyStatuses, 'object');
+ assert_equals(typeof mediaKeySession.onkeystatuseschange, 'object');
+ assert_equals(typeof mediaKeySession.onmessage, 'object');
+ assert_equals(typeof mediaKeySession.generateRequest, 'function');
+ assert_equals(typeof mediaKeySession.load, 'function');
+ assert_equals(typeof mediaKeySession.update, 'function');
+ assert_equals(typeof mediaKeySession.close, 'function');
+ assert_equals(typeof mediaKeySession.remove, 'function');
+ assert_equals(mediaKeySession.sessionId, '');
+ }
+ function createSessionTest(){
+ return new Promise(function(resolve, reject){
+ isInitDataTypeSupported(keysystem, initDataType).then(function (isTypeSupported) {
+ assert_true(isTypeSupported, "initDataType not supported");
+ return navigator.requestMediaKeySystemAccess(keysystem, [configuration]);
+ }).then(function (access) {
+ return access.createMediaKeys();
+ }).then(function (mediaKeys) {
+ kCreateSessionTestCases.map(function (testCase) {
+ test_createSession(testCase, mediaKeys);
+ });
+ resolve();
+ }).catch(function (error) {
+ reject(error);
+ });
+ })
+ }
+ promise_test(function() {
+ return createSessionTest();
+ }, testname + ' test MediaKeySession attribute syntax.');
+
+
+}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/syntax-mediakeysystemaccess.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/syntax-mediakeysystemaccess.js
new file mode 100644
index 00000000000..bbc7b6700bc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/syntax-mediakeysystemaccess.js
@@ -0,0 +1,147 @@
+function runTest(config) {
+ var keysystem = config.keysystem;
+ var testname = testnamePrefix(null, config.keysystem);
+ var initDataType = config.initDataType;
+ var configuration = {
+ initDataTypes: [config.initDataType],
+ audioCapabilities: [{contentType: config.audioType}],
+ videoCapabilities: [{contentType: config.videoType}],
+ sessionTypes: ['temporary']
+ };
+
+ var kRequestMediaKeySystemAccessExceptionsTestCases = [
+ // Too few parameters.
+ {
+ exception: 'TypeError',
+ func: function () {
+ return navigator.requestMediaKeySystemAccess();
+ }
+ },
+ {
+ exception: 'TypeError',
+ func: function () {
+ return navigator.requestMediaKeySystemAccess(keysystem);
+ }
+ },
+ // Invalid key systems. Note that JavaScript converts all these
+ // values into strings by calling toString(), so they fail due
+ // to the key system not being supported, not due to the type.
+ {
+ exception: 'NotSupportedError',
+ func: function () {
+ return navigator.requestMediaKeySystemAccess(null, [{}]);
+ }
+ },
+ {
+ exception: 'NotSupportedError',
+ func: function () {
+ return navigator.requestMediaKeySystemAccess(undefined, [{}]);
+ }
+ },
+ {
+ exception: 'NotSupportedError',
+ func: function () {
+ return navigator.requestMediaKeySystemAccess(1, [{}]);
+ }
+ },
+ {
+ exception: 'NotSupportedError',
+ func: function () {
+ return navigator.requestMediaKeySystemAccess('unsupported', [{}]);
+ }
+ },
+ // Empty keysystem string should be rejected with TypeError.
+ {
+ exception: 'TypeError',
+ func: function () {
+ return navigator.requestMediaKeySystemAccess('', [{}]);
+ }
+ },
+ // (new Uint8Array(0)).toString() should return ''. So this case should be the same
+ // as the above.
+ {
+ exception: 'TypeError',
+ func: function () {
+ return navigator.requestMediaKeySystemAccess(new Uint8Array(0), [{}]);
+ }
+ },
+ // Non-ASCII names.
+ {
+ exception: 'NotSupportedError',
+ func: function () {
+ return navigator.requestMediaKeySystemAccess(keysystem + '\u263A', [{}]);
+ }
+ },
+ // Empty sequence of MediaKeySystemConfiguration.
+ {
+ exception: 'TypeError',
+ func: function () {
+ return navigator.requestMediaKeySystemAccess(keysystem, []);
+ }
+ },
+ // Things that don't convert to valid sequences of MediaKeySystemConfigurations.
+ {
+ exception: 'TypeError',
+ func: function () {
+ return navigator.requestMediaKeySystemAccess(keysystem, {});
+ }
+ },
+ {
+ exception: 'TypeError',
+ func: function () {
+ return navigator.requestMediaKeySystemAccess(keysystem, "invalid");
+ }
+ },
+ {
+ exception: 'TypeError',
+ func: function () {
+ return navigator.requestMediaKeySystemAccess(keysystem, [{}, 6]);
+ }
+ },
+ {
+ exception: 'TypeError',
+ func: function () {
+ return navigator.requestMediaKeySystemAccess(keysystem, ["invalid", "upsupported"]);
+ }
+ }
+ ];
+
+ function requestMediaKeySystemAccessTestExceptions(){
+ return new Promise(function(resolve, reject){
+ var createPromises = kRequestMediaKeySystemAccessExceptionsTestCases.map(function (testCase) {
+ return test_exception(testCase);
+ });
+ Promise.all(createPromises).then(function (result) {
+ resolve();
+ }).catch(function (error) {
+ reject(error);
+ });
+ })
+ }
+ promise_test(function() {
+ return requestMediaKeySystemAccessTestExceptions();
+ }, testname + ' test requestMediaKeySystemAccess() exceptions.');
+
+ function requestMediaKeySystemAccessTestAttributes(){
+ return new Promise(function(resolve, reject){
+ isInitDataTypeSupported(keysystem, initDataType).then(function (isTypeSupported) {
+ assert_equals(typeof navigator.requestMediaKeySystemAccess, 'function');
+ assert_true(isTypeSupported, "initDataType not supported");
+ return navigator.requestMediaKeySystemAccess(keysystem, [configuration]);
+ }).then(function (access) {
+ assert_not_equals(access, null);
+ assert_equals(typeof access, 'object');
+ assert_equals(access.keySystem, keysystem);
+ assert_equals(typeof access.getConfiguration, 'function');
+ assert_equals(typeof access.createMediaKeys, 'function');
+ resolve();
+ }).catch(function(error){
+ reject(error);
+ })
+ })
+ }
+ promise_test(function() {
+ return requestMediaKeySystemAccessTestAttributes();
+ }, testname + ' test MediaKeySystemAccess attribute syntax.');
+
+}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/temporary-license-type.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/temporary-license-type.js
new file mode 100644
index 00000000000..cb0b0e67fef
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/temporary-license-type.js
@@ -0,0 +1,61 @@
+function runTest(config,qualifier) {
+
+ var testname = testnamePrefix(qualifier, config.keysystem) + ', cannot load persistent license into temporary session';
+
+ var configuration = getSimpleConfigurationForContent(config.content);
+
+ if (config.initDataType && config.initData) {
+ configuration.initDataTypes = [config.initDataType];
+ }
+
+ async_test(function(test)
+ {
+ var initDataType;
+ var initData;
+ var mediaKeySession;
+
+ function onFailure(error) {
+ forceTestFailureFromPromise(test, error);
+ }
+
+ function processMessage(event)
+ {
+ assert_true(event instanceof window.MediaKeyMessageEvent);
+ assert_equals(event.target, mediaKeySession);
+ assert_equals(event.type, 'message');
+ assert_in_array(event.messageType, ['license-request', 'individualization-request']);
+
+ config.messagehandler(event.messageType, event.message).then( function(response) {
+ mediaKeySession.update(response).then( test.step_func( function() {
+ if ( event.messageType !== 'license-request' ) {
+ return;
+ }
+ assert_unreached( "Update with incorrect license type should fail" )
+ } ) ).catch( test.step_func( function( error ) {
+ if ( event.messageType !== 'license-request' ) {
+ forceTestFailureFromPromise(test, error);
+ return;
+ }
+
+ assert_equals(error.name, 'TypeError' );
+ test.done();
+ } ) );
+ }).catch(onFailure);
+ }
+
+ navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
+ initDataType = access.getConfiguration().initDataTypes[0];
+ if (config.initDataType && config.initData) {
+ initData = config.initData;
+ } else {
+ initData = getInitData(config.content, initDataType);
+ }
+ return access.createMediaKeys();
+ }).then(test.step_func(function(mediaKeys) {
+ mediaKeySession = mediaKeys.createSession('temporary');
+ waitForEventAndRunStep('message', mediaKeySession, test.step_func(processMessage), test);
+ return mediaKeySession.generateRequest(initDataType, initData);
+ })).catch(onFailure);
+ }, testname );
+
+}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/unique-origin.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/unique-origin.js
new file mode 100644
index 00000000000..ff1122db4de
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/unique-origin.js
@@ -0,0 +1,64 @@
+function runTest(config) {
+ // When the sandbox attribute is present on an iframe, it will
+ // treat the content as being from a unique origin. So try to
+ // call createMediaKeys() inside an iframe and it should fail.
+
+ function load_iframe(src, sandbox) {
+ return new Promise(function (resolve) {
+ var iframe = document.createElement('iframe');
+ iframe.onload = function () {
+ resolve(iframe);
+ };
+ iframe.sandbox = sandbox;
+ iframe.src = src;
+ document.documentElement.appendChild(iframe);
+ });
+ }
+
+ function wait_for_message() {
+ return new Promise(function (resolve) {
+ self.addEventListener('message', function listener(e) {
+ resolve(e.data);
+ self.removeEventListener('message', listener);
+ });
+ });
+ }
+
+ promise_test(function (test) {
+ var script = 'data:text/html,' +
+ '<script>' +
+ ' window.onmessage = function(e) {' +
+ ' navigator.requestMediaKeySystemAccess("' + config.keysystem + '", [{' +
+ ' initDataTypes: [\"' + config.initDataType + '\"],' +
+ ' audioCapabilities: [' +
+ ' { contentType:\'' + config.audioType + '\'},' +
+ ' ]' +
+ ' }]).then(function(access) {' +
+ ' return access.createMediaKeys();' +
+ ' }).then(function(mediaKeys) {' +
+ ' window.parent.postMessage({result: \'allowed\'}, \'*\');' +
+ ' }, function(error) {' +
+ ' window.parent.postMessage({result: \'failed\'}, \'*\');' +
+ ' });' +
+ ' };' +
+ '<\/script>';
+
+ // Verify that this page can create a MediaKeys first.
+ return navigator.requestMediaKeySystemAccess(config.keysystem, [{
+ initDataTypes: [config.initDataType],
+ audioCapabilities: [
+ {contentType: config.audioType},
+ ]
+ }]).then(function (access) {
+ return access.createMediaKeys();
+ }).then(function (mediaKeys) {
+ // Success, so now create the iframe and try there.
+ return load_iframe(script, 'allow-scripts');
+ }).then(function (iframe) {
+ iframe.contentWindow.postMessage({}, '*');
+ return wait_for_message();
+ }).then(function (message) {
+ assert_equals(message.result, 'failed');
+ });
+ }, 'Unique origin is unable to create MediaKeys');
+}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/update-disallowed-input.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/update-disallowed-input.js
new file mode 100644
index 00000000000..b5adaf7f125
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/update-disallowed-input.js
@@ -0,0 +1,45 @@
+function runTest(config)
+{
+ // This test passes |response| to update() as a JSON Web Key Set.
+ // CDMs other than Clear Key won't expect |response| in this format.
+ promise_test(function(test) {
+ var initDataType;
+ var initData;
+ var keySystem = config.keysystem;
+ var mediaKeySession;
+
+ function createReallyLongJWKSet()
+ {
+ // This is just a standard JWKSet with a lot of
+ // extra items added to the end. Key ID and key
+ // doesn't really matter.
+ var jwkSet = '{"keys":[{'
+ + '"kty":"oct",'
+ + '"k":"MDEyMzQ1Njc4OTAxMjM0NQ",'
+ + '"kid":"MDEyMzQ1Njc4OTAxMjM0NQ"'
+ + '}]';
+ return jwkSet + ',"test":"unknown"'.repeat(4000) + '}';
+ }
+
+ return navigator.requestMediaKeySystemAccess(keySystem, getSimpleConfiguration()).then(function(access) {
+ initDataType = access.getConfiguration().initDataTypes[0];
+ initData = getInitData(initDataType);
+ return access.createMediaKeys();
+ }).then(function(mediaKeys) {
+ mediaKeySession = mediaKeys.createSession();
+ var eventWatcher = new EventWatcher(test, mediaKeySession, ['message']);
+ var promise = eventWatcher.wait_for('message');
+ mediaKeySession.generateRequest(initDataType, initData);
+ return promise;
+ }).then(function () {
+ var jwkSet = createReallyLongJWKSet();
+ assert_greater_than(jwkSet.length, 65536);
+ var jwkSetArray = stringToUint8Array(jwkSet);
+ return mediaKeySession.update(jwkSetArray);
+ }).then(function () {
+ assert_unreached('update() with a response longer than 64Kb succeed');
+ }).catch(function (error) {
+ assert_equals(error.name, 'TypeError');
+ });
+ }, 'update() with invalid response (longer than 64Kb characters) should fail.');
+}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/scripts/waiting-for-a-key.js b/tests/wpt/web-platform-tests/encrypted-media/scripts/waiting-for-a-key.js
new file mode 100644
index 00000000000..fee70e24ae0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/scripts/waiting-for-a-key.js
@@ -0,0 +1,166 @@
+function runTest(config)
+{
+ // For debugging timeouts, keep track of the number of the
+ // various events received.
+ var debugEncryptedEventFired = false;
+ var debugWaitingForKeyEventFired = false;
+ var debugTimeUpdateEventCount = 0;
+ var debugMessage = '';
+
+ // Set global option explicit_timeout to true and control
+ // the timeout in the promise test below.
+ setup({
+ explicit_timeout: true
+ });
+
+ promise_test(function (test) {
+ var video = config.video;
+ var keysystem = config.keysystem;
+ var configuration = {
+ initDataTypes: [config.initDataType],
+ audioCapabilities: [{
+ contentType: config.audioType
+ }],
+ videoCapabilities: [{
+ contentType: config.videoType
+ }],
+ sessionTypes: ['temporary']
+ };
+ var initData;
+ var initDataType;
+ var mediaKeySession;
+ // As this code doesn't wait for the 'message' event for clearkey to avoid
+ // race conditions with 'waitingforkey', specify the key ID and
+ // key used by the encrypted content.
+ var keyId = new Uint8Array(config.content.keys[0].kid);
+ var rawKey = new Uint8Array(config.content.keys[0].key);
+ // Use the message handler for non clearkey drm
+ var handler = config.messageHandler || null;
+
+ // Override timeout() to use custom message instead of default
+ // message "Test timed out"
+ test.timeout = function () {
+ var message = 'timeout. message = ' + debugMessage
+ + ', encrypted: ' + debugEncryptedEventFired
+ + ', waitingforkey: ' + debugWaitingForKeyEventFired
+ + ', timeupdate count: ' + debugTimeUpdateEventCount;
+
+ this.timeout_id = null;
+ this.set_status(this.TIMEOUT, message);
+ this.phase = this.phases.HAS_RESULT;
+ this.done();
+ };
+
+ return navigator.requestMediaKeySystemAccess(keysystem, [configuration]).then(function (access) {
+ debugMessage = 'createMediaKeys()';
+ return access.createMediaKeys();
+ }).then(function (mediaKeys) {
+ debugMessage = 'setMediaKeys()';
+ return video.setMediaKeys(mediaKeys);
+ }).then(function () {
+ return testmediasource(config);
+ }).then(function (source) {
+ debugMessage = 'wait_for_encrypted_event()';
+ mediaSource = source;
+ video.src = URL.createObjectURL(mediaSource);
+ video.play();
+ return wait_for_encrypted_event(video);
+ }).then(function (e) {
+ // Received the 'encrypted' event(s), so keep a copy of
+ // the initdata for use when creating the session later.
+ initDataType = config.initData ? config.initDataType : e.initDataType;
+ initData = config.initData || e.initData;
+ // Wait until the video indicates that it needs a key to
+ // continue.
+ debugMessage = 'wait_for_waitingforkey_event()';
+ return wait_for_waitingforkey_event(video);
+ }).then(function () {
+ // Make sure the video is NOT paused and not progressing
+ // before a key is provided. This requires the video
+ // to NOT have a clear lead.
+ assert_false(video.paused);
+ assert_less_than(video.currentTime, 0.2);
+ // Create a session.
+ mediaKeySession = video.mediaKeys.createSession('temporary');
+ debugMessage = 'generateRequest()';
+ return mediaKeySession.generateRequest(initDataType, initData);
+ }).then(function () {
+ // generateRequest() will cause a 'message' event to
+ // occur specifying the keyId that is needed
+ // Add the key needed to decrypt.
+ return wait_for_message_event(mediaKeySession, handler);
+ }).then(function () {
+ // Video should start playing now that it can decrypt the
+ // streams, so wait until a little bit of the video has
+ // played.
+ debugMessage = 'wait_for_timeupdate_event()';
+ return wait_for_timeupdate_event(video);
+ }).catch(function (error) {
+ assert_unreached('Error: ' + error.name);
+ });
+
+ // Typical test duration is 6 seconds on release builds
+ // (12 seconds on debug).
+ }, 'Waiting for a key.', {timeout: 20000});
+
+ // Wait for an 'encrypted' event
+ function wait_for_encrypted_event(video)
+ {
+ return new Promise(function (resolve) {
+ video.addEventListener('encrypted', function listener(e) {
+ assert_equals(e.target, video);
+ assert_true(e instanceof window.MediaEncryptedEvent);
+ assert_equals(e.type, 'encrypted');
+ debugEncryptedEventFired = true;
+ video.removeEventListener('encrypted', listener);
+ resolve(e);
+ });
+ });
+ };
+
+ // Wait for a 'waitingforkey' event. Promise resolved when the
+ // event is received.
+ function wait_for_waitingforkey_event(video)
+ {
+ return new Promise(function (resolve) {
+ video.addEventListener('waitingforkey', function listener(e) {
+ assert_equals(e.target, video);
+ assert_equals(e.type, 'waitingforkey');
+ debugWaitingForKeyEventFired = true;
+ video.removeEventListener('waitingforkey', listener);
+ resolve(e);
+ });
+ });
+ };
+
+ // Wait for a 'timeupdate' event. Promise resolved if |video| has
+ // played for more than 0.2 seconds.
+ function wait_for_timeupdate_event(video)
+ {
+ return new Promise(function (resolve) {
+ video.addEventListener('timeupdate', function listener(e) {
+ assert_equals(e.target, video);
+ ++debugTimeUpdateEventCount;
+ if (video.currentTime < 0.2)
+ return;
+ video.removeEventListener('timeupdate', listener);
+ resolve(e);
+ });
+ });
+ };
+
+ // We need to wait for the message even if for non clearkey DRMs.
+ function wait_for_message_event(mediaKeySession, handler)
+ {
+ return new Promise(function (resolve, reject) {
+ mediaKeySession.addEventListener('message', function listener(e) {
+ assert_equals(e.target, mediaKeySession);
+ assert_equals(e.type, 'message');
+ video.removeEventListener('message', listener);
+ return handler(e.messageType, e.message).then(function (response) {
+ return e.target.update(response)
+ }).then(resolve, reject);
+ });
+ });
+ }
+}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/util/clearkey-messagehandler.js b/tests/wpt/web-platform-tests/encrypted-media/util/clearkey-messagehandler.js
index d82d4daf959..c91a57f6d46 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/util/clearkey-messagehandler.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/util/clearkey-messagehandler.js
@@ -41,4 +41,24 @@ MessageHandler.prototype.messagehandler = function messagehandler( messageType,
}
throw new TypeError( 'Unsupported message type for ClearKey' );
+};
+
+MessageHandler.prototype.createJWKSet = function createJWKSet(keyId, key) {
+ var jwkSet = '{"keys":[';
+ for (var i = 0; i < arguments.length; i++) {
+ if (i != 0)
+ jwkSet += ',';
+ jwkSet += arguments[i];
+ }
+ jwkSet += ']}';
+ return jwkSet;
+};
+
+MessageHandler.prototype.createJWK = function createJWK(keyId, key) {
+ var jwk = '{"kty":"oct","alg":"A128KW","kid":"';
+ jwk += base64urlEncode(keyId);
+ jwk += '","k":"';
+ jwk += base64urlEncode(key);
+ jwk += '"}';
+ return jwk;
}; \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/encrypted-media/util/drm-messagehandler.js b/tests/wpt/web-platform-tests/encrypted-media/util/drm-messagehandler.js
index c56925c263e..28fb90f204e 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/util/drm-messagehandler.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/util/drm-messagehandler.js
@@ -1,3 +1,4 @@
+(function(){
// Expect utf8decoder and utf8decoder to be TextEncoder('utf-8') and TextDecoder('utf-8') respectively
//
// drmconfig format:
@@ -7,11 +8,14 @@
// "certificate" : <base64 encoded server certificate> } }
//
+drmtodaysecret = Uint8Array.from( [144, 34, 109, 76, 134, 7, 97, 107, 98, 251, 140, 28, 98, 79, 153, 222, 231, 245, 154, 226, 193, 1, 213, 207, 152, 204, 144, 15, 13, 2, 37, 236] );
+
drmconfig = {
"com.widevine.alpha": [ {
"serverURL": "https://lic.staging.drmtoday.com/license-proxy-widevine/cenc/",
"servertype" : "drmtoday",
"merchant" : "w3c-eme-test",
+ "secret" : drmtodaysecret
} ],
"com.microsoft.playready": [ {
"serverURL": "http://playready-testserver.azurewebsites.net/rightsmanager.asmx",
@@ -29,205 +33,230 @@ drmconfig = {
"serverURL": "https://lic.staging.drmtoday.com/license-proxy-headerauth/drmtoday/RightsManager.asmx",
"servertype" : "drmtoday",
"sessionTypes" : [ "temporary", "persistent-usage-record", "persistent-license" ],
- "merchant" : "w3c-eme-test"
+ "merchant" : "w3c-eme-test",
+ "secret" : drmtodaysecret
} ]
};
-function MessageHandler( keysystem, content, sessionType ) {
- sessionType = sessionType || "temporary";
- this._keysystem = keysystem;
- this._content = content;
- this._sessionType = sessionType;
- this._drmconfig = drmconfig[ this._keysystem ].filter( function( drmconfig ) {
- return drmconfig.sessionTypes === undefined || ( drmconfig.sessionTypes.indexOf( sessionType ) !== -1 );
- } )[ 0 ];
+var keySystemWrappers = {
+ // Key System wrappers map messages and pass to a handler, then map the response and return to caller
+ //
+ // function wrapper(handler, messageType, message, params)
+ //
+ // where:
+ // Promise<response> handler(messageType, message, responseType, headers, params);
+ //
- this.messagehandler = MessageHandler.prototype.messagehandler.bind( this );
- if ( this._drmconfig && this._drmconfig.certificate ) {
- this.servercertificate = stringToUint8Array( atob( this._drmconfig.certificate ) );
- }
-}
+ 'com.widevine.alpha': function(handler, messageType, message, params) {
+ return handler.call(this, messageType, new Uint8Array(message), 'json', null, params).then(function(response){
+ return base64DecodeToUnit8Array(response.license);
+ });
+ },
+
+ 'com.microsoft.playready': function(handler, messageType, message, params) {
+ var msg, xmlDoc;
+ var licenseRequest = null;
+ var headers = {};
+ var parser = new DOMParser();
+ var dataview = new Uint16Array(message);
+
+ msg = String.fromCharCode.apply(null, dataview);
+ xmlDoc = parser.parseFromString(msg, 'application/xml');
+
+ if (xmlDoc.getElementsByTagName('Challenge')[0]) {
+ var challenge = xmlDoc.getElementsByTagName('Challenge')[0].childNodes[0].nodeValue;
+ if (challenge) {
+ licenseRequest = atob(challenge);
+ }
+ }
+
+ var headerNameList = xmlDoc.getElementsByTagName('name');
+ var headerValueList = xmlDoc.getElementsByTagName('value');
+ for (var i = 0; i < headerNameList.length; i++) {
+ headers[headerNameList[i].childNodes[0].nodeValue] = headerValueList[i].childNodes[0].nodeValue;
+ }
+ // some versions of the PlayReady CDM return 'Content' instead of 'Content-Type',
+ // but the license server expects 'Content-Type', so we fix it up here.
+ if (headers.hasOwnProperty('Content')) {
+ headers['Content-Type'] = headers.Content;
+ delete headers.Content;
+ }
-MessageHandler.prototype.messagehandler = function messagehandler( messageType, message) {
+ return handler.call(this, messageType, licenseRequest, 'arraybuffer', headers, params).catch(function(response){
+ return response.text().then( function( error ) { throw error; } );
+ });
+ }
+};
- // For the DRM Today server, mapping between Key System messages and server protocol messages depends on
- // the Key System, so we provide key-system-specific functions here to perform the mapping.
+const requestConstructors = {
+ // Server request construction functions
//
- // For the Microsoft server, the mapping for PlayReady is the same as for the DRM Today server
+ // Promise<request> constructRequest(config, sessionType, content, messageType, message, params)
//
- const keySystems = {
- 'com.widevine.alpha': {
- responseType: 'json',
- getLicenseMessage: function(response) {
- return base64DecodeToUnit8Array( response.license );
- },
- getErrorResponse: function(response) {
- return response;
- },
- getLicenseRequestFromMessage: function(message) {
- return new Uint8Array(message);
- },
- getRequestHeadersFromMessage: function(/*message*/) {
- return null;
+ // request = { url: ..., headers: ..., body: ... }
+ //
+ // content = { assetId: ..., variantId: ..., key: ... }
+ // params = { expiration: ... }
+
+ 'drmtoday': function(config, sessionType, content, messageType, message, headers, params) {
+ var optData = JSON.stringify({merchant: config.merchant, userId:"12345", sessionId:""});
+ var crt = {};
+ if (messageType === 'license-request') {
+ crt = {assetId: content.assetId,
+ outputProtection: {digital : false, analogue: false, enforce: false},
+ storeLicense: (sessionType === 'persistent-license')};
+
+ if (!params || params.expiration === undefined) {
+ crt.profile = {purchase: {}};
+ } else {
+ crt.profile = {rental: {absoluteExpiration: (new Date(params.expiration)).toISOString(),
+ playDuration: 3600000 } };
}
- },
- 'com.microsoft.playready': {
- responseType: 'arraybuffer',
- getLicenseMessage: function(response) {
- return response;
- },
- getErrorResponse: function(response) {
- return String.fromCharCode.apply(null, new Uint16Array(response));
- },
- getLicenseRequestFromMessage: function(message) {
- var msg,
- xmlDoc;
- var licenseRequest = null;
- var parser = new DOMParser();
- var dataview = new Uint16Array(message);
-
- msg = String.fromCharCode.apply(null, dataview);
-
- xmlDoc = parser.parseFromString(msg, 'application/xml');
-
- if (xmlDoc.getElementsByTagName('Challenge')[0]) {
- var Challenge = xmlDoc.getElementsByTagName('Challenge')[0].childNodes[0].nodeValue;
- if (Challenge) {
- licenseRequest = atob(Challenge);
- }
- }
- return licenseRequest;
- },
- getRequestHeadersFromMessage: function(message) {
- var msg,
- xmlDoc;
- var headers = {};
- var parser = new DOMParser();
- var dataview = new Uint16Array(message);
-
- msg = String.fromCharCode.apply(null, dataview);
- xmlDoc = parser.parseFromString(msg, 'application/xml');
-
- var headerNameList = xmlDoc.getElementsByTagName('name');
- var headerValueList = xmlDoc.getElementsByTagName('value');
- for (var i = 0; i < headerNameList.length; i++) {
- headers[headerNameList[i].childNodes[0].nodeValue] = headerValueList[i].childNodes[0].nodeValue;
- }
- // some versions of the PlayReady CDM return 'Content' instead of 'Content-Type',
- // but the license server expects 'Content-Type', so we fix it up here.
- if (headers.hasOwnProperty('Content')) {
- headers['Content-Type'] = headers.Content;
- delete headers.Content;
- }
- return headers;
+
+ if (content.variantId !== undefined) {
+ crt.variantId = content.variantId;
}
}
- };
- // License request parameters are communicated to the DRM Today and Microsoft servers in different ways,
- // using a custom HTTP headers (DRM Today) and URL parameters (Microsoft).
- const serverTypes = {
- 'drmtoday': {
- constructLicenseRequestUrl : function( serverURL, sessionType, messageType, content ) {
- return serverURL;
- },
- getCustomHeaders : function( drmconfig, sessionType, messageType ) {
- var customHeader = { merchant: drmconfig.merchant,
- userId: "purchase",
- sessionId: "a0d0f0p" + ( ( sessionType === 'persistent-license' ) ? "1" : "0" ) };
- return { "dt-custom-data" : btoa( JSON.stringify( customHeader ) ) };
+ return JWT.encode("HS256", {optData: optData, crt: JSON.stringify([crt])}, config.secret).then(function(jwt){
+ headers = headers || {};
+ headers['x-dt-auth-token'] = jwt;
+ return {url: config.serverURL, headers: headers, body: message};
+ });
+ },
+
+ 'microsoft': function(config, sessionType, content, messageType, message, headers, params) {
+ var url = config.serverURL;
+ if (messageType === 'license-request') {
+ url += "?";
+ if (sessionType === 'temporary' || sessionType === 'persistent-usage-record') {
+ url += "UseSimpleNonPersistentLicense=1&";
}
- },
- 'microsoft': {
- constructLicenseRequestUrl : function( serverURL, sessionType, messageType, content ) {
- if ( messageType !== 'license-request' ) {
- return serverURL;
- }
-
- var url = serverURL + "?";
- if ( sessionType === 'temporary' || sessionType === 'persistent-usage-record' ) {
- url += "UseSimpleNonPersistentLicense=1&";
- }
- if ( sessionType === 'persistent-usage-record' ) {
- url += "SecureStop=1&";
- }
- url += "PlayEnablers=B621D91F-EDCC-4035-8D4B-DC71760D43E9&"; // disable output protection
- url += "ContentKey=" + btoa(String.fromCharCode.apply(null, content.keys[0].key));
- return url;
- },
- getCustomHeaders : function() { return {}; }
+ if (sessionType === 'persistent-usage-record') {
+ url += "SecureStop=1&";
+ }
+ url += "PlayEnablers=B621D91F-EDCC-4035-8D4B-DC71760D43E9&"; // disable output protection
+ url += "ContentKey=" + btoa(String.fromCharCode.apply(null, content.key));
+ return url;
}
- };
- return new Promise(function(resolve, reject) {
- var keysystemfns = keySystems[this._keysystem],
- serverfns,
- url = undefined,
- requestheaders = {},
- credentials = undefined;
+ // TODO: Include expiration time in URL
+ return Promise.resolve({url: url, headers: headers, body: message});
+ }
+};
- if ( !this._drmconfig || !keysystemfns || !this._drmconfig.servertype || !serverTypes[this._drmconfig.servertype] ) {
- reject('Unsupported Key System');
- return;
- }
+MessageHandler = function(keysystem, content, sessionType) {
+ sessionType = sessionType || "temporary";
+
+ this._keysystem = keysystem;
+ this._content = content;
+ this._sessionType = sessionType;
+ try {
+ this._drmconfig = drmconfig[this._keysystem].filter(function(drmconfig) {
+ return drmconfig.sessionTypes === undefined || (drmconfig.sessionTypes.indexOf(sessionType) !== -1);
+ })[0];
+ this._requestConstructor = requestConstructors[this._drmconfig.servertype];
- serverfns = serverTypes[this._drmconfig.servertype];
+ this.messagehandler = keySystemWrappers[keysystem].bind(this, MessageHandler.prototype.messagehandler);
- if ( !this._drmconfig.serverURL ) {
- reject('Undefined serverURL');
- return;
+ if (this._drmconfig && this._drmconfig.certificate) {
+ this.servercertificate = stringToUint8Array(atob(this._drmconfig.certificate));
}
+ } catch(e) {
+ return null;
+ }
+}
- url = serverfns.constructLicenseRequestUrl( this._drmconfig.serverURL, this._sessionType, messageType, this._content );
+MessageHandler.prototype.messagehandler = function messagehandler(messageType, message, responseType, headers, params) {
- // Ensure valid license server URL
- if (!url) {
- reject('No license server URL specified!');
- return;
- }
+ var variantId = params ? params.variantId : undefined;
+ var key;
+ if( variantId ) {
+ var keys = this._content.keys.filter(function(k){return k.variantId === variantId;});
+ if (keys[0]) key = keys[0].key;
+ }
+ if (!key) {
+ key = this._content.keys[0].key;
+ }
- // Set optional XMLHttpRequest headers from protection data and message
- var updateHeaders = function(headers) {
- var key;
- if (headers) {
- for (key in headers) {
- if ('authorization' === key.toLowerCase()) {
- credentials = 'include';
- }
- requestheaders[key] = headers[key];
- }
- }
- };
+ var content = {assetId: this._content.assetId,
+ variantId: variantId,
+ key: key};
- updateHeaders(serverfns.getCustomHeaders( this._drmconfig, this._sessionType, messageType ) );
- updateHeaders(keysystemfns.getRequestHeadersFromMessage(message));
+ return this._requestConstructor(this._drmconfig, this._sessionType, content, messageType, message, headers, params).then(function(request){
+ return fetch(request.url, {
+ method: 'POST',
+ headers: request.headers,
+ body: request.body });
+ }).then(function(fetchresponse){
+ if(fetchresponse.status !== 200) {
+ throw fetchresponse;
+ }
- // Set withCredentials property from server
- if ( this._drmconfig.withCredentials ) {
- credentials = 'include';
+ if(responseType === 'json') {
+ return fetchresponse.json();
+ } else if(responseType === 'arraybuffer') {
+ return fetchresponse.arrayBuffer();
}
+ });
+}
- fetch(url, {
- method: 'POST',
- headers: requestheaders,
- credentials: credentials,
- body: keysystemfns.getLicenseRequestFromMessage(message)
- }).then(function(fetchresponse) {
- if(fetchresponse.status !== 200) {
- reject( this._keysystem + ' update, XHR status is "' + fetchresponse.statusText
- + '" (' + fetchresponse.status + '), expected to be 200. readyState is ' + fetchresponse.readyState + '.'
- + ' Response is ' + ((fetchresponse) ? keysystemfns.getErrorResponse(fetchresponse) : 'NONE' ));
- return;
- }
+})();
+
+(function() {
+
+ var subtlecrypto = window.crypto.subtle;
+
+ // Encoding / decoding utilities
+ function b64pad(b64) { return b64+"==".substr(0,(b64.length%4)?(4-b64.length%4):0); }
+ function str2b64url(str) { return btoa(str).replace(/=+$/g, '').replace(/\+/g, "-").replace(/\//g, "_"); }
+ function b64url2str(b64) { return atob(b64pad(b64.replace(/\-/g, "+").replace(/\_/g, "/"))); }
+ function str2ab(str) { return Uint8Array.from( str.split(''), function(s){return s.charCodeAt(0)} ); }
+ function ab2str(ab) { return String.fromCharCode.apply(null, new Uint8Array(ab)); }
+
+ function jwt2webcrypto(alg) {
+ if (alg === "HS256") return {name: "HMAC", hash: "SHA-256", length: 256};
+ else if (alg === "HS384") return { name: "HMAC", hash: "SHA-384", length: 384};
+ else if (alg === "HS512") return { name: "HMAC", hash: "SHA-512", length: 512};
+ else throw new Error("Unrecognized JWT algorithm: " + alg);
+ }
+
+ JWT = {
+ encode: function encode(alg, claims, secret) {
+ var algorithm = jwt2webcrypto(alg);
+ if (secret.byteLength !== algorithm.length / 8) throw new Error("Unexpected secret length: " + secret.byteLength);
- if(keysystemfns.responseType === 'json') {
- return fetchresponse.json();
- } else if(keysystemfns.responseType === 'arraybuffer') {
- return fetchresponse.arrayBuffer();
+ if (!claims.iat) claims.iat = ((Date.now() / 1000) | 0) - 60;
+ if (!claims.jti) {
+ var nonce = new Uint8Array(16);
+ window.crypto.getRandomValues(nonce);
+ claims.jti = str2b64url( ab2str(nonce) );
}
- }.bind( this )).then(function(response){
- resolve(keysystemfns.getLicenseMessage(response));
- }).catch(reject);
- }.bind( this ));
-};
+
+ var header = {typ: "JWT", alg: alg};
+ var plaintext = str2b64url(JSON.stringify(header)) + '.' + str2b64url(JSON.stringify(claims));
+ return subtlecrypto.importKey("raw", secret, algorithm, false, [ "sign" ]).then( function(key) {
+ return subtlecrypto.sign(algorithm, key, str2ab(plaintext));
+ }).then(function(hmac){
+ return plaintext + '.' + str2b64url(ab2str(hmac));
+ });
+ },
+
+ decode: function decode(jwt, secret) {
+ var jwtparts = jwt.split('.');
+ var header = JSON.parse( b64url2str(jwtparts[0]));
+ var claims = JSON.parse( b64url2str(jwtparts[1]));
+ var hmac = str2ab(b64url2str(jwtparts[2]));
+ var algorithm = jwt2webcrypto(header.alg);
+ if (secret.byteLength !== algorithm.length / 8) throw new Error("Unexpected secret length: " + secret.byteLength);
+
+ return subtlecrypto.importKey("raw", secret, algorithm, false, ["sign", "verify"]).then(function(key) {
+ return subtlecrypto.verify(algorithm, key, hmac, str2ab(jwtparts[0] + '.' + jwtparts[1]));
+ }).then(function(success){
+ if (!success) throw new Error("Invalid signature");
+ return claims;
+ });
+ }
+ };
+})();
diff --git a/tests/wpt/web-platform-tests/encrypted-media/util/testmediasource.js b/tests/wpt/web-platform-tests/encrypted-media/util/testmediasource.js
index 62c2d577d3c..47cfeb4512a 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/util/testmediasource.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/util/testmediasource.js
@@ -15,29 +15,35 @@ function testmediasource(config) {
// Create media source
var source = new MediaSource();
-
- // Create and fill source buffers when the media source is opened
- source.addEventListener('sourceopen', onSourceOpen);
-
- function onSourceOpen(event) {
- var audioSourceBuffer = source.addSourceBuffer(config.audioType),
- videoSourceBuffer = source.addSourceBuffer(config.videoType);
-
- audioSourceBuffer.appendBuffer(config.audioMedia);
- videoSourceBuffer.appendBuffer(config.videoMedia);
-
- function endOfStream() {
- if (audioSourceBuffer.updating || videoSourceBuffer.updating) {
- setTimeout(endOfStream, 250);
- } else {
- source.endOfStream();
+ source.done = new Promise(function(resolvesource,rejectsource){
+
+ // Create and fill source buffers when the media source is opened
+ source.addEventListener('sourceopen', onSourceOpen);
+ resolve(source);
+
+ function onSourceOpen(event) {
+ var audioSourceBuffer = source.addSourceBuffer(config.audioType),
+ videoSourceBuffer = source.addSourceBuffer(config.videoType);
+
+ audioSourceBuffer.addEventListener('updateend',onUpdateEnd);
+ videoSourceBuffer.addEventListener('updateend',onUpdateEnd);
+
+ audioSourceBuffer.appendBuffer(config.audioMedia);
+ videoSourceBuffer.appendBuffer(config.videoMedia);
+
+ function onUpdateEnd(event){
+ event.target.removeEventListener('updateend', onUpdateEnd);
+ if (!audioSourceBuffer.updating && !videoSourceBuffer.updating) {
+ if (source.readyState !== 'open') {
+ rejectsource(new Error("Media source error"));
+ } else {
+ source.endOfStream();
+ resolvesource();
+ }
+ }
}
}
-
- endOfStream();
- }
-
- resolve(source);
+ });
});
});
-} \ No newline at end of file
+}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/util/utils.js b/tests/wpt/web-platform-tests/encrypted-media/util/utils.js
index dbd77502097..978cc5434d6 100644
--- a/tests/wpt/web-platform-tests/encrypted-media/util/utils.js
+++ b/tests/wpt/web-platform-tests/encrypted-media/util/utils.js
@@ -96,6 +96,12 @@ function waitForEventAndRunStep(eventName, element, func, stepTest)
element.addEventListener(eventName, stepTest.step_func(eventCallback), true);
}
+function waitForEvent(eventName, element) {
+ return new Promise(function(resolve) {
+ element.addEventListener(eventName, resolve, true);
+ })
+}
+
var consoleDiv = null;
function consoleWrite(text)
@@ -112,16 +118,7 @@ function consoleWrite(text)
function forceTestFailureFromPromise(test, error, message)
{
- // Promises convert exceptions into rejected Promises. Since there is
- // currently no way to report a failed test in the test harness, errors
- // are reported using force_timeout().
- if (message)
- consoleWrite(message + ': ' + error.message);
- else if (error)
- consoleWrite(error);
-
- test.force_timeout();
- test.done();
+ test.step_func(assert_unreached)(message ? message + ': ' + error.message : error);
}
// Returns an array of audioCapabilities that includes entries for a set of
@@ -178,26 +175,34 @@ function arrayBufferAsString(buffer)
function dumpKeyStatuses(keyStatuses)
{
- consoleWrite("for (var entry of keyStatuses)");
- for (var entry of keyStatuses) {
- consoleWrite(arrayBufferAsString(entry[0]) + ": " + entry[1]);
- }
- consoleWrite("for (var keyId of keyStatuses.keys())");
- for (var keyId of keyStatuses.keys()) {
- consoleWrite(arrayBufferAsString(keyId));
- }
- consoleWrite("for (var status of keyStatuses.values())");
- for (var status of keyStatuses.values()) {
- consoleWrite(status);
- }
- consoleWrite("for (var entry of keyStatuses.entries())");
- for (var entry of keyStatuses.entries()) {
- consoleWrite(arrayBufferAsString(entry[0]) + ": " + entry[1]);
+ var userAgent = navigator.userAgent.toLowerCase();
+ if (userAgent.indexOf('edge') === -1) {
+ consoleWrite("for (var entry of keyStatuses)");
+ for (var entry of keyStatuses) {
+ consoleWrite(arrayBufferAsString(entry[0]) + ": " + entry[1]);
+ }
+ consoleWrite("for (var keyId of keyStatuses.keys())");
+ for (var keyId of keyStatuses.keys()) {
+ consoleWrite(arrayBufferAsString(keyId));
+ }
+ consoleWrite("for (var status of keyStatuses.values())");
+ for (var status of keyStatuses.values()) {
+ consoleWrite(status);
+ }
+ consoleWrite("for (var entry of keyStatuses.entries())");
+ for (var entry of keyStatuses.entries()) {
+ consoleWrite(arrayBufferAsString(entry[0]) + ": " + entry[1]);
+ }
+ consoleWrite("keyStatuses.forEach()");
+ keyStatuses.forEach(function(status, keyId) {
+ consoleWrite(arrayBufferAsString(keyId) + ": " + status);
+ });
+ } else {
+ consoleWrite("keyStatuses.forEach()");
+ keyStatuses.forEach(function(keyId, status) {
+ consoleWrite(arrayBufferAsString(keyId) + ": " + status);
+ });
}
- consoleWrite("keyStatuses.forEach()");
- keyStatuses.forEach(function(status, keyId) {
- consoleWrite(arrayBufferAsString(keyId) + ": " + status);
- });
}
// Verify that |keyStatuses| contains just the keys in |keys.expected|
@@ -225,4 +230,56 @@ function verifyKeyStatuses(keyStatuses, keys)
});
}
+// This function checks that calling |testCase.func| returns a
+// rejected Promise with the error.name equal to
+// |testCase.exception|.
+function test_exception(testCase /*...*/) {
+ var func = testCase.func;
+ var exception = testCase.exception;
+ var args = Array.prototype.slice.call(arguments, 1);
+
+ // Currently blink throws for TypeErrors rather than returning
+ // a rejected promise (http://crbug.com/359386).
+ // FIXME: Remove try/catch once they become failed promises.
+ try {
+ return func.apply(null, args).then(
+ function (result) {
+ assert_unreached(format_value(func));
+ },
+ function (error) {
+ assert_equals(error.name, exception, format_value(func));
+ assert_not_equals(error.message, "", format_value(func));
+ }
+ );
+ } catch (e) {
+ // Only allow 'TypeError' exceptions to be thrown.
+ // Everything else should be a failed promise.
+ assert_equals('TypeError', exception, format_value(func));
+ assert_equals(e.name, exception, format_value(func));
+ }
+}
+
+// Check that the events sequence (array of strings) matches the pattern (array of either strings, or
+// arrays of strings, with the latter representing a possibly repeating sub-sequence)
+function checkEventSequence(events,pattern) {
+ function th(i) { return i + (i < 4 ? ["th", "st", "nd", "rd"][i] : "th"); }
+ var i = 0, j=0, k=0;
+ while(i < events.length && j < pattern.length) {
+ if (!Array.isArray(pattern[j])) {
+ assert_equals(events[i], pattern[j], "Expected " + th(i+1) + " event to be '" + pattern[j] + "'");
+ ++i;
+ ++j;
+ } else {
+ assert_equals(events[i], pattern[j][k], "Expected " + th(i+1) + " event to be '" + pattern[j][k] + "'");
+ ++i;
+ k = (k+1)%pattern[j].length;
+ if (k === 0 && events[i] !== pattern[j][0]) {
+ ++j;
+ }
+ }
+ }
+ assert_equals(i,events.length,"Received more events than expected");
+ assert_equals(j,pattern.length,"Expected more events than received");
+}
+
diff --git a/tests/wpt/web-platform-tests/eventsource/OWNERS b/tests/wpt/web-platform-tests/eventsource/OWNERS
index 4f8d605d71c..34781fda33b 100644
--- a/tests/wpt/web-platform-tests/eventsource/OWNERS
+++ b/tests/wpt/web-platform-tests/eventsource/OWNERS
@@ -1,5 +1,3 @@
@zqzhang
-@sideshowbarker
-@deniak
@Velmont
@Yaffle
diff --git a/tests/wpt/web-platform-tests/eventsource/eventsource-onmessage-realm-support.htm b/tests/wpt/web-platform-tests/eventsource/eventsource-onmessage-realm-support.htm
new file mode 100644
index 00000000000..63e6d012b4d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/eventsource/eventsource-onmessage-realm-support.htm
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<title>This page is just used to grab an EventSource constructor</title>
diff --git a/tests/wpt/web-platform-tests/eventsource/eventsource-onmessage-realm.htm b/tests/wpt/web-platform-tests/eventsource/eventsource-onmessage-realm.htm
new file mode 100644
index 00000000000..9bc8c4646a4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/eventsource/eventsource-onmessage-realm.htm
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>EventSource: message event Realm</title>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/comms.html#dispatchMessage">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<iframe src="eventsource-onmessage-realm-support.htm"></iframe>
+
+<script>
+"use strict";
+
+async_test(t => {
+ window.onload = t.step_func(() => {
+ const source = new frames[0].EventSource("resources/message.py");
+ t.add_cleanup(() => {
+ source.close();
+ });
+
+ source.onmessage = t.step_func_done(e => {
+ assert_equals(e.constructor, frames[0].MessageEvent);
+ });
+ });
+}, "the MessageEvent must be created in the Realm of the EventSource");
+</script>
diff --git a/tests/wpt/web-platform-tests/fetch/api/basic/conditional-get.html b/tests/wpt/web-platform-tests/fetch/api/basic/conditional-get.html
new file mode 100644
index 00000000000..b80e929fe6b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/basic/conditional-get.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>Request ETag</title>
+ <meta name="help" href="https://fetch.spec.whatwg.org/#request">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/utils.js"></script>
+ </head>
+ <body>
+ <script>
+ promise_test(function() {
+ var cacheBuster = token(); // ensures first request is uncached
+ var url = "../resources/cache.py?v=" + cacheBuster;
+ var etag;
+
+ // make the first request
+ return fetch(url).then(function(response) {
+ // ensure we're getting the regular, uncached response
+ assert_equals(response.status, 200);
+ assert_equals(response.headers.get("X-HTTP-STATUS"), null)
+
+ return response.text(); // consuming the body, just to be safe
+ }).then(function(body) {
+ // make a second request
+ return fetch(url);
+ }).then(function(response) {
+ // while the server responds with 304 if our browser sent the correct
+ // If-None-Match request header, at the JavaScript level this surfaces
+ // as 200
+ assert_equals(response.status, 200);
+ assert_equals(response.headers.get("X-HTTP-STATUS"), "304")
+
+ etag = response.headers.get("ETag")
+
+ return response.text(); // consuming the body, just to be safe
+ }).then(function(body) {
+ // make a third request, explicitly setting If-None-Match request header
+ var headers = { "If-None-Match": etag }
+ return fetch(url, { headers: headers })
+ }).then(function(response) {
+ // 304 now surfaces thanks to the explicit If-None-Match request header
+ assert_equals(response.status, 304);
+ });
+ }, "Testing conditional GET with ETags");
+
+ done();
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/basic/error-after-response.html b/tests/wpt/web-platform-tests/fetch/api/basic/error-after-response.html
new file mode 100644
index 00000000000..5701d6d7866
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/basic/error-after-response.html
@@ -0,0 +1,34 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Fetch: network timeout after receiving the HTTP response headers</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="../resources/utils.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+function checkReader(test, reader, promiseToTest)
+{
+ return reader.read().then((value) => {
+ validateBufferFromString(value.value, "TEST_CHUNK", "Should receive first chunk");
+ return promise_rejects(test, new TypeError(), promiseToTest(reader));
+ });
+}
+
+promise_test((test) => {
+ return fetch("../resources/bad-chunk-encoding.py?count=1").then((response) => {
+ return checkReader(test, response.body.getReader(), reader => reader.read());
+ });
+}, "Response reader read() promise should reject after a network error happening after resolving fetch promise");
+
+promise_test((test) => {
+ return fetch("../resources/bad-chunk-encoding.py?count=1").then((response) => {
+ return checkReader(test, response.body.getReader(), reader => reader.closed);
+ });
+}, "Response reader closed promise should reject after a network error happening after resolving fetch promise");
+ </script>
+ </body>
+</html>
+
diff --git a/tests/wpt/web-platform-tests/fetch/api/basic/integrity-sharedworker.html b/tests/wpt/web-platform-tests/fetch/api/basic/integrity-sharedworker.html
new file mode 100644
index 00000000000..fa90a60ce98
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/basic/integrity-sharedworker.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>Fetch in sharedworker: integrity handling</title>
+ <meta name="help" href="https://fetch.spec.whatwg.org/#main-fetch">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <script>
+ fetch_tests_from_worker(new SharedWorker("integrity.js?pipe=sub"));
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/basic/request-headers.js b/tests/wpt/web-platform-tests/fetch/api/basic/request-headers.js
index 4c78ff0dc1c..7b0eee489a7 100644
--- a/tests/wpt/web-platform-tests/fetch/api/basic/request-headers.js
+++ b/tests/wpt/web-platform-tests/fetch/api/basic/request-headers.js
@@ -15,6 +15,8 @@ function checkContentType(contentType, body)
expectedContentType = null;
else if (body instanceof Blob)
expectedContentType = body.type ? body.type : null;
+ else if (body instanceof URLSearchParams)
+ expectedContentType = "application/x-www-form-urlencoded;charset=UTF-8";
assert_equals(contentType , expectedContentType, "Request should have header content-type: " + expectedContentType);
}
@@ -49,6 +51,7 @@ requestHeaders("Fetch with PUT with body", url, "PUT", "Request's body", locatio
requestHeaders("Fetch with POST without body", url, "POST", null, location.origin, "0");
requestHeaders("Fetch with POST with text body", url, "POST", "Request's body", location.origin, "14");
requestHeaders("Fetch with POST with FormData body", url, "POST", function() { return new FormData(); }, location.origin);
+requestHeaders("Fetch with POST with URLSearchParams body", url, "POST", function() { return new URLSearchParams("name=value"); }, location.origin, "10");
requestHeaders("Fetch with POST with Blob body", url, "POST", new Blob(["Test"]), location.origin, "4");
requestHeaders("Fetch with POST with ArrayBuffer body", url, "POST", new ArrayBuffer(4), location.origin, "4");
requestHeaders("Fetch with POST with Uint8Array body", url, "POST", new Uint8Array(4), location.origin, "4");
diff --git a/tests/wpt/web-platform-tests/fetch/api/basic/request-upload-worker.html b/tests/wpt/web-platform-tests/fetch/api/basic/request-upload-worker.html
new file mode 100644
index 00000000000..914de6f37f6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/basic/request-upload-worker.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>Fetch in worker: Upload</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <script>
+ fetch_tests_from_worker(new Worker("request-upload.js"));
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/basic/request-upload.html b/tests/wpt/web-platform-tests/fetch/api/basic/request-upload.html
new file mode 100644
index 00000000000..1b5b8e76bf5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/basic/request-upload.html
@@ -0,0 +1,13 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>Fetch: Uploading content</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="../resources/utils.js"></script>
+ </head>
+ <body>
+ <script src="request-upload.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/basic/request-upload.js b/tests/wpt/web-platform-tests/fetch/api/basic/request-upload.js
new file mode 100644
index 00000000000..b5d79c4c185
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/basic/request-upload.js
@@ -0,0 +1,35 @@
+if (this.document === undefined) {
+ importScripts("/resources/testharness.js");
+ importScripts("../resources/utils.js");
+}
+
+function testUpload(desc, url, method, body, expectedBody) {
+ var requestInit = {"method": method}
+ promise_test(function(test){
+ if (typeof body === "function")
+ body = body();
+ if (body)
+ requestInit["body"] = body;
+ return fetch(url, requestInit).then(function(resp) {
+ return resp.text().then((text)=> {
+ assert_equals(text, expectedBody);
+ });
+ });
+ }, desc);
+}
+
+var url = RESOURCES_DIR + "echo-content.py"
+
+testUpload("Fetch with PUT with body", url, "PUT", "Request's body", "Request's body");
+testUpload("Fetch with POST with text body", url, "POST", "Request's body", "Request's body");
+testUpload("Fetch with POST with URLSearchParams body", url, "POST", function() { return new URLSearchParams("name=value"); }, "name=value");
+testUpload("Fetch with POST with Blob body", url, "POST", new Blob(["Test"]), "Test");
+testUpload("Fetch with POST with ArrayBuffer body", url, "POST", new ArrayBuffer(4), "\0\0\0\0");
+testUpload("Fetch with POST with Uint8Array body", url, "POST", new Uint8Array(4), "\0\0\0\0");
+testUpload("Fetch with POST with Int8Array body", url, "POST", new Int8Array(4), "\0\0\0\0");
+testUpload("Fetch with POST with Float32Array body", url, "POST", new Float32Array(1), "\0\0\0\0");
+testUpload("Fetch with POST with Float64Array body", url, "POST", new Float64Array(1), "\0\0\0\0\0\0\0\0");
+testUpload("Fetch with POST with DataView body", url, "POST", new DataView(new ArrayBuffer(8), 0, 4), "\0\0\0\0");
+testUpload("Fetch with POST with Blob body with mime type", url, "POST", new Blob(["Test"], { type: "text/maybe" }), "Test");
+
+done();
diff --git a/tests/wpt/web-platform-tests/fetch/api/basic/scheme-data.js b/tests/wpt/web-platform-tests/fetch/api/basic/scheme-data.js
index e7904d04751..3e2504a0b87 100644
--- a/tests/wpt/web-platform-tests/fetch/api/basic/scheme-data.js
+++ b/tests/wpt/web-platform-tests/fetch/api/basic/scheme-data.js
@@ -3,10 +3,10 @@ if (this.document === undefined) {
importScripts("../resources/utils.js");
}
-function checkFetchResponse(url, data, mime, fetchMode) {
+function checkFetchResponse(url, data, mime, fetchMode, method) {
var cut = (url.length >= 40) ? "[...]" : "";
- desc = "Fetching " + url.substring(0, 40) + cut + " is OK";
- var init = { };
+ desc = "Fetching " + (method ? "[" + method + "] " : "") + url.substring(0, 40) + cut + " is OK";
+ var init = {"method": method || "GET"};
if (fetchMode) {
init.mode = fetchMode;
desc += " (" + fetchMode + ")";
@@ -31,6 +31,8 @@ checkFetchResponse("data:text/plain;base64,cmVzcG9uc2UncyBib2R5", "response's bo
checkFetchResponse("data:image/png;base64,cmVzcG9uc2UncyBib2R5",
"response's body",
"image/png");
+checkFetchResponse("data:,response%27s%20body", "response's body", "text/plain;charset=US-ASCII", null, "POST");
+checkFetchResponse("data:,response%27s%20body", "response's body", "text/plain;charset=US-ASCII", null, "HEAD");
function checkKoUrl(url, method, desc) {
var cut = (url.length >= 40) ? "[...]" : "";
@@ -41,7 +43,5 @@ function checkKoUrl(url, method, desc) {
}
checkKoUrl("data:notAdataUrl.com", "GET");
-checkKoUrl("data:,response%27s%20body", "POST");
-checkKoUrl("data:,response%27s%20body", "HEAD");
done();
diff --git a/tests/wpt/web-platform-tests/fetch/api/basic/text-utf8.html b/tests/wpt/web-platform-tests/fetch/api/basic/text-utf8.html
index 7499a474a85..e5c567b9c45 100644
--- a/tests/wpt/web-platform-tests/fetch/api/basic/text-utf8.html
+++ b/tests/wpt/web-platform-tests/fetch/api/basic/text-utf8.html
@@ -41,6 +41,19 @@ function testTextDecoding(body, expectedText, urlParameter, title)
});
});
}, title + " with fetched data (UTF-16 charset)");
+
+ promise_test(function(test) {
+ return new Response(body).arrayBuffer().then(function(buffer) {
+ assert_array_equals(new Uint8Array(buffer), encode_utf8(body), "Response.arrayBuffer() should contain data encoded as UTF-8");
+ });
+ }, title + " (Response object)");
+
+ promise_test(function(test) {
+ return new Request("", {method: "POST", body: body}).arrayBuffer().then(function(buffer) {
+ assert_array_equals(new Uint8Array(buffer), encode_utf8(body), "Request.arrayBuffer() should contain data encoded as UTF-8");
+ });
+ }, title + " (Request object)");
+
}
var utf8WithBOM = "\xef\xbb\xbf\xe4\xb8\x89\xe6\x9d\x91\xe3\x81\x8b\xe3\x81\xaa\xe5\xad\x90";
diff --git a/tests/wpt/web-platform-tests/fetch/api/cors/cors-redirect.js b/tests/wpt/web-platform-tests/fetch/api/cors/cors-redirect.js
index 75f67e7ee31..99f5a11f354 100644
--- a/tests/wpt/web-platform-tests/fetch/api/cors/cors-redirect.js
+++ b/tests/wpt/web-platform-tests/fetch/api/cors/cors-redirect.js
@@ -15,7 +15,7 @@ function corsRedirect(desc, redirectUrl, redirectLocation, redirectStatus, expec
var requestInit = {"mode": "cors", "redirect": "follow"};
return promise_test(function(test) {
- fetch(RESOURCES_DIR + "clean-stash.py?token=" + uuid_token).then(function(resp) {
+ return fetch(RESOURCES_DIR + "clean-stash.py?token=" + uuid_token).then(function(resp) {
return fetch(url + urlParameters, requestInit).then(function(resp) {
assert_equals(resp.status, 200, "Response's status is 200");
assert_equals(resp.headers.get("x-did-preflight"), "0", "No preflight request has been made");
diff --git a/tests/wpt/web-platform-tests/fetch/api/headers/headers-basic.html b/tests/wpt/web-platform-tests/fetch/api/headers/headers-basic.html
index 90ba2b2a908..98d71acad9f 100644
--- a/tests/wpt/web-platform-tests/fetch/api/headers/headers-basic.html
+++ b/tests/wpt/web-platform-tests/fetch/api/headers/headers-basic.html
@@ -127,7 +127,7 @@
return value.toLowerCase();
}).sort();
- var iteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([].values()));
+ var iteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()));
function checkIteratorProperties(iterator) {
var prototype = Object.getPrototypeOf(iterator);
assert_equals(Object.getPrototypeOf(prototype), iteratorPrototype);
diff --git a/tests/wpt/web-platform-tests/fetch/api/headers/headers-normalize.html b/tests/wpt/web-platform-tests/fetch/api/headers/headers-normalize.html
index 384c4f4c26f..6dfcf9d8194 100644
--- a/tests/wpt/web-platform-tests/fetch/api/headers/headers-normalize.html
+++ b/tests/wpt/web-platform-tests/fetch/api/headers/headers-normalize.html
@@ -32,7 +32,7 @@
assert_equals(headers.get(name), headerDictWS[name].trim(),
"name: " + name + " has value: " + headerDictWS[name].trim());
}
- }, "Check append method whith not normalized values");
+ }, "Check append method with not normalized values");
test(function() {
var headers = new Headers();
@@ -41,7 +41,7 @@
assert_equals(headers.get(name), headerDictWS[name].trim(),
"name: " + name + " has value: " + headerDictWS[name].trim());
}
- }, "Check set method whith not normalized values");
+ }, "Check set method with not normalized values");
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/redirect/redirect-count.js b/tests/wpt/web-platform-tests/fetch/api/redirect/redirect-count.js
index ffa521a5c0f..0103280f6e2 100644
--- a/tests/wpt/web-platform-tests/fetch/api/redirect/redirect-count.js
+++ b/tests/wpt/web-platform-tests/fetch/api/redirect/redirect-count.js
@@ -17,7 +17,7 @@ function redirectCount(desc, redirectUrl, redirectLocation, redirectStatus, maxC
var requestInit = {"redirect": "follow"};
promise_test(function(test) {
- fetch(RESOURCES_DIR + "clean-stash.py?token=" + uuid_token).then(function(resp) {
+ return fetch(RESOURCES_DIR + "clean-stash.py?token=" + uuid_token).then(function(resp) {
assert_equals(resp.status, 200, "Clean stash response's status is 200");
if (!shouldPass)
@@ -25,9 +25,10 @@ function redirectCount(desc, redirectUrl, redirectLocation, redirectStatus, maxC
return fetch(url + urlParameters, requestInit).then(function(resp) {
assert_equals(resp.status, 200, "Response's status is 200");
+ return resp.text();
+ }).then(function(body) {
+ assert_equals(body, maxCount.toString(), "Redirected " + maxCount + " times");
});
- }).then(function(body) {
- assert_equals(body, maxCount.toString(), "Redirected " + maxCount + "times");
});
}, desc);
}
diff --git a/tests/wpt/web-platform-tests/fetch/api/request/multi-globals/current/current.html b/tests/wpt/web-platform-tests/fetch/api/request/multi-globals/current/current.html
new file mode 100644
index 00000000000..82a48d40990
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/request/multi-globals/current/current.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<title>Current page used as a test helper</title>
diff --git a/tests/wpt/web-platform-tests/fetch/api/request/multi-globals/incumbent/incumbent.html b/tests/wpt/web-platform-tests/fetch/api/request/multi-globals/incumbent/incumbent.html
new file mode 100644
index 00000000000..8edc71cfb12
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/request/multi-globals/incumbent/incumbent.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<title>Incumbent page used as a test helper</title>
+
+<iframe src="../current/current.html" id="c"></iframe>
+
+<script>
+'use strict';
+
+const current = document.querySelector('#c').contentWindow;
+
+window.createRequest = (...args) => {
+ return new current.Request(...args);
+};
+
+</script>
diff --git a/tests/wpt/web-platform-tests/fetch/api/request/multi-globals/url-parsing.html b/tests/wpt/web-platform-tests/fetch/api/request/multi-globals/url-parsing.html
new file mode 100644
index 00000000000..f20298ad628
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/request/multi-globals/url-parsing.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<title>Request constructor URL parsing, with multiple globals in play</title>
+<link rel="help" href="https://fetch.spec.whatwg.org/#dom-request">
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<!-- This is the entry global -->
+
+<iframe src="incumbent/incumbent.html"></iframe>
+
+<script>
+'use strict';
+
+const loadPromise = new Promise(resolve => {
+ window.addEventListener("load", () => resolve());
+});
+
+promise_test(() => {
+ return loadPromise.then(() => {
+ const req = frames[0].createRequest("url");
+
+ assert_equals(req.url, new URL("current/url", location.href).href);
+ });
+}, "should parse the URL relative to the current settings object");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/fetch/api/request/request-cache-default-conditional.html b/tests/wpt/web-platform-tests/fetch/api/request/request-cache-default-conditional.html
new file mode 100644
index 00000000000..7b2a7bd31ae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/request/request-cache-default-conditional.html
@@ -0,0 +1,180 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>Request cache - default with conditional requests</title>
+ <meta name="help" href="https://fetch.spec.whatwg.org/#request">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/utils.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="request-cache.js"></script>
+ </head>
+ <body>
+ <script>
+ var tests = [
+ {
+ name: 'RequestCache "default" mode with an If-Modified-Since header is treated similarly to "no-store"',
+ state: "stale",
+ request_cache: ["default", "default"],
+ request_headers: [{}, {"If-Modified-Since": now.toGMTString()}],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [false, true],
+ },
+ {
+ name: 'RequestCache "default" mode with an If-Modified-Since header is treated similarly to "no-store"',
+ state: "fresh",
+ request_cache: ["default", "default"],
+ request_headers: [{}, {"If-Modified-Since": now.toGMTString()}],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [false, true],
+ },
+ {
+ name: 'RequestCache "default" mode with an If-Modified-Since header is treated similarly to "no-store"',
+ state: "stale",
+ request_cache: ["default", "default"],
+ request_headers: [{"If-Modified-Since": now.toGMTString()}, {}],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [true, false],
+ },
+ {
+ name: 'RequestCache "default" mode with an If-Modified-Since header is treated similarly to "no-store"',
+ state: "fresh",
+ request_cache: ["default", "default"],
+ request_headers: [{"If-Modified-Since": now.toGMTString()}, {}],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [true, false],
+ },
+ {
+ name: 'RequestCache "default" mode with an If-None-Match header is treated similarly to "no-store"',
+ state: "stale",
+ request_cache: ["default", "default"],
+ request_headers: [{}, {"If-None-Match": '"foo"'}],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [false, true],
+ },
+ {
+ name: 'RequestCache "default" mode with an If-None-Match header is treated similarly to "no-store"',
+ state: "fresh",
+ request_cache: ["default", "default"],
+ request_headers: [{}, {"If-None-Match": '"foo"'}],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [false, true],
+ },
+ {
+ name: 'RequestCache "default" mode with an If-None-Match header is treated similarly to "no-store"',
+ state: "stale",
+ request_cache: ["default", "default"],
+ request_headers: [{"If-None-Match": '"foo"'}, {}],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [true, false],
+ },
+ {
+ name: 'RequestCache "default" mode with an If-None-Match header is treated similarly to "no-store"',
+ state: "fresh",
+ request_cache: ["default", "default"],
+ request_headers: [{"If-None-Match": '"foo"'}, {}],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [true, false],
+ },
+ {
+ name: 'RequestCache "default" mode with an If-Unmodified-Since header is treated similarly to "no-store"',
+ state: "stale",
+ request_cache: ["default", "default"],
+ request_headers: [{}, {"If-Unmodified-Since": now.toGMTString()}],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [false, true],
+ },
+ {
+ name: 'RequestCache "default" mode with an If-Unmodified-Since header is treated similarly to "no-store"',
+ state: "fresh",
+ request_cache: ["default", "default"],
+ request_headers: [{}, {"If-Unmodified-Since": now.toGMTString()}],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [false, true],
+ },
+ {
+ name: 'RequestCache "default" mode with an If-Unmodified-Since header is treated similarly to "no-store"',
+ state: "stale",
+ request_cache: ["default", "default"],
+ request_headers: [{"If-Unmodified-Since": now.toGMTString()}, {}],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [true, false],
+ },
+ {
+ name: 'RequestCache "default" mode with an If-Unmodified-Since header is treated similarly to "no-store"',
+ state: "fresh",
+ request_cache: ["default", "default"],
+ request_headers: [{"If-Unmodified-Since": now.toGMTString()}, {}],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [true, false],
+ },
+ {
+ name: 'RequestCache "default" mode with an If-Match header is treated similarly to "no-store"',
+ state: "stale",
+ request_cache: ["default", "default"],
+ request_headers: [{}, {"If-Match": '"foo"'}],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [false, true],
+ },
+ {
+ name: 'RequestCache "default" mode with an If-Match header is treated similarly to "no-store"',
+ state: "fresh",
+ request_cache: ["default", "default"],
+ request_headers: [{}, {"If-Match": '"foo"'}],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [false, true],
+ },
+ {
+ name: 'RequestCache "default" mode with an If-Match header is treated similarly to "no-store"',
+ state: "stale",
+ request_cache: ["default", "default"],
+ request_headers: [{"If-Match": '"foo"'}, {}],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [true, false],
+ },
+ {
+ name: 'RequestCache "default" mode with an If-Match header is treated similarly to "no-store"',
+ state: "fresh",
+ request_cache: ["default", "default"],
+ request_headers: [{"If-Match": '"foo"'}, {}],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [true, false],
+ },
+ {
+ name: 'RequestCache "default" mode with an If-Range header is treated similarly to "no-store"',
+ state: "stale",
+ request_cache: ["default", "default"],
+ request_headers: [{}, {"If-Range": '"foo"'}],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [false, true],
+ },
+ {
+ name: 'RequestCache "default" mode with an If-Range header is treated similarly to "no-store"',
+ state: "fresh",
+ request_cache: ["default", "default"],
+ request_headers: [{}, {"If-Range": '"foo"'}],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [false, true],
+ },
+ {
+ name: 'RequestCache "default" mode with an If-Range header is treated similarly to "no-store"',
+ state: "stale",
+ request_cache: ["default", "default"],
+ request_headers: [{"If-Range": '"foo"'}, {}],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [true, false],
+ },
+ {
+ name: 'RequestCache "default" mode with an If-Range header is treated similarly to "no-store"',
+ state: "fresh",
+ request_cache: ["default", "default"],
+ request_headers: [{"If-Range": '"foo"'}, {}],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [true, false],
+ },
+ ];
+ run_tests(tests);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/request/request-cache-default.html b/tests/wpt/web-platform-tests/fetch/api/request/request-cache-default.html
new file mode 100644
index 00000000000..c0e37b2d0c9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/request/request-cache-default.html
@@ -0,0 +1,50 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>Request cache - default</title>
+ <meta name="help" href="https://fetch.spec.whatwg.org/#request">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/utils.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="request-cache.js"></script>
+ </head>
+ <body>
+ <script>
+ var tests = [
+ {
+ name: 'RequestCache "default" mode checks the cache for previously cached content and goes to the network for stale responses',
+ state: "stale",
+ request_cache: ["default", "default"],
+ expected_validation_headers: [false, true],
+ expected_no_cache_headers: [false, false],
+ },
+ {
+ name: 'RequestCache "default" mode checks the cache for previously cached content and avoids going to the network if a fresh response exists',
+ state: "fresh",
+ request_cache: ["default", "default"],
+ expected_validation_headers: [false],
+ expected_no_cache_headers: [false],
+ },
+ {
+ name: 'Responses with the "Cache-Control: no-store" header are not stored in the cache',
+ state: "stale",
+ cache_control: "no-store",
+ request_cache: ["default", "default"],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [false, false],
+ },
+ {
+ name: 'Responses with the "Cache-Control: no-store" header are not stored in the cache',
+ state: "fresh",
+ cache_control: "no-store",
+ request_cache: ["default", "default"],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [false, false],
+ },
+ ];
+ run_tests(tests);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/request/request-cache-force-cache.html b/tests/wpt/web-platform-tests/fetch/api/request/request-cache-force-cache.html
new file mode 100644
index 00000000000..ed45726f55e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/request/request-cache-force-cache.html
@@ -0,0 +1,78 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>Request cache - force-cache</title>
+ <meta name="help" href="https://fetch.spec.whatwg.org/#request">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/utils.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="request-cache.js"></script>
+ </head>
+ <body>
+ <script>
+ var tests = [
+ {
+ name: 'RequestCache "force-cache" mode checks the cache for previously cached content and avoid revalidation for stale responses',
+ state: "stale",
+ request_cache: ["default", "force-cache"],
+ expected_validation_headers: [false],
+ expected_no_cache_headers: [false],
+ },
+ {
+ name: 'RequestCache "force-cache" mode checks the cache for previously cached content and avoid revalidation for fresh responses',
+ state: "fresh",
+ request_cache: ["default", "force-cache"],
+ expected_validation_headers: [false],
+ expected_no_cache_headers: [false],
+ },
+ {
+ name: 'RequestCache "force-cache" mode checks the cache for previously cached content and goes to the network if a cached response is not found',
+ state: "stale",
+ request_cache: ["force-cache"],
+ expected_validation_headers: [false],
+ expected_no_cache_headers: [false],
+ },
+ {
+ name: 'RequestCache "force-cache" mode checks the cache for previously cached content and goes to the network if a cached response is not found',
+ state: "fresh",
+ request_cache: ["force-cache"],
+ expected_validation_headers: [false],
+ expected_no_cache_headers: [false],
+ },
+ {
+ name: 'RequestCache "force-cache" mode checks the cache for previously cached content and goes to the network if a cached response would vary',
+ state: "stale",
+ vary: "*",
+ request_cache: ["default", "force-cache"],
+ expected_validation_headers: [false, true],
+ expected_no_cache_headers: [false, false],
+ },
+ {
+ name: 'RequestCache "force-cache" mode checks the cache for previously cached content and goes to the network if a cached response would vary',
+ state: "fresh",
+ vary: "*",
+ request_cache: ["default", "force-cache"],
+ expected_validation_headers: [false, true],
+ expected_no_cache_headers: [false, false],
+ },
+ {
+ name: 'RequestCache "force-cache" stores the response in the cache if it goes to the network',
+ state: "stale",
+ request_cache: ["force-cache", "default"],
+ expected_validation_headers: [false, true],
+ expected_no_cache_headers: [false, false],
+ },
+ {
+ name: 'RequestCache "force-cache" stores the response in the cache if it goes to the network',
+ state: "fresh",
+ request_cache: ["force-cache", "default"],
+ expected_validation_headers: [false],
+ expected_no_cache_headers: [false],
+ },
+ ];
+ run_tests(tests);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/request/request-cache-no-cache.html b/tests/wpt/web-platform-tests/fetch/api/request/request-cache-no-cache.html
new file mode 100644
index 00000000000..d30ed162696
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/request/request-cache-no-cache.html
@@ -0,0 +1,36 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>Request cache : no-cache</title>
+ <meta name="help" href="https://fetch.spec.whatwg.org/#request">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/utils.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="request-cache.js"></script>
+ </head>
+ <body>
+ <script>
+ var tests = [
+ {
+ name: 'RequestCache "no-cache" mode revalidates stale responses found in the cache',
+ state: "stale",
+ request_cache: ["default", "no-cache"],
+ expected_validation_headers: [false, true],
+ expected_no_cache_headers: [false, false],
+ expected_max_age_headers: [false, true],
+ },
+ {
+ name: 'RequestCache "no-cache" mode revalidates fresh responses found in the cache',
+ state: "fresh",
+ request_cache: ["default", "no-cache"],
+ expected_validation_headers: [false, true],
+ expected_no_cache_headers: [false, false],
+ expected_max_age_headers: [false, true],
+ },
+ ];
+ run_tests(tests);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/request/request-cache-no-store.html b/tests/wpt/web-platform-tests/fetch/api/request/request-cache-no-store.html
new file mode 100644
index 00000000000..396b6a65090
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/request/request-cache-no-store.html
@@ -0,0 +1,48 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>Request cache - no store</title>
+ <meta name="help" href="https://fetch.spec.whatwg.org/#request">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/utils.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="request-cache.js"></script>
+ </head>
+ <body>
+ <script>
+ var tests = [
+ {
+ name: 'RequestCache "no-store" mode does not check the cache for previously cached content and goes to the network regardless',
+ state: "stale",
+ request_cache: ["default", "no-store"],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [false, true],
+ },
+ {
+ name: 'RequestCache "no-store" mode does not check the cache for previously cached content and goes to the network regardless',
+ state: "fresh",
+ request_cache: ["default", "no-store"],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [false, true],
+ },
+ {
+ name: 'RequestCache "no-store" mode does not store the response in the cache',
+ state: "stale",
+ request_cache: ["no-store", "default"],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [true, false],
+ },
+ {
+ name: 'RequestCache "no-store" mode does not store the response in the cache',
+ state: "fresh",
+ request_cache: ["no-store", "default"],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [true, false],
+ },
+ ];
+ run_tests(tests);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/request/request-cache-only-if-cached.html b/tests/wpt/web-platform-tests/fetch/api/request/request-cache-only-if-cached.html
new file mode 100644
index 00000000000..adb31a397a7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/request/request-cache-only-if-cached.html
@@ -0,0 +1,76 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>Request cache - only-if-cached</title>
+ <meta name="help" href="https://fetch.spec.whatwg.org/#request">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/utils.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="request-cache.js"></script>
+ </head>
+ <body>
+ <script>
+ var tests = [
+ {
+ name: 'RequestCache "only-if-cached" mode checks the cache for previously cached content and avoids revalidation for stale responses',
+ state: "stale",
+ request_cache: ["default", "only-if-cached"],
+ expected_validation_headers: [false],
+ expected_no_cache_headers: [false]
+ },
+ {
+ name: 'RequestCache "only-if-cached" mode checks the cache for previously cached content and avoids revalidation for fresh responses',
+ state: "fresh",
+ request_cache: ["default", "only-if-cached"],
+ expected_validation_headers: [false],
+ expected_no_cache_headers: [false]
+ },
+ {
+ name: 'RequestCache "only-if-cached" mode checks the cache for previously cached content and does not go to the network if a cached response is not found',
+ state: "fresh",
+ request_cache: ["only-if-cached"],
+ response: ["error"],
+ expected_validation_headers: [],
+ expected_no_cache_headers: []
+ },
+ {
+ name: 'RequestCache "only-if-cached" (with "same-origin") uses cached same-origin redirects to same-origin content',
+ state: "fresh",
+ request_cache: ["default", "only-if-cached"],
+ redirect: "same-origin",
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [false, false],
+ },
+ {
+ name: 'RequestCache "only-if-cached" (with "same-origin") uses cached same-origin redirects to same-origin content',
+ state: "stale",
+ request_cache: ["default", "only-if-cached"],
+ redirect: "same-origin",
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [false, false],
+ },
+ {
+ name: 'RequestCache "only-if-cached" (with "same-origin") does not follow redirects across origins and rejects',
+ state: "fresh",
+ request_cache: ["default", "only-if-cached"],
+ redirect: "cross-origin",
+ response: [null, "error"],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [false, false],
+ },
+ {
+ name: 'RequestCache "only-if-cached" (with "same-origin") does not follow redirects across origins and rejects',
+ state: "stale",
+ request_cache: ["default", "only-if-cached"],
+ redirect: "cross-origin",
+ response: [null, "error"],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [false, false],
+ },
+ ];
+ run_tests(tests);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/request/request-cache-reload.html b/tests/wpt/web-platform-tests/fetch/api/request/request-cache-reload.html
new file mode 100644
index 00000000000..45ff5832482
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/request/request-cache-reload.html
@@ -0,0 +1,62 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>Request cache - reload</title>
+ <meta name="help" href="https://fetch.spec.whatwg.org/#request">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/utils.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="request-cache.js"></script>
+ </head>
+ <body>
+ <script>
+ var tests = [
+ {
+ name: 'RequestCache "reload" mode does not check the cache for previously cached content and goes to the network regardless',
+ state: "stale",
+ request_cache: ["default", "reload"],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [false, true],
+ },
+ {
+ name: 'RequestCache "reload" mode does not check the cache for previously cached content and goes to the network regardless',
+ state: "fresh",
+ request_cache: ["default", "reload"],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [false, true],
+ },
+ {
+ name: 'RequestCache "reload" mode does store the response in the cache',
+ state: "stale",
+ request_cache: ["reload", "default"],
+ expected_validation_headers: [false, true],
+ expected_no_cache_headers: [true, false],
+ },
+ {
+ name: 'RequestCache "reload" mode does store the response in the cache',
+ state: "fresh",
+ request_cache: ["reload", "default"],
+ expected_validation_headers: [false],
+ expected_no_cache_headers: [true],
+ },
+ {
+ name: 'RequestCache "reload" mode does store the response in the cache even if a previous response is already stored',
+ state: "stale",
+ request_cache: ["default", "reload", "default"],
+ expected_validation_headers: [false, false, true],
+ expected_no_cache_headers: [false, true, false],
+ },
+ {
+ name: 'RequestCache "reload" mode does store the response in the cache even if a previous response is already stored',
+ state: "fresh",
+ request_cache: ["default", "reload", "default"],
+ expected_validation_headers: [false, false],
+ expected_no_cache_headers: [false, true],
+ },
+ ];
+ run_tests(tests);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/request/request-cache.html b/tests/wpt/web-platform-tests/fetch/api/request/request-cache.html
deleted file mode 100644
index f2c442a5409..00000000000
--- a/tests/wpt/web-platform-tests/fetch/api/request/request-cache.html
+++ /dev/null
@@ -1,626 +0,0 @@
-<!doctype html>
-<html>
- <head>
- <meta charset="utf-8">
- <title>Request cache</title>
- <meta name="help" href="https://fetch.spec.whatwg.org/#request">
- <meta name="timeout" content="long">
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="/common/utils.js"></script>
- <script src="/common/get-host-info.sub.js"></script>
- </head>
- <body>
- <script>
- var now = new Date();
- /**
- * Each test is run twice: once using etag/If-None-Match and once with
- * date/If-Modified-Since. Each test run gets its own URL and randomized
- * content and operates independently.
- *
- * The test steps are run with request_cache.length fetch requests issued
- * and their immediate results sanity-checked. The cache.py server script
- * stashes an entry containing any If-None-Match, If-Modified-Since, Pragma,
- * and Cache-Control observed headers for each request it receives. When
- * the test fetches have run, this state is retrieved from cache.py and the
- * expected_* lists are checked, including their length.
- *
- * This means that if a request_* fetch is expected to hit the cache and not
- * touch the network, then there will be no entry for it in the expect_*
- * lists. AKA (request_cache.length - expected_validation_headers.length)
- * should equal the number of cache hits that didn't touch the network.
- *
- * Test dictionary keys:
- * - state: required string that determines whether the Expires response for
- * the fetched document should be set in the future ("fresh") or past
- * ("stale").
- * - vary: optional string to be passed to the server for it to quote back
- * in a Vary header on the response to us.
- * - cache_control: optional string to be passed to the server for it to
- * quote back in a Cache-Control header on the response to us.
- * - redirect: optional string "same-origin" or "cross-origin". If
- * provided, the server will issue an absolute redirect to the script on
- * the same or a different origin, as appropriate. The redirected
- * location is the script with the redirect parameter removed, so the
- * content/state/etc. will be as if you hadn't specified a redirect.
- * - request_cache: required array of cache modes to use (via `cache`).
- * - request_headers: optional array of explicit fetch `headers` arguments.
- * If provided, the server will log an empty dictionary for each request
- * instead of the request headers it would normally log.
- * - response: optional array of specialized response handling. Right now,
- * "error" array entries indicate a network error response is expected
- * which will reject with a TypeError.
- * - expected_validation_headers: required boolean array indicating whether
- * the server should have seen an If-None-Match/If-Modified-Since header
- * in the request.
- * - expected_no_cache_headers: required boolean array indicating whether
- * the server should have seen Pragma/Cache-control:no-cache headers in
- * the request.
- * - expected_max_age_headers: optional boolean array indicating whether
- * the server should have seen a Cache-Control:max-age=0 header in the
- * request.
- */
- var tests = [
- {
- name: 'RequestCache "default" mode checks the cache for previously cached content and goes to the network for stale responses',
- state: "stale",
- request_cache: ["default", "default"],
- expected_validation_headers: [false, true],
- expected_no_cache_headers: [false, false],
- },
- {
- name: 'RequestCache "default" mode checks the cache for previously cached content and avoids going to the network if a fresh response exists',
- state: "fresh",
- request_cache: ["default", "default"],
- expected_validation_headers: [false],
- expected_no_cache_headers: [false],
- },
- {
- name: 'RequestCache "no-cache" mode revalidates stale responses found in the cache',
- state: "stale",
- request_cache: ["default", "no-cache"],
- expected_validation_headers: [false, true],
- expected_no_cache_headers: [false, false],
- expected_max_age_headers: [false, true],
- },
- {
- name: 'RequestCache "no-cache" mode revalidates fresh responses found in the cache',
- state: "fresh",
- request_cache: ["default", "no-cache"],
- expected_validation_headers: [false, true],
- expected_no_cache_headers: [false, false],
- expected_max_age_headers: [false, true],
- },
- {
- name: 'RequestCache "force-cache" mode checks the cache for previously cached content and avoid revalidation for stale responses',
- state: "stale",
- request_cache: ["default", "force-cache"],
- expected_validation_headers: [false],
- expected_no_cache_headers: [false],
- },
- {
- name: 'RequestCache "force-cache" mode checks the cache for previously cached content and avoid revalidation for fresh responses',
- state: "fresh",
- request_cache: ["default", "force-cache"],
- expected_validation_headers: [false],
- expected_no_cache_headers: [false],
- },
- {
- name: 'RequestCache "force-cache" mode checks the cache for previously cached content and goes to the network if a cached response is not found',
- state: "stale",
- request_cache: ["force-cache"],
- expected_validation_headers: [false],
- expected_no_cache_headers: [false],
- },
- {
- name: 'RequestCache "force-cache" mode checks the cache for previously cached content and goes to the network if a cached response is not found',
- state: "fresh",
- request_cache: ["force-cache"],
- expected_validation_headers: [false],
- expected_no_cache_headers: [false],
- },
- {
- name: 'RequestCache "force-cache" mode checks the cache for previously cached content and goes to the network if a cached response would vary',
- state: "stale",
- vary: "*",
- request_cache: ["default", "force-cache"],
- expected_validation_headers: [false, true],
- expected_no_cache_headers: [false, false],
- },
- {
- name: 'RequestCache "force-cache" mode checks the cache for previously cached content and goes to the network if a cached response would vary',
- state: "fresh",
- vary: "*",
- request_cache: ["default", "force-cache"],
- expected_validation_headers: [false, true],
- expected_no_cache_headers: [false, false],
- },
- {
- name: 'RequestCache "force-cache" stores the response in the cache if it goes to the network',
- state: "stale",
- request_cache: ["force-cache", "default"],
- expected_validation_headers: [false, true],
- expected_no_cache_headers: [false, false],
- },
- {
- name: 'RequestCache "force-cache" stores the response in the cache if it goes to the network',
- state: "fresh",
- request_cache: ["force-cache", "default"],
- expected_validation_headers: [false],
- expected_no_cache_headers: [false],
- },
- {
- name: 'RequestCache "only-if-cached" mode checks the cache for previously cached content and avoids revalidation for stale responses',
- state: "stale",
- request_cache: ["default", "only-if-cached"],
- expected_validation_headers: [false],
- expected_no_cache_headers: [false]
- },
- {
- name: 'RequestCache "only-if-cached" mode checks the cache for previously cached content and avoids revalidation for fresh responses',
- state: "fresh",
- request_cache: ["default", "only-if-cached"],
- expected_validation_headers: [false],
- expected_no_cache_headers: [false]
- },
- {
- name: 'RequestCache "only-if-cached" mode checks the cache for previously cached content and does not go to the network if a cached response is not found',
- state: "fresh",
- request_cache: ["only-if-cached"],
- response: ["error"],
- expected_validation_headers: [],
- expected_no_cache_headers: []
- },
- {
- name: 'RequestCache "only-if-cached" (with "same-origin") uses cached same-origin redirects to same-origin content',
- state: "fresh",
- request_cache: ["default", "only-if-cached"],
- redirect: "same-origin",
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [false, false],
- },
- {
- name: 'RequestCache "only-if-cached" (with "same-origin") uses cached same-origin redirects to same-origin content',
- state: "stale",
- request_cache: ["default", "only-if-cached"],
- redirect: "same-origin",
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [false, false],
- },
- {
- name: 'RequestCache "only-if-cached" (with "same-origin") does not follow redirects across origins and rejects',
- state: "fresh",
- request_cache: ["default", "only-if-cached"],
- redirect: "cross-origin",
- response: [null, "error"],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [false, false],
- },
- {
- name: 'RequestCache "only-if-cached" (with "same-origin") does not follow redirects across origins and rejects',
- state: "stale",
- request_cache: ["default", "only-if-cached"],
- redirect: "cross-origin",
- response: [null, "error"],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [false, false],
- },
- {
- name: 'RequestCache "no-store" mode does not check the cache for previously cached content and goes to the network regardless',
- state: "stale",
- request_cache: ["default", "no-store"],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [false, true],
- },
- {
- name: 'RequestCache "no-store" mode does not check the cache for previously cached content and goes to the network regardless',
- state: "fresh",
- request_cache: ["default", "no-store"],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [false, true],
- },
- {
- name: 'RequestCache "no-store" mode does not store the response in the cache',
- state: "stale",
- request_cache: ["no-store", "default"],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [true, false],
- },
- {
- name: 'RequestCache "no-store" mode does not store the response in the cache',
- state: "fresh",
- request_cache: ["no-store", "default"],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [true, false],
- },
- {
- name: 'RequestCache "default" mode with an If-Modified-Since header is treated similarly to "no-store"',
- state: "stale",
- request_cache: ["default", "default"],
- request_headers: [{}, {"If-Modified-Since": now.toGMTString()}],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [false, true],
- },
- {
- name: 'RequestCache "default" mode with an If-Modified-Since header is treated similarly to "no-store"',
- state: "fresh",
- request_cache: ["default", "default"],
- request_headers: [{}, {"If-Modified-Since": now.toGMTString()}],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [false, true],
- },
- {
- name: 'RequestCache "default" mode with an If-Modified-Since header is treated similarly to "no-store"',
- state: "stale",
- request_cache: ["default", "default"],
- request_headers: [{"If-Modified-Since": now.toGMTString()}, {}],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [true, false],
- },
- {
- name: 'RequestCache "default" mode with an If-Modified-Since header is treated similarly to "no-store"',
- state: "fresh",
- request_cache: ["default", "default"],
- request_headers: [{"If-Modified-Since": now.toGMTString()}, {}],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [true, false],
- },
- {
- name: 'RequestCache "default" mode with an If-None-Match header is treated similarly to "no-store"',
- state: "stale",
- request_cache: ["default", "default"],
- request_headers: [{}, {"If-None-Match": '"foo"'}],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [false, true],
- },
- {
- name: 'RequestCache "default" mode with an If-None-Match header is treated similarly to "no-store"',
- state: "fresh",
- request_cache: ["default", "default"],
- request_headers: [{}, {"If-None-Match": '"foo"'}],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [false, true],
- },
- {
- name: 'RequestCache "default" mode with an If-None-Match header is treated similarly to "no-store"',
- state: "stale",
- request_cache: ["default", "default"],
- request_headers: [{"If-None-Match": '"foo"'}, {}],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [true, false],
- },
- {
- name: 'RequestCache "default" mode with an If-None-Match header is treated similarly to "no-store"',
- state: "fresh",
- request_cache: ["default", "default"],
- request_headers: [{"If-None-Match": '"foo"'}, {}],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [true, false],
- },
- {
- name: 'RequestCache "default" mode with an If-Unmodified-Since header is treated similarly to "no-store"',
- state: "stale",
- request_cache: ["default", "default"],
- request_headers: [{}, {"If-Unmodified-Since": now.toGMTString()}],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [false, true],
- },
- {
- name: 'RequestCache "default" mode with an If-Unmodified-Since header is treated similarly to "no-store"',
- state: "fresh",
- request_cache: ["default", "default"],
- request_headers: [{}, {"If-Unmodified-Since": now.toGMTString()}],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [false, true],
- },
- {
- name: 'RequestCache "default" mode with an If-Unmodified-Since header is treated similarly to "no-store"',
- state: "stale",
- request_cache: ["default", "default"],
- request_headers: [{"If-Unmodified-Since": now.toGMTString()}, {}],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [true, false],
- },
- {
- name: 'RequestCache "default" mode with an If-Unmodified-Since header is treated similarly to "no-store"',
- state: "fresh",
- request_cache: ["default", "default"],
- request_headers: [{"If-Unmodified-Since": now.toGMTString()}, {}],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [true, false],
- },
- {
- name: 'RequestCache "default" mode with an If-Match header is treated similarly to "no-store"',
- state: "stale",
- request_cache: ["default", "default"],
- request_headers: [{}, {"If-Match": '"foo"'}],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [false, true],
- },
- {
- name: 'RequestCache "default" mode with an If-Match header is treated similarly to "no-store"',
- state: "fresh",
- request_cache: ["default", "default"],
- request_headers: [{}, {"If-Match": '"foo"'}],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [false, true],
- },
- {
- name: 'RequestCache "default" mode with an If-Match header is treated similarly to "no-store"',
- state: "stale",
- request_cache: ["default", "default"],
- request_headers: [{"If-Match": '"foo"'}, {}],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [true, false],
- },
- {
- name: 'RequestCache "default" mode with an If-Match header is treated similarly to "no-store"',
- state: "fresh",
- request_cache: ["default", "default"],
- request_headers: [{"If-Match": '"foo"'}, {}],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [true, false],
- },
- {
- name: 'RequestCache "default" mode with an If-Range header is treated similarly to "no-store"',
- state: "stale",
- request_cache: ["default", "default"],
- request_headers: [{}, {"If-Range": '"foo"'}],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [false, true],
- },
- {
- name: 'RequestCache "default" mode with an If-Range header is treated similarly to "no-store"',
- state: "fresh",
- request_cache: ["default", "default"],
- request_headers: [{}, {"If-Range": '"foo"'}],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [false, true],
- },
- {
- name: 'RequestCache "default" mode with an If-Range header is treated similarly to "no-store"',
- state: "stale",
- request_cache: ["default", "default"],
- request_headers: [{"If-Range": '"foo"'}, {}],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [true, false],
- },
- {
- name: 'RequestCache "default" mode with an If-Range header is treated similarly to "no-store"',
- state: "fresh",
- request_cache: ["default", "default"],
- request_headers: [{"If-Range": '"foo"'}, {}],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [true, false],
- },
- {
- name: 'Responses with the "Cache-Control: no-store" header are not stored in the cache',
- state: "stale",
- cache_control: "no-store",
- request_cache: ["default", "default"],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [false, false],
- },
- {
- name: 'Responses with the "Cache-Control: no-store" header are not stored in the cache',
- state: "fresh",
- cache_control: "no-store",
- request_cache: ["default", "default"],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [false, false],
- },
- {
- name: 'RequestCache "reload" mode does not check the cache for previously cached content and goes to the network regardless',
- state: "stale",
- request_cache: ["default", "reload"],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [false, true],
- },
- {
- name: 'RequestCache "reload" mode does not check the cache for previously cached content and goes to the network regardless',
- state: "fresh",
- request_cache: ["default", "reload"],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [false, true],
- },
- {
- name: 'RequestCache "reload" mode does store the response in the cache',
- state: "stale",
- request_cache: ["reload", "default"],
- expected_validation_headers: [false, true],
- expected_no_cache_headers: [true, false],
- },
- {
- name: 'RequestCache "reload" mode does store the response in the cache',
- state: "fresh",
- request_cache: ["reload", "default"],
- expected_validation_headers: [false],
- expected_no_cache_headers: [true],
- },
- {
- name: 'RequestCache "reload" mode does store the response in the cache even if a previous response is already stored',
- state: "stale",
- request_cache: ["default", "reload", "default"],
- expected_validation_headers: [false, false, true],
- expected_no_cache_headers: [false, true, false],
- },
- {
- name: 'RequestCache "reload" mode does store the response in the cache even if a previous response is already stored',
- state: "fresh",
- request_cache: ["default", "reload", "default"],
- expected_validation_headers: [false, false],
- expected_no_cache_headers: [false, true],
- },
- ];
- function base_path() {
- return location.pathname.replace(/\/[^\/]*$/, '/');
- }
- function make_url(uuid, id, value, content, info) {
- var dates = {
- fresh: new Date(now.getFullYear() + 1, now.getMonth(), now.getDay()).toGMTString(),
- stale: new Date(now.getFullYear() - 1, now.getMonth(), now.getDay()).toGMTString(),
- };
- var vary = "";
- if ("vary" in info) {
- vary = "&vary=" + info.vary;
- }
- var cache_control = "";
- if ("cache_control" in info) {
- cache_control = "&cache_control=" + info.cache_control;
- }
- var redirect = "";
-
- var ignore_request_headers = "";
- if ("request_headers" in info) {
- // Ignore the request headers that we send since they may be synthesized by the test.
- ignore_request_headers = "&ignore";
- }
- var url_sans_redirect = "resources/cache.py?token=" + uuid +
- "&content=" + content +
- "&" + id + "=" + value +
- "&expires=" + dates[info.state] +
- vary + cache_control + ignore_request_headers;
- // If there's a redirect, the target is the script without any redirect at
- // either the same domain or a different domain.
- if ("redirect" in info) {
- var host_info = get_host_info();
- var origin;
- switch (info.redirect) {
- case "same-origin":
- origin = host_info['HTTP_ORIGIN'];
- break;
- case "cross-origin":
- origin = host_info['HTTP_REMOTE_ORIGIN'];
- break;
- }
- var redirected_url = origin + base_path() + url_sans_redirect;
- return url_sans_redirect + "&redirect=" + encodeURIComponent(redirected_url);
- } else {
- return url_sans_redirect;
- }
- }
- function expected_status(type, identifier, init) {
- if (type == "date" &&
- init.headers &&
- init.headers["If-Modified-Since"] == identifier) {
- // The server will respond with a 304 in this case.
- return [304, "Not Modified"];
- }
- return [200, "OK"];
- }
- function expected_response_text(type, identifier, init, content) {
- if (type == "date" &&
- init.headers &&
- init.headers["If-Modified-Since"] == identifier) {
- // The server will respond with a 304 in this case.
- return "";
- }
- return content;
- }
- function server_state(uuid) {
- return fetch("resources/cache.py?querystate&token=" + uuid)
- .then(function(response) {
- return response.text();
- }).then(function(text) {
- // null will be returned if the server never received any requests
- // for the given uuid. Normalize that to an empty list consistent
- // with our representation.
- return JSON.parse(text) || [];
- });
- }
- function make_test(type, info) {
- return function(test) {
- var uuid = token();
- var identifier = (type == "tag" ? Math.random() : now.toGMTString());
- var content = Math.random().toString();
- var url = make_url(uuid, type, identifier, content, info);
- var fetch_functions = [];
- for (var i = 0; i < info.request_cache.length; ++i) {
- fetch_functions.push(function(idx) {
- var init = {cache: info.request_cache[idx]};
- if ("request_headers" in info) {
- init.headers = info.request_headers[idx];
- }
- if (init.cache === "only-if-cached") {
- // only-if-cached requires we use same-origin mode.
- init.mode = "same-origin";
- }
- return fetch(url, init)
- .then(function(response) {
- if ("response" in info && info.response[idx] === "error") {
- assert_true(false, "fetch should have been an error");
- return;
- }
- assert_array_equals([response.status, response.statusText],
- expected_status(type, identifier, init));
- return response.text();
- }).then(function(text) {
- assert_equals(text, expected_response_text(type, identifier, init, content));
- }, function(reason) {
- if ("response" in info && info.response[idx] === "error") {
- assert_throws(new TypeError(), function() { throw reason; });
- } else {
- throw reason;
- }
- });
- });
- }
- var i = 0;
- function run_next_step() {
- if (fetch_functions.length) {
- return fetch_functions.shift()(i++)
- .then(run_next_step);
- } else {
- return Promise.resolve();
- }
- }
- return run_next_step()
- .then(function() {
- // Now, query the server state
- return server_state(uuid);
- }).then(function(state) {
- var expectedState = [];
- info.expected_validation_headers.forEach(function (validate) {
- if (validate) {
- if (type == "tag") {
- expectedState.push({"If-None-Match": '"' + identifier + '"'});
- } else {
- expectedState.push({"If-Modified-Since": identifier});
- }
- } else {
- expectedState.push({});
- }
- });
- for (var i = 0; i < info.expected_no_cache_headers.length; ++i) {
- if (info.expected_no_cache_headers[i]) {
- expectedState[i]["Pragma"] = "no-cache";
- expectedState[i]["Cache-Control"] = "no-cache";
- }
- }
- if ("expected_max_age_headers" in info) {
- for (var i = 0; i < info.expected_max_age_headers.length; ++i) {
- if (info.expected_max_age_headers[i]) {
- expectedState[i]["Cache-Control"] = "max-age=0";
- }
- }
- }
- assert_equals(state.length, expectedState.length);
- for (var i = 0; i < state.length; ++i) {
- for (var header in state[i]) {
- assert_equals(state[i][header], expectedState[i][header]);
- delete expectedState[i][header];
- }
- for (var header in expectedState[i]) {
- assert_false(header in state[i]);
- }
- }
- });
- };
- }
- tests.forEach(function(info) {
- promise_test(make_test("tag", info), info.name + " with Etag and " + info.state + " response");
- promise_test(make_test("date", info), info.name + " with date and " + info.state + " response");
- });
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/request/request-cache.js b/tests/wpt/web-platform-tests/fetch/api/request/request-cache.js
new file mode 100644
index 00000000000..deeb17d1b50
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/request/request-cache.js
@@ -0,0 +1,223 @@
+/**
+ * Each test is run twice: once using etag/If-None-Match and once with
+ * date/If-Modified-Since. Each test run gets its own URL and randomized
+ * content and operates independently.
+ *
+ * The test steps are run with request_cache.length fetch requests issued
+ * and their immediate results sanity-checked. The cache.py server script
+ * stashes an entry containing any If-None-Match, If-Modified-Since, Pragma,
+ * and Cache-Control observed headers for each request it receives. When
+ * the test fetches have run, this state is retrieved from cache.py and the
+ * expected_* lists are checked, including their length.
+ *
+ * This means that if a request_* fetch is expected to hit the cache and not
+ * touch the network, then there will be no entry for it in the expect_*
+ * lists. AKA (request_cache.length - expected_validation_headers.length)
+ * should equal the number of cache hits that didn't touch the network.
+ *
+ * Test dictionary keys:
+ * - state: required string that determines whether the Expires response for
+ * the fetched document should be set in the future ("fresh") or past
+ * ("stale").
+ * - vary: optional string to be passed to the server for it to quote back
+ * in a Vary header on the response to us.
+ * - cache_control: optional string to be passed to the server for it to
+ * quote back in a Cache-Control header on the response to us.
+ * - redirect: optional string "same-origin" or "cross-origin". If
+ * provided, the server will issue an absolute redirect to the script on
+ * the same or a different origin, as appropriate. The redirected
+ * location is the script with the redirect parameter removed, so the
+ * content/state/etc. will be as if you hadn't specified a redirect.
+ * - request_cache: required array of cache modes to use (via `cache`).
+ * - request_headers: optional array of explicit fetch `headers` arguments.
+ * If provided, the server will log an empty dictionary for each request
+ * instead of the request headers it would normally log.
+ * - response: optional array of specialized response handling. Right now,
+ * "error" array entries indicate a network error response is expected
+ * which will reject with a TypeError.
+ * - expected_validation_headers: required boolean array indicating whether
+ * the server should have seen an If-None-Match/If-Modified-Since header
+ * in the request.
+ * - expected_no_cache_headers: required boolean array indicating whether
+ * the server should have seen Pragma/Cache-control:no-cache headers in
+ * the request.
+ * - expected_max_age_headers: optional boolean array indicating whether
+ * the server should have seen a Cache-Control:max-age=0 header in the
+ * request.
+ */
+
+var now = new Date();
+
+function base_path() {
+ return location.pathname.replace(/\/[^\/]*$/, '/');
+}
+function make_url(uuid, id, value, content, info) {
+ var dates = {
+ fresh: new Date(now.getFullYear() + 1, now.getMonth(), now.getDay()).toGMTString(),
+ stale: new Date(now.getFullYear() - 1, now.getMonth(), now.getDay()).toGMTString(),
+ };
+ var vary = "";
+ if ("vary" in info) {
+ vary = "&vary=" + info.vary;
+ }
+ var cache_control = "";
+ if ("cache_control" in info) {
+ cache_control = "&cache_control=" + info.cache_control;
+ }
+ var redirect = "";
+
+ var ignore_request_headers = "";
+ if ("request_headers" in info) {
+ // Ignore the request headers that we send since they may be synthesized by the test.
+ ignore_request_headers = "&ignore";
+ }
+ var url_sans_redirect = "resources/cache.py?token=" + uuid +
+ "&content=" + content +
+ "&" + id + "=" + value +
+ "&expires=" + dates[info.state] +
+ vary + cache_control + ignore_request_headers;
+ // If there's a redirect, the target is the script without any redirect at
+ // either the same domain or a different domain.
+ if ("redirect" in info) {
+ var host_info = get_host_info();
+ var origin;
+ switch (info.redirect) {
+ case "same-origin":
+ origin = host_info['HTTP_ORIGIN'];
+ break;
+ case "cross-origin":
+ origin = host_info['HTTP_REMOTE_ORIGIN'];
+ break;
+ }
+ var redirected_url = origin + base_path() + url_sans_redirect;
+ return url_sans_redirect + "&redirect=" + encodeURIComponent(redirected_url);
+ } else {
+ return url_sans_redirect;
+ }
+}
+function expected_status(type, identifier, init) {
+ if (type == "date" &&
+ init.headers &&
+ init.headers["If-Modified-Since"] == identifier) {
+ // The server will respond with a 304 in this case.
+ return [304, "Not Modified"];
+ }
+ return [200, "OK"];
+}
+function expected_response_text(type, identifier, init, content) {
+ if (type == "date" &&
+ init.headers &&
+ init.headers["If-Modified-Since"] == identifier) {
+ // The server will respond with a 304 in this case.
+ return "";
+ }
+ return content;
+}
+function server_state(uuid) {
+ return fetch("resources/cache.py?querystate&token=" + uuid)
+ .then(function(response) {
+ return response.text();
+ }).then(function(text) {
+ // null will be returned if the server never received any requests
+ // for the given uuid. Normalize that to an empty list consistent
+ // with our representation.
+ return JSON.parse(text) || [];
+ });
+}
+function make_test(type, info) {
+ return function(test) {
+ var uuid = token();
+ var identifier = (type == "tag" ? Math.random() : now.toGMTString());
+ var content = Math.random().toString();
+ var url = make_url(uuid, type, identifier, content, info);
+ var fetch_functions = [];
+ for (var i = 0; i < info.request_cache.length; ++i) {
+ fetch_functions.push(function(idx) {
+ var init = {cache: info.request_cache[idx]};
+ if ("request_headers" in info) {
+ init.headers = info.request_headers[idx];
+ }
+ if (init.cache === "only-if-cached") {
+ // only-if-cached requires we use same-origin mode.
+ init.mode = "same-origin";
+ }
+ return fetch(url, init)
+ .then(function(response) {
+ if ("response" in info && info.response[idx] === "error") {
+ assert_true(false, "fetch should have been an error");
+ return;
+ }
+ assert_array_equals([response.status, response.statusText],
+ expected_status(type, identifier, init));
+ return response.text();
+ }).then(function(text) {
+ assert_equals(text, expected_response_text(type, identifier, init, content));
+ }, function(reason) {
+ if ("response" in info && info.response[idx] === "error") {
+ assert_throws(new TypeError(), function() { throw reason; });
+ } else {
+ throw reason;
+ }
+ });
+ });
+ }
+ var i = 0;
+ function run_next_step() {
+ if (fetch_functions.length) {
+ return fetch_functions.shift()(i++)
+ .then(run_next_step);
+ } else {
+ return Promise.resolve();
+ }
+ }
+ return run_next_step()
+ .then(function() {
+ // Now, query the server state
+ return server_state(uuid);
+ }).then(function(state) {
+ var expectedState = [];
+ info.expected_validation_headers.forEach(function (validate) {
+ if (validate) {
+ if (type == "tag") {
+ expectedState.push({"If-None-Match": '"' + identifier + '"'});
+ } else {
+ expectedState.push({"If-Modified-Since": identifier});
+ }
+ } else {
+ expectedState.push({});
+ }
+ });
+ for (var i = 0; i < info.expected_no_cache_headers.length; ++i) {
+ if (info.expected_no_cache_headers[i]) {
+ expectedState[i]["Pragma"] = "no-cache";
+ expectedState[i]["Cache-Control"] = "no-cache";
+ }
+ }
+ if ("expected_max_age_headers" in info) {
+ for (var i = 0; i < info.expected_max_age_headers.length; ++i) {
+ if (info.expected_max_age_headers[i]) {
+ expectedState[i]["Cache-Control"] = "max-age=0";
+ }
+ }
+ }
+ assert_equals(state.length, expectedState.length);
+ for (var i = 0; i < state.length; ++i) {
+ for (var header in state[i]) {
+ assert_equals(state[i][header], expectedState[i][header]);
+ delete expectedState[i][header];
+ }
+ for (var header in expectedState[i]) {
+ assert_false(header in state[i]);
+ }
+ }
+ });
+ };
+}
+
+function run_tests(tests)
+{
+ tests.forEach(function(info) {
+ promise_test(make_test("tag", info), info.name + " with Etag and " + info.state + " response");
+ promise_test(make_test("date", info), info.name + " with date and " + info.state + " response");
+ });
+}
diff --git a/tests/wpt/web-platform-tests/fetch/api/request/request-consume-empty.html b/tests/wpt/web-platform-tests/fetch/api/request/request-consume-empty.html
index a2bb3e2a9bd..c3ca8383a95 100644
--- a/tests/wpt/web-platform-tests/fetch/api/request/request-consume-empty.html
+++ b/tests/wpt/web-platform-tests/fetch/api/request/request-consume-empty.html
@@ -98,6 +98,10 @@
checkRequestWithEmptyBody("text", "", false);
checkRequestWithEmptyBody("blob", new Blob([], { "type" : "text/plain" }), true);
checkRequestWithEmptyBody("text", "", true);
+ checkRequestWithEmptyBody("URLSearchParams", new URLSearchParams(""), true);
+ // FIXME: This test assumes that the empty string be returned but it is not clear whether that is right. See https://github.com/w3c/web-platform-tests/pull/3950.
+ checkRequestWithEmptyBody("FormData", new FormData(), true);
+ checkRequestWithEmptyBody("ArrayBuffer", new ArrayBuffer(), true);
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/resources/bad-chunk-encoding.py b/tests/wpt/web-platform-tests/fetch/api/resources/bad-chunk-encoding.py
new file mode 100644
index 00000000000..3135403863b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/resources/bad-chunk-encoding.py
@@ -0,0 +1,13 @@
+import time
+
+def main(request, response):
+ delay = float(request.GET.first("ms", 1000)) / 1E3
+ count = int(request.GET.first("count", 50))
+ time.sleep(delay)
+ response.headers.set("Transfer-Encoding", "chunked")
+ response.write_status_headers()
+ time.sleep(delay);
+ for i in xrange(count):
+ response.writer.write_content("a\r\nTEST_CHUNK\r\n")
+ time.sleep(delay)
+ response.writer.write_content("garbage")
diff --git a/tests/wpt/web-platform-tests/fetch/api/resources/cache.py b/tests/wpt/web-platform-tests/fetch/api/resources/cache.py
new file mode 100644
index 00000000000..899638716a1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/resources/cache.py
@@ -0,0 +1,18 @@
+ETAG = '"123abc"'
+CONTENT_TYPE = "text/plain"
+CONTENT = "lorem ipsum dolor sit amet"
+
+
+def main(request, response):
+ # let caching kick in if possible (conditional GET)
+ etag = request.headers.get("If-None-Match", None)
+ if etag == ETAG:
+ response.headers.set("X-HTTP-STATUS", 304)
+ response.status = (304, "Not Modified")
+ return ""
+
+ # cache miss, so respond with the actual content
+ response.status = (200, "OK")
+ response.headers.set("ETag", ETAG)
+ response.headers.set("Content-Type", CONTENT_TYPE)
+ return CONTENT
diff --git a/tests/wpt/web-platform-tests/fetch/api/resources/echo-content.py b/tests/wpt/web-platform-tests/fetch/api/resources/echo-content.py
new file mode 100644
index 00000000000..5c39e838181
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/resources/echo-content.py
@@ -0,0 +1,9 @@
+def main(request, response):
+
+ headers = [("X-Request-Method", request.method),
+ ("X-Request-Content-Length", request.headers.get("Content-Length", "NO")),
+ ("X-Request-Content-Type", request.headers.get("Content-Type", "NO"))]
+
+ content = request.body
+
+ return headers, content
diff --git a/tests/wpt/web-platform-tests/fetch/api/resources/utils.js b/tests/wpt/web-platform-tests/fetch/api/resources/utils.js
index 86542c7bc8f..f290c22ee7f 100644
--- a/tests/wpt/web-platform-tests/fetch/api/resources/utils.js
+++ b/tests/wpt/web-platform-tests/fetch/api/resources/utils.js
@@ -51,6 +51,13 @@ function stringToArray(str) {
return array;
}
+function encode_utf8(str)
+{
+ if (self.TextEncoder)
+ return (new TextEncoder).encode(str);
+ return stringToArray(unescape(encodeURIComponent(str)));
+}
+
function validateBufferFromString(buffer, expectedValue, message)
{
return assert_array_equals(new Uint8Array(buffer !== undefined ? buffer : []), stringToArray(expectedValue), message);
diff --git a/tests/wpt/web-platform-tests/fetch/api/response/multi-globals/current/current.html b/tests/wpt/web-platform-tests/fetch/api/response/multi-globals/current/current.html
new file mode 100644
index 00000000000..82a48d40990
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/response/multi-globals/current/current.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<title>Current page used as a test helper</title>
diff --git a/tests/wpt/web-platform-tests/fetch/api/response/multi-globals/incumbent/incumbent.html b/tests/wpt/web-platform-tests/fetch/api/response/multi-globals/incumbent/incumbent.html
new file mode 100644
index 00000000000..4d1ee085440
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/response/multi-globals/incumbent/incumbent.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<title>Incumbent page used as a test helper</title>
+
+<iframe src="../current/current.html" id="c"></iframe>
+<iframe src="../relevant/relevant.html" id="r"></iframe>
+
+<script>
+'use strict';
+
+const current = document.querySelector('#c').contentWindow;
+const relevant = document.querySelector('#r').contentWindow;
+
+window.createRedirectResponse = (...args) => {
+ return current.Response.redirect.call(relevant.Response, ...args);
+};
+
+</script>
diff --git a/tests/wpt/web-platform-tests/fetch/api/response/multi-globals/relevant/relevant.html b/tests/wpt/web-platform-tests/fetch/api/response/multi-globals/relevant/relevant.html
new file mode 100644
index 00000000000..44f42eda493
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/response/multi-globals/relevant/relevant.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<title>Relevant page used as a test helper</title>
diff --git a/tests/wpt/web-platform-tests/fetch/api/response/multi-globals/url-parsing.html b/tests/wpt/web-platform-tests/fetch/api/response/multi-globals/url-parsing.html
new file mode 100644
index 00000000000..73bf9cfd0ad
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/response/multi-globals/url-parsing.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<title>Response.redirect URL parsing, with multiple globals in play</title>
+<link rel="help" href="https://fetch.spec.whatwg.org/#dom-response-redirect">
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<!-- This is the entry global -->
+
+<iframe src="incumbent/incumbent.html"></iframe>
+
+<script>
+'use strict';
+
+const loadPromise = new Promise(resolve => {
+ window.addEventListener("load", () => resolve());
+});
+
+promise_test(() => {
+ return loadPromise.then(() => {
+ const res = frames[0].createRedirectResponse("url");
+
+ assert_equals(res.headers.get("Location"), new URL("current/url", location.href).href);
+ });
+}, "should parse the redirect Location URL relative to the current settings object");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/fetch/api/response/response-clone.html b/tests/wpt/web-platform-tests/fetch/api/response/response-clone.html
index 1efb4da5eef..2eeb78c4c24 100644
--- a/tests/wpt/web-platform-tests/fetch/api/response/response-clone.html
+++ b/tests/wpt/web-platform-tests/fetch/api/response/response-clone.html
@@ -93,6 +93,44 @@
});
}, 'Cancelling stream should not affect cloned one');
+function testReadableStreamClone(initialBuffer, bufferType)
+{
+ promise_test(function(test) {
+ var response = new Response(new ReadableStream({start : function(controller) {
+ controller.enqueue(initialBuffer);
+ controller.close();
+ }}));
+
+ var clone = response.clone();
+ var stream1 = response.body;
+ var stream2 = clone.body;
+
+ var buffer;
+ return stream1.getReader().read().then(function(data) {
+ assert_false(data.done);
+ assert_true(data.value === initialBuffer, "Buffer of being-cloned response stream is the same as the original buffer");
+ return stream2.getReader().read();
+ }).then(function(data) {
+ assert_false(data.done);
+ assert_array_equals(data.value, initialBuffer, "Cloned buffer chunks have the same content");
+ assert_equals(Object.getPrototypeOf(data.value), Object.getPrototypeOf(initialBuffer), "Cloned buffers have the same type");
+ assert_true(data.value !== initialBuffer, "Buffer of cloned response stream is a clone of the original buffer");
+ });
+ }, "Check response clone use structureClone for teed ReadableStreams (" + bufferType + "chunk)");
+}
+
+var arrayBuffer = new ArrayBuffer(16);
+testReadableStreamClone(new Int8Array(arrayBuffer, 1), "Int8Array");
+testReadableStreamClone(new Int16Array(arrayBuffer, 2, 2), "Int16Array");
+testReadableStreamClone(new Int32Array(arrayBuffer), "Int32Array");
+testReadableStreamClone(arrayBuffer, "ArrayBuffer");
+testReadableStreamClone(new Uint8Array(arrayBuffer), "Uint8Array");
+testReadableStreamClone(new Uint8ClampedArray(arrayBuffer), "Uint8ClampedArray");
+testReadableStreamClone(new Uint16Array(arrayBuffer, 2), "Uint16Array");
+testReadableStreamClone(new Uint32Array(arrayBuffer), "Uint32Array");
+testReadableStreamClone(new Float32Array(arrayBuffer), "Float32Array");
+testReadableStreamClone(new Float64Array(arrayBuffer), "Float64Array");
+testReadableStreamClone(new DataView(arrayBuffer, 2, 8), "DataView");
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/response/response-consume-empty.html b/tests/wpt/web-platform-tests/fetch/api/response/response-consume-empty.html
index 78838469933..faa443b5e30 100644
--- a/tests/wpt/web-platform-tests/fetch/api/response/response-consume-empty.html
+++ b/tests/wpt/web-platform-tests/fetch/api/response/response-consume-empty.html
@@ -93,11 +93,13 @@
}, "Consume empty " + bodyType + " response body as " + (asText ? "text" : "arrayBuffer"));
}
- // FIXME: Add BufferSource, FormData and URLSearchParams.
checkResponseWithEmptyBody("blob", new Blob([], { "type" : "text/plain" }), false);
checkResponseWithEmptyBody("text", "", false);
checkResponseWithEmptyBody("blob", new Blob([], { "type" : "text/plain" }), true);
checkResponseWithEmptyBody("text", "", true);
+ checkResponseWithEmptyBody("URLSearchParams", new URLSearchParams(""), true);
+ checkResponseWithEmptyBody("FormData", new FormData(), true);
+ checkResponseWithEmptyBody("ArrayBuffer", new ArrayBuffer(), true);
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/response/response-consume-stream.html b/tests/wpt/web-platform-tests/fetch/api/response/response-consume-stream.html
index f96192fa980..54d55fcb45f 100644
--- a/tests/wpt/web-platform-tests/fetch/api/response/response-consume-stream.html
+++ b/tests/wpt/web-platform-tests/fetch/api/response/response-consume-stream.html
@@ -28,6 +28,8 @@ var formData = new FormData();
formData.append("name", "value");
var textData = JSON.stringify("This is response's body");
var blob = new Blob([textData], { "type" : "text/plain" });
+var urlSearchParamsData = "name=value";
+var urlSearchParams = new URLSearchParams(urlSearchParamsData);
promise_test(function(test) {
var response = new Response(blob);
@@ -40,6 +42,11 @@ promise_test(function(test) {
}, "Read text response's body as readableStream");
promise_test(function(test) {
+ var response = new Response(urlSearchParams);
+ return validateStreamFromString(response.body.getReader(), urlSearchParamsData);
+}, "Read URLSearchParams response's body as readableStream");
+
+promise_test(function(test) {
var arrayBuffer = new ArrayBuffer(textData.length);
var int8Array = new Int8Array(arrayBuffer);
for (var cptr = 0; cptr < textData.length; cptr++)
diff --git a/tests/wpt/web-platform-tests/fetch/api/response/response-consume.html b/tests/wpt/web-platform-tests/fetch/api/response/response-consume.html
index 56e234248c3..dc7239424db 100644
--- a/tests/wpt/web-platform-tests/fetch/api/response/response-consume.html
+++ b/tests/wpt/web-platform-tests/fetch/api/response/response-consume.html
@@ -12,17 +12,49 @@
</head>
<body>
<script>
- function checkBodyText(response, expectedBody) {
+ function responsePromise(body, responseInit) {
+ return new Promise(function(resolve, reject) {
+ resolve(new Response(body, responseInit));
+ });
+ }
+
+ function responseStringToMultipartFormTextData(response, name, value) {
+ assert_true(response.headers.has("Content-Type"), "Response contains Content-Type header");
+ var boundaryMatches = response.headers.get("Content-Type").match(/;\s*boundary=("?)([^";\s]*)\1/);
+ assert_true(!!boundaryMatches, "Response contains boundary parameter");
+ return stringToMultipartFormTextData(boundaryMatches[2], name, value);
+ }
+
+ function streamResponsePromise(streamData, responseInit) {
+ return new Promise(function(resolve, reject) {
+ var stream = new ReadableStream({
+ start: function(controller) {
+ controller.enqueue(stringToArray(streamData));
+ controller.close();
+ }
+ });
+ resolve(new Response(stream, responseInit));
+ });
+ }
+
+ function stringToMultipartFormTextData(multipartBoundary, name, value) {
+ return ('--' + multipartBoundary + '\r\n' +
+ 'Content-Disposition: form-data;name="' + name + '"\r\n' +
+ '\r\n' +
+ value + '\r\n' +
+ '--' + multipartBoundary + '--\r\n');
+ }
+
+ function checkBodyText(test, response, expectedBody) {
return response.text().then( function(bodyAsText) {
assert_equals(bodyAsText, expectedBody, "Retrieve and verify response's body");
assert_true(response.bodyUsed, "body as text: bodyUsed turned true");
});
}
- function checkBodyBlob(response, expectedBody, checkContentType) {
+ function checkBodyBlob(test, response, expectedBody, expectedType) {
return response.blob().then(function(bodyAsBlob) {
- if (checkContentType)
- assert_equals(bodyAsBlob.type, "text/plain", "Blob body type should be computed from the response Content-Type");
+ assert_equals(bodyAsBlob.type, expectedType || "text/plain", "Blob body type should be computed from the response Content-Type");
var promise = new Promise( function (resolve, reject) {
var reader = new FileReader();
@@ -41,14 +73,14 @@
});
}
- function checkBodyArrayBuffer(response, expectedBody) {
+ function checkBodyArrayBuffer(test, response, expectedBody) {
return response.arrayBuffer().then( function(bodyAsArrayBuffer) {
validateBufferFromString(bodyAsArrayBuffer, expectedBody, "Retrieve and verify response's body");
assert_true(response.bodyUsed, "body as arrayBuffer: bodyUsed turned true");
});
}
- function checkBodyJSON(response, expectedBody) {
+ function checkBodyJSON(test, response, expectedBody) {
return response.json().then(function(bodyAsJSON) {
var strBody = JSON.stringify(bodyAsJSON)
assert_equals(strBody, expectedBody, "Retrieve and verify response's body");
@@ -56,75 +88,122 @@
});
}
- function checkBodyFormData(response, expectedBody) {
+ function checkBodyFormDataMultipart(test, response, expectedBody) {
return response.formData().then(function(bodyAsFormData) {
assert_true(bodyAsFormData instanceof FormData, "Should receive a FormData");
+ var entryName = "name";
+ var strBody = responseStringToMultipartFormTextData(response, entryName, bodyAsFormData.get(entryName));
+ assert_equals(strBody, expectedBody, "Retrieve and verify response's body");
assert_true(response.bodyUsed, "body as formData: bodyUsed turned true");
});
}
- function checkResponseBody(body, bodyType, checkFunction) {
- promise_test(function(test) {
- var response = new Response(body, { "headers": [["Content-Type", "text/PLAIN"]] });
- assert_false(response.bodyUsed, "bodyUsed is false at init");
- return checkFunction(response, body);
- }, "Consume response's body as " + bodyType);
+ function checkBodyFormDataUrlencoded(test, response, expectedBody) {
+ return response.formData().then(function(bodyAsFormData) {
+ assert_true(bodyAsFormData instanceof FormData, "Should receive a FormData");
+ var entryName = "name";
+ var strBody = entryName + "=" + bodyAsFormData.get(entryName);
+ assert_equals(strBody, expectedBody, "Retrieve and verify response's body");
+ assert_true(response.bodyUsed, "body as formData: bodyUsed turned true");
+ });
}
- var formData = new FormData();
- formData.append("name", "value");
- var textData = JSON.stringify("This is response's body");
- var blob = new Blob([textData], { "type" : "text/plain" });
-
- checkResponseBody(textData, "text", checkBodyText);
- checkResponseBody(textData, "blob", function(response, body) { checkBodyBlob(response, body, true); });
- checkResponseBody(textData, "arrayBuffer", checkBodyArrayBuffer);
- checkResponseBody(textData, "json", checkBodyJSON);
- checkResponseBody(formData, "formData", checkBodyFormData);
-
- function checkBlobResponseBody(blobBody, blobData, bodyType, checkFunction) {
- promise_test(function(test) {
- var response = new Response(blobBody);
- assert_false(response.bodyUsed, "bodyUsed is false at init");
- return checkFunction(response, blobData);
- }, "Consume blob response's body as " + bodyType);
+ function checkBodyFormDataError(test, response, expectedBody) {
+ return promise_rejects(test, new TypeError(), response.formData()).then(function() {
+ assert_true(response.bodyUsed, "body as formData: bodyUsed turned true");
+ });
}
- checkBlobResponseBody(blob, textData, "blob", checkBodyBlob);
- checkBlobResponseBody(blob, textData, "text", checkBodyText);
- checkBlobResponseBody(blob, textData, "json", checkBodyJSON);
- checkBlobResponseBody(blob, textData, "arrayBuffer", checkBodyArrayBuffer);
-
- function checkReadableStreamResponseBody(streamData, bodyType, checkFunction) {
+ function checkResponseBody(responsePromise, expectedBody, checkFunction, bodyTypes) {
promise_test(function(test) {
- var stream = new ReadableStream({
- start: function(controller) {
- controller.enqueue((stringToArray(streamData)));
- controller.close();
- }
+ return responsePromise.then(function(response) {
+ assert_false(response.bodyUsed, "bodyUsed is false at init");
+ return checkFunction(test, response, expectedBody);
});
- var response = new Response(stream);
- assert_false(response.bodyUsed, "bodyUsed is false at init");
- return checkFunction(response, streamData);
- }, "Consume stream response's body as " + bodyType);
+ }, "Consume response's body: " + bodyTypes);
}
- checkReadableStreamResponseBody(textData, "blob", checkBodyBlob);
- checkReadableStreamResponseBody(textData, "text", checkBodyText);
- checkReadableStreamResponseBody(textData, "json", checkBodyJSON);
- checkReadableStreamResponseBody(textData, "arrayBuffer", checkBodyArrayBuffer);
+ var textData = JSON.stringify("This is response's body");
+ var textResponseInit = { "headers": [["Content-Type", "text/PLAIN"]] };
+ var blob = new Blob([textData], { "type": "application/octet-stream" });
+ var multipartBoundary = "boundary-" + Math.random();
+ var formData = new FormData();
+ var formTextResponseInit = { "headers": [["Content-Type", 'multipart/FORM-data; boundary="' + multipartBoundary + '"']] };
+ var formTextData = stringToMultipartFormTextData(multipartBoundary, "name", textData);
+ var formBlob = new Blob([formTextData]);
+ var urlSearchParamsData = "name=value";
+ var urlSearchParams = new URLSearchParams(urlSearchParamsData);
+ var urlSearchParamsType = "application/x-www-form-urlencoded;charset=UTF-8";
+ var urlSearchParamsResponseInit = { "headers": [["Content-Type", urlSearchParamsType]] };
+ var urlSearchParamsBlob = new Blob([urlSearchParamsData], { "type": urlSearchParamsType });
+ formData.append("name", textData);
+
+ checkResponseBody(responsePromise(textData, textResponseInit), textData, checkBodyText, "from text to text");
+ checkResponseBody(responsePromise(textData, textResponseInit), textData, checkBodyBlob, "from text to blob");
+ checkResponseBody(responsePromise(textData, textResponseInit), textData, checkBodyArrayBuffer, "from text to arrayBuffer");
+ checkResponseBody(responsePromise(textData, textResponseInit), textData, checkBodyJSON, "from text to json");
+ checkResponseBody(responsePromise(formTextData, formTextResponseInit), formTextData, checkBodyFormDataMultipart, "from text with correct multipart type to formData");
+ checkResponseBody(responsePromise(formTextData, textResponseInit), undefined, checkBodyFormDataError, "from text without correct multipart type to formData (error case)");
+ checkResponseBody(responsePromise(urlSearchParamsData, urlSearchParamsResponseInit), urlSearchParamsData, checkBodyFormDataUrlencoded, "from text with correct urlencoded type to formData");
+ checkResponseBody(responsePromise(urlSearchParamsData, textResponseInit), undefined, checkBodyFormDataError, "from text without correct urlencoded type to formData (error case)");
+
+ checkResponseBody(responsePromise(blob, textResponseInit), textData, checkBodyBlob, "from blob to blob");
+ checkResponseBody(responsePromise(blob), textData, checkBodyText, "from blob to text");
+ checkResponseBody(responsePromise(blob), textData, checkBodyArrayBuffer, "from blob to arrayBuffer");
+ checkResponseBody(responsePromise(blob), textData, checkBodyJSON, "from blob to json");
+ checkResponseBody(responsePromise(formBlob, formTextResponseInit), formTextData, checkBodyFormDataMultipart, "from blob with correct multipart type to formData");
+ checkResponseBody(responsePromise(formBlob, textResponseInit), undefined, checkBodyFormDataError, "from blob without correct multipart type to formData (error case)");
+ checkResponseBody(responsePromise(urlSearchParamsBlob, urlSearchParamsResponseInit), urlSearchParamsData, checkBodyFormDataUrlencoded, "from blob with correct urlencoded type to formData");
+ checkResponseBody(responsePromise(urlSearchParamsBlob, textResponseInit), undefined, checkBodyFormDataError, "from blob without correct urlencoded type to formData (error case)");
- function checkFetchedResponseBody(bodyType, checkFunction) {
- return promise_test(function(test) {
- return fetch("../resources/top.txt").then(function(response) {
+ function checkFormDataResponseBody(responsePromise, expectedName, expectedValue, checkFunction, bodyTypes) {
+ promise_test(function(test) {
+ return responsePromise.then(function(response) {
assert_false(response.bodyUsed, "bodyUsed is false at init");
- return checkFunction(response, "top");
+ var expectedBody = responseStringToMultipartFormTextData(response, expectedName, expectedValue);
+ return Promise.resolve().then(function() {
+ if (checkFunction === checkBodyFormDataMultipart)
+ return expectedBody;
+ // Modify expectedBody to use the same spacing for
+ // Content-Disposition parameters as Response and FormData does.
+ var response2 = new Response(formData);
+ return response2.text().then(function(formDataAsText) {
+ var reName = /[ \t]*;[ \t]*name=/;
+ var nameMatches = formDataAsText.match(reName);
+ return expectedBody.replace(reName, nameMatches[0]);
+ });
+ }).then(function(expectedBody) {
+ return checkFunction(test, response, expectedBody);
+ });
});
- }, "Consume fetched response's body as " + bodyType);
+ }, "Consume response's body: " + bodyTypes);
}
- checkFetchedResponseBody("blob", checkBodyBlob);
- checkFetchedResponseBody("text", checkBodyText);
- checkFetchedResponseBody("arrayBuffer", checkBodyArrayBuffer);
+
+ checkFormDataResponseBody(responsePromise(formData), "name", textData, checkBodyFormDataMultipart, "from FormData to formData");
+ checkResponseBody(responsePromise(formData, textResponseInit), undefined, checkBodyFormDataError, "from FormData without correct type to formData (error case)");
+ checkFormDataResponseBody(responsePromise(formData), "name", textData, function(test, response, expectedBody) { return checkBodyBlob(test, response, expectedBody, response.headers.get('Content-Type').toLowerCase()); }, "from FormData to blob");
+ checkFormDataResponseBody(responsePromise(formData), "name", textData, checkBodyText, "from FormData to text");
+ checkFormDataResponseBody(responsePromise(formData), "name", textData, checkBodyArrayBuffer, "from FormData to arrayBuffer");
+
+ checkResponseBody(responsePromise(urlSearchParams), urlSearchParamsData, checkBodyFormDataUrlencoded, "from URLSearchParams to formData");
+ checkResponseBody(responsePromise(urlSearchParams, textResponseInit), urlSearchParamsData, checkBodyFormDataError, "from URLSearchParams without correct type to formData (error case)");
+ checkResponseBody(responsePromise(urlSearchParams), urlSearchParamsData, function(test, response, expectedBody) { return checkBodyBlob(test, response, expectedBody, "application/x-www-form-urlencoded;charset=utf-8"); }, "from URLSearchParams to blob");
+ checkResponseBody(responsePromise(urlSearchParams), urlSearchParamsData, checkBodyText, "from URLSearchParams to text");
+ checkResponseBody(responsePromise(urlSearchParams), urlSearchParamsData, checkBodyArrayBuffer, "from URLSearchParams to arrayBuffer");
+
+ checkResponseBody(streamResponsePromise(textData, textResponseInit), textData, checkBodyBlob, "from stream to blob");
+ checkResponseBody(streamResponsePromise(textData), textData, checkBodyText, "from stream to text");
+ checkResponseBody(streamResponsePromise(textData), textData, checkBodyArrayBuffer, "from stream to arrayBuffer");
+ checkResponseBody(streamResponsePromise(textData), textData, checkBodyJSON, "from stream to json");
+ checkResponseBody(streamResponsePromise(formTextData, formTextResponseInit), formTextData, checkBodyFormDataMultipart, "from stream with correct multipart type to formData");
+ checkResponseBody(streamResponsePromise(formTextData), formTextData, checkBodyFormDataError, "from stream without correct multipart type to formData (error case)");
+ checkResponseBody(streamResponsePromise(urlSearchParamsData, urlSearchParamsResponseInit), urlSearchParamsData, checkBodyFormDataUrlencoded, "from stream with correct urlencoded type to formData");
+ checkResponseBody(streamResponsePromise(urlSearchParamsData), urlSearchParamsData, checkBodyFormDataError, "from stream without correct urlencoded type to formData (error case)");
+
+ checkResponseBody(fetch("../resources/top.txt"), "top", checkBodyBlob, "from fetch to blob");
+ checkResponseBody(fetch("../resources/top.txt"), "top", checkBodyText, "from fetch to text");
+ checkResponseBody(fetch("../resources/top.txt"), "top", checkBodyArrayBuffer, "from fetch to arrayBuffer");
+ checkResponseBody(fetch("../resources/top.txt"), "top", checkBodyFormDataError, "from fetch without correct type to formData (error case)");
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/fonts/math/axisheight5000-verticalarrow14000.woff b/tests/wpt/web-platform-tests/fonts/math/axisheight5000-verticalarrow14000.woff
new file mode 100644
index 00000000000..9f5d59ae6a7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/axisheight5000-verticalarrow14000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/fraction-axisheight7000-rulethickness1000.woff b/tests/wpt/web-platform-tests/fonts/math/fraction-axisheight7000-rulethickness1000.woff
new file mode 100644
index 00000000000..2a9d78cc9d4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/fraction-axisheight7000-rulethickness1000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/fraction-denominatordisplaystylegapmin5000-rulethickness1000.woff b/tests/wpt/web-platform-tests/fonts/math/fraction-denominatordisplaystylegapmin5000-rulethickness1000.woff
new file mode 100644
index 00000000000..e4d381edaf2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/fraction-denominatordisplaystylegapmin5000-rulethickness1000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/fraction-denominatordisplaystyleshiftdown6000-rulethickness1000.woff b/tests/wpt/web-platform-tests/fonts/math/fraction-denominatordisplaystyleshiftdown6000-rulethickness1000.woff
new file mode 100644
index 00000000000..3d90e64302a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/fraction-denominatordisplaystyleshiftdown6000-rulethickness1000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/fraction-denominatorgapmin4000-rulethickness1000.woff b/tests/wpt/web-platform-tests/fonts/math/fraction-denominatorgapmin4000-rulethickness1000.woff
new file mode 100644
index 00000000000..ab648f5eb66
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/fraction-denominatorgapmin4000-rulethickness1000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/fraction-denominatorshiftdown3000-rulethickness1000.woff b/tests/wpt/web-platform-tests/fonts/math/fraction-denominatorshiftdown3000-rulethickness1000.woff
new file mode 100644
index 00000000000..0b7efbaf706
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/fraction-denominatorshiftdown3000-rulethickness1000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/fraction-numeratordisplaystylegapmin8000-rulethickness1000.woff b/tests/wpt/web-platform-tests/fonts/math/fraction-numeratordisplaystylegapmin8000-rulethickness1000.woff
new file mode 100644
index 00000000000..2e910bbf421
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/fraction-numeratordisplaystylegapmin8000-rulethickness1000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/fraction-numeratordisplaystyleshiftup2000-rulethickness1000.woff b/tests/wpt/web-platform-tests/fonts/math/fraction-numeratordisplaystyleshiftup2000-rulethickness1000.woff
new file mode 100644
index 00000000000..920c81eb1bf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/fraction-numeratordisplaystyleshiftup2000-rulethickness1000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/fraction-numeratorgapmin9000-rulethickness1000.woff b/tests/wpt/web-platform-tests/fonts/math/fraction-numeratorgapmin9000-rulethickness1000.woff
new file mode 100644
index 00000000000..1b5d60bb144
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/fraction-numeratorgapmin9000-rulethickness1000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/fraction-numeratorshiftup11000-rulethickness1000.woff b/tests/wpt/web-platform-tests/fonts/math/fraction-numeratorshiftup11000-rulethickness1000.woff
new file mode 100644
index 00000000000..3e70cd29a34
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/fraction-numeratorshiftup11000-rulethickness1000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/fraction-rulethickness10000.woff b/tests/wpt/web-platform-tests/fonts/math/fraction-rulethickness10000.woff
new file mode 100644
index 00000000000..ec69f2424f2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/fraction-rulethickness10000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/largeop-displayoperatorminheight5000.woff b/tests/wpt/web-platform-tests/fonts/math/largeop-displayoperatorminheight5000.woff
new file mode 100644
index 00000000000..53fcc13a160
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/largeop-displayoperatorminheight5000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/limits-lowerlimitbaselinedropmin3000.woff b/tests/wpt/web-platform-tests/fonts/math/limits-lowerlimitbaselinedropmin3000.woff
new file mode 100644
index 00000000000..76395db141c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/limits-lowerlimitbaselinedropmin3000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/limits-lowerlimitgapmin11000.woff b/tests/wpt/web-platform-tests/fonts/math/limits-lowerlimitgapmin11000.woff
new file mode 100644
index 00000000000..df67de52bd0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/limits-lowerlimitgapmin11000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/limits-upperlimitbaselinerisemin5000.woff b/tests/wpt/web-platform-tests/fonts/math/limits-upperlimitbaselinerisemin5000.woff
new file mode 100644
index 00000000000..f5d7b9c84e6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/limits-upperlimitbaselinerisemin5000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/limits-upperlimitgapmin7000.woff b/tests/wpt/web-platform-tests/fonts/math/limits-upperlimitgapmin7000.woff
new file mode 100644
index 00000000000..c88e7a9c709
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/limits-upperlimitgapmin7000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/lineheight5000-typolineheight2300.woff b/tests/wpt/web-platform-tests/fonts/math/lineheight5000-typolineheight2300.woff
new file mode 100644
index 00000000000..09076604c3a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/lineheight5000-typolineheight2300.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/mathvariant-bold-fraktur.woff b/tests/wpt/web-platform-tests/fonts/math/mathvariant-bold-fraktur.woff
new file mode 100644
index 00000000000..20cd8e3b49e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/mathvariant-bold-fraktur.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/mathvariant-bold-italic.woff b/tests/wpt/web-platform-tests/fonts/math/mathvariant-bold-italic.woff
new file mode 100644
index 00000000000..9651fc8fe05
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/mathvariant-bold-italic.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/mathvariant-bold-sans-serif.woff b/tests/wpt/web-platform-tests/fonts/math/mathvariant-bold-sans-serif.woff
new file mode 100644
index 00000000000..24f8f2d40b0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/mathvariant-bold-sans-serif.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/mathvariant-bold-script.woff b/tests/wpt/web-platform-tests/fonts/math/mathvariant-bold-script.woff
new file mode 100644
index 00000000000..3cea7211102
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/mathvariant-bold-script.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/mathvariant-bold.woff b/tests/wpt/web-platform-tests/fonts/math/mathvariant-bold.woff
new file mode 100644
index 00000000000..f35194ef628
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/mathvariant-bold.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/mathvariant-double-struck.woff b/tests/wpt/web-platform-tests/fonts/math/mathvariant-double-struck.woff
new file mode 100644
index 00000000000..ed35ee6d642
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/mathvariant-double-struck.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/mathvariant-fraktur.woff b/tests/wpt/web-platform-tests/fonts/math/mathvariant-fraktur.woff
new file mode 100644
index 00000000000..40adf0d9655
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/mathvariant-fraktur.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/mathvariant-initial.woff b/tests/wpt/web-platform-tests/fonts/math/mathvariant-initial.woff
new file mode 100644
index 00000000000..db0ca9b2272
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/mathvariant-initial.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/mathvariant-italic.woff b/tests/wpt/web-platform-tests/fonts/math/mathvariant-italic.woff
new file mode 100644
index 00000000000..9687f377b32
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/mathvariant-italic.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/mathvariant-looped.woff b/tests/wpt/web-platform-tests/fonts/math/mathvariant-looped.woff
new file mode 100644
index 00000000000..ada1b9e6dec
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/mathvariant-looped.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/mathvariant-monospace.woff b/tests/wpt/web-platform-tests/fonts/math/mathvariant-monospace.woff
new file mode 100644
index 00000000000..fc3f0a49203
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/mathvariant-monospace.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/mathvariant-sans-serif-bold-italic.woff b/tests/wpt/web-platform-tests/fonts/math/mathvariant-sans-serif-bold-italic.woff
new file mode 100644
index 00000000000..05bc8596254
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/mathvariant-sans-serif-bold-italic.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/mathvariant-sans-serif-italic.woff b/tests/wpt/web-platform-tests/fonts/math/mathvariant-sans-serif-italic.woff
new file mode 100644
index 00000000000..dc139bf32ab
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/mathvariant-sans-serif-italic.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/mathvariant-sans-serif.woff b/tests/wpt/web-platform-tests/fonts/math/mathvariant-sans-serif.woff
new file mode 100644
index 00000000000..8ef41f51081
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/mathvariant-sans-serif.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/mathvariant-script.woff b/tests/wpt/web-platform-tests/fonts/math/mathvariant-script.woff
new file mode 100644
index 00000000000..d5c457aae0b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/mathvariant-script.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/mathvariant-stretched.woff b/tests/wpt/web-platform-tests/fonts/math/mathvariant-stretched.woff
new file mode 100644
index 00000000000..470c879ed97
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/mathvariant-stretched.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/mathvariant-tailed.woff b/tests/wpt/web-platform-tests/fonts/math/mathvariant-tailed.woff
new file mode 100644
index 00000000000..d612b1e06db
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/mathvariant-tailed.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/radical-degreebottomraisepercent25-rulethickness1000.woff b/tests/wpt/web-platform-tests/fonts/math/radical-degreebottomraisepercent25-rulethickness1000.woff
new file mode 100644
index 00000000000..6401070d44f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/radical-degreebottomraisepercent25-rulethickness1000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/radical-displaystyleverticalgap7000-rulethickness1000.woff b/tests/wpt/web-platform-tests/fonts/math/radical-displaystyleverticalgap7000-rulethickness1000.woff
new file mode 100644
index 00000000000..0e8b1e0a434
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/radical-displaystyleverticalgap7000-rulethickness1000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/radical-extraascender3000-rulethickness1000.woff b/tests/wpt/web-platform-tests/fonts/math/radical-extraascender3000-rulethickness1000.woff
new file mode 100644
index 00000000000..6c0ca282e95
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/radical-extraascender3000-rulethickness1000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/radical-kernafterdegreeminus5000-rulethickness1000.woff b/tests/wpt/web-platform-tests/fonts/math/radical-kernafterdegreeminus5000-rulethickness1000.woff
new file mode 100644
index 00000000000..24aa4c525a1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/radical-kernafterdegreeminus5000-rulethickness1000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/radical-kernbeforedegree4000-rulethickness1000.woff b/tests/wpt/web-platform-tests/fonts/math/radical-kernbeforedegree4000-rulethickness1000.woff
new file mode 100644
index 00000000000..1fca6f6d85a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/radical-kernbeforedegree4000-rulethickness1000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/radical-rulethickness8000.woff b/tests/wpt/web-platform-tests/fonts/math/radical-rulethickness8000.woff
new file mode 100644
index 00000000000..0863dc3230e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/radical-rulethickness8000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/radical-verticalgap6000-rulethickness1000.woff b/tests/wpt/web-platform-tests/fonts/math/radical-verticalgap6000-rulethickness1000.woff
new file mode 100644
index 00000000000..9808112c7aa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/radical-verticalgap6000-rulethickness1000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/scripts-spaceafterscript3000.woff b/tests/wpt/web-platform-tests/fonts/math/scripts-spaceafterscript3000.woff
new file mode 100644
index 00000000000..44f9ece8570
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/scripts-spaceafterscript3000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/scripts-subscriptbaselinedropmin9000.woff b/tests/wpt/web-platform-tests/fonts/math/scripts-subscriptbaselinedropmin9000.woff
new file mode 100644
index 00000000000..46880c1d0ce
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/scripts-subscriptbaselinedropmin9000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/scripts-subscriptshiftdown6000.woff b/tests/wpt/web-platform-tests/fonts/math/scripts-subscriptshiftdown6000.woff
new file mode 100644
index 00000000000..3565f7aaa8d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/scripts-subscriptshiftdown6000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/scripts-subscripttopmax4000.woff b/tests/wpt/web-platform-tests/fonts/math/scripts-subscripttopmax4000.woff
new file mode 100644
index 00000000000..69cd23de8b5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/scripts-subscripttopmax4000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/scripts-subsuperscriptgapmin11000-superscriptbottommaxwithsubscript3000.woff b/tests/wpt/web-platform-tests/fonts/math/scripts-subsuperscriptgapmin11000-superscriptbottommaxwithsubscript3000.woff
new file mode 100644
index 00000000000..2f9da79063b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/scripts-subsuperscriptgapmin11000-superscriptbottommaxwithsubscript3000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/scripts-subsuperscriptgapmin11000.woff b/tests/wpt/web-platform-tests/fonts/math/scripts-subsuperscriptgapmin11000.woff
new file mode 100644
index 00000000000..d85dfee15e3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/scripts-subsuperscriptgapmin11000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/scripts-superscriptbaselinedropmax10000.woff b/tests/wpt/web-platform-tests/fonts/math/scripts-superscriptbaselinedropmax10000.woff
new file mode 100644
index 00000000000..3f528edfe04
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/scripts-superscriptbaselinedropmax10000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/scripts-superscriptbottommin8000.woff b/tests/wpt/web-platform-tests/fonts/math/scripts-superscriptbottommin8000.woff
new file mode 100644
index 00000000000..f3937e869bc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/scripts-superscriptbottommin8000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/scripts-superscriptshiftup7000.woff b/tests/wpt/web-platform-tests/fonts/math/scripts-superscriptshiftup7000.woff
new file mode 100644
index 00000000000..845afdf2ff3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/scripts-superscriptshiftup7000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/scripts-superscriptshiftupcramped5000.woff b/tests/wpt/web-platform-tests/fonts/math/scripts-superscriptshiftupcramped5000.woff
new file mode 100644
index 00000000000..c85e7f65135
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/scripts-superscriptshiftupcramped5000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/stack-axisheight7000.woff b/tests/wpt/web-platform-tests/fonts/math/stack-axisheight7000.woff
new file mode 100644
index 00000000000..7a9dc5d4cb1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/stack-axisheight7000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/stack-bottomdisplaystyleshiftdown5000.woff b/tests/wpt/web-platform-tests/fonts/math/stack-bottomdisplaystyleshiftdown5000.woff
new file mode 100644
index 00000000000..8761585484b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/stack-bottomdisplaystyleshiftdown5000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/stack-bottomshiftdown6000.woff b/tests/wpt/web-platform-tests/fonts/math/stack-bottomshiftdown6000.woff
new file mode 100644
index 00000000000..96ebce2da51
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/stack-bottomshiftdown6000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/stack-displaystylegapmin4000.woff b/tests/wpt/web-platform-tests/fonts/math/stack-displaystylegapmin4000.woff
new file mode 100644
index 00000000000..a94d6286eab
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/stack-displaystylegapmin4000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/stack-gapmin8000.woff b/tests/wpt/web-platform-tests/fonts/math/stack-gapmin8000.woff
new file mode 100644
index 00000000000..a4428d1d49b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/stack-gapmin8000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/stack-topdisplaystyleshiftup3000.woff b/tests/wpt/web-platform-tests/fonts/math/stack-topdisplaystyleshiftup3000.woff
new file mode 100644
index 00000000000..556226f1226
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/stack-topdisplaystyleshiftup3000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/stack-topshiftup9000.woff b/tests/wpt/web-platform-tests/fonts/math/stack-topshiftup9000.woff
new file mode 100644
index 00000000000..d036e893087
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/stack-topshiftup9000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/stretchstack-bottomshiftdown3000.woff b/tests/wpt/web-platform-tests/fonts/math/stretchstack-bottomshiftdown3000.woff
new file mode 100644
index 00000000000..275a4350c91
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/stretchstack-bottomshiftdown3000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/stretchstack-gapabovemin7000.woff b/tests/wpt/web-platform-tests/fonts/math/stretchstack-gapabovemin7000.woff
new file mode 100644
index 00000000000..af61d8ed329
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/stretchstack-gapabovemin7000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/stretchstack-gapbelowmin11000.woff b/tests/wpt/web-platform-tests/fonts/math/stretchstack-gapbelowmin11000.woff
new file mode 100644
index 00000000000..8900a81419f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/stretchstack-gapbelowmin11000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/stretchstack-topshiftup5000.woff b/tests/wpt/web-platform-tests/fonts/math/stretchstack-topshiftup5000.woff
new file mode 100644
index 00000000000..7a90c74f3e5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/stretchstack-topshiftup5000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/underover-accentbaseheight4000-overbarextraascender3000.woff b/tests/wpt/web-platform-tests/fonts/math/underover-accentbaseheight4000-overbarextraascender3000.woff
new file mode 100644
index 00000000000..2aa7133879b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/underover-accentbaseheight4000-overbarextraascender3000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/underover-accentbaseheight4000-overbarverticalgap11000.woff b/tests/wpt/web-platform-tests/fonts/math/underover-accentbaseheight4000-overbarverticalgap11000.woff
new file mode 100644
index 00000000000..0f975115d93
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/underover-accentbaseheight4000-overbarverticalgap11000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/underover-accentbaseheight4000-underbarextradescender5000.woff b/tests/wpt/web-platform-tests/fonts/math/underover-accentbaseheight4000-underbarextradescender5000.woff
new file mode 100644
index 00000000000..bb3e4658d8c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/underover-accentbaseheight4000-underbarextradescender5000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/underover-accentbaseheight4000-underbarverticalgap7000.woff b/tests/wpt/web-platform-tests/fonts/math/underover-accentbaseheight4000-underbarverticalgap7000.woff
new file mode 100644
index 00000000000..36a4e869d11
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/underover-accentbaseheight4000-underbarverticalgap7000.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/math/xheight500.woff b/tests/wpt/web-platform-tests/fonts/math/xheight500.woff
new file mode 100644
index 00000000000..76a37da9e40
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/math/xheight500.woff
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-manual.html
new file mode 100644
index 00000000000..3b0d283978a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-manual.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<title>Document.exitFullscreen()</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<div id="log"></div>
+<script>
+async_test(function(t)
+{
+ trusted_request(document.querySelector("div"));
+
+ document.addEventListener("fullscreenchange", t.step_func(function()
+ {
+ if (document.fullscreenElement) {
+ document.exitFullscreen();
+ } else {
+ assert_equals(event.target, document, "event.target");
+ assert_false(event.bubbles, "event.bubbles");
+ assert_false(event.cancelable, "event.cancelable");
+ t.done();
+ }
+ }));
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/document-fullscreen-element-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/document-fullscreen-element-manual.html
new file mode 100644
index 00000000000..473bdbb0f61
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/api/document-fullscreen-element-manual.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<title>Document.fullscreenElement</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<div id="log"></div>
+<script>
+async_test(function(t)
+{
+ var div = document.querySelector("div");
+
+ document.onfullscreenchange = t.step_func(function()
+ {
+ assert_equals(document.fullscreenElement, div, "fullscreenElement before exitFullscreen()");
+ document.exitFullscreen();
+ assert_equals(document.fullscreenElement, div, "fullscreenElement after exitFullscreen()");
+
+ document.onfullscreenchange = t.step_func(function()
+ {
+ assert_equals(document.fullscreenElement, null, "fullscreenElement after exiting fullscreen");
+ t.done();
+ });
+ });
+
+ trusted_click(t.step_func(function()
+ {
+ assert_equals(document.fullscreenElement, null, "fullscreenElement before requestFullscreen()");
+ div.requestFullscreen();
+ assert_equals(document.fullscreenElement, null, "fullscreenElement after requestFullscreen()");
+ }), document.body);
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/document-onfullscreenchange-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/document-onfullscreenchange-manual.html
new file mode 100644
index 00000000000..d77872ffb58
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/api/document-onfullscreenchange-manual.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<title>Document.onfullscreenchange</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<div id="log"></div>
+<script>
+async_test(function(t)
+{
+ var div = document.querySelector("div");
+ assert_equals(document.onfullscreenchange, null, "initial onfullscreenchange");
+ document.onfullscreenchange = t.step_func_done();
+ trusted_request(div);
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-containing-iframe-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-containing-iframe-manual.html
new file mode 100644
index 00000000000..a630fe2e8fa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-containing-iframe-manual.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<title>Element ready check for containing iframe</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<div id="log"></div>
+<iframe allowfullscreen></iframe>
+<iframe allowfullscreen></iframe>
+<script>
+async_test(function(t)
+{
+ var iframes = document.getElementsByTagName("iframe");
+ trusted_request(iframes[0].contentDocument.body, document.body);
+ iframes[0].contentDocument.onfullscreenchange = t.step_func(function()
+ {
+ trusted_request(iframes[1].contentDocument.body, iframes[0].contentDocument.body);
+ iframes[1].contentDocument.onfullscreenchange = t.unreached_func("fullscreenchange event");
+ iframes[1].contentDocument.onfullscreenerror = t.step_func_done();
+ });
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-enabled-flag-not-set-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-enabled-flag-not-set-manual.html
new file mode 100644
index 00000000000..501767dd629
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-enabled-flag-not-set-manual.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<title>Element ready check with enabled flag not set</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<div id="log"></div>
+<iframe></iframe>
+<script>
+async_test(function(t)
+{
+ var iframe = document.querySelector("iframe");
+ document.onfullscreenchange = t.unreached_func("document fullscreenchange event");
+ document.onfullscreenerror = t.unreached_func("document fullscreenerror event");
+ iframe.contentDocument.onfullscreenchange = t.unreached_func("iframe fullscreenchange event");
+ iframe.contentDocument.onfullscreenerror = t.step_func_done();
+ assert_false(iframe.contentDocument.fullscreenEnabled, "fullscreen enabled flag");
+ trusted_request(iframe.contentDocument.body, document.body);
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-fullscreen-element-sibling-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-fullscreen-element-sibling-manual.html
new file mode 100644
index 00000000000..82672cbfd60
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-fullscreen-element-sibling-manual.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<title>Element ready check for sibling of fullscreen element</title>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<div id="log"></div>
+<div id="a"></div>
+<div id="b"></div>
+<script>
+async_test(function(t)
+{
+ var a = document.getElementById("a");
+ var b = document.getElementById("b");
+ document.onfullscreenchange = t.step_func(function()
+ {
+ assert_equals(document.fullscreenElement, a, "fullscreen element");
+ trusted_request(b, a);
+ document.onfullscreenchange = t.unreached_func("second fullscreenchange event");
+ document.onfullscreenerror = t.step_func_done();
+ });
+ trusted_request(a);
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-fullscreen-iframe-child-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-fullscreen-iframe-child-manual.html
new file mode 100644
index 00000000000..598fcfecf95
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-fullscreen-iframe-child-manual.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<title>Element ready check for child of a fullscreen iframe</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<div id="log"></div>
+<iframe><!-- script inserts div here --></iframe>
+<script>
+// Verify that an iframe can itself go fullscreen, and that this doesn't
+// influence the iframe ancestor test of the element ready check.
+async_test(function(t)
+{
+ var iframe = document.querySelector("iframe");
+ document.onfullscreenchange = t.step_func(function()
+ {
+ assert_equals(document.fullscreenElement, iframe, "fullscreen element");
+ var div = document.createElement("div");
+ // This adds the div to the iframe element itself, not to the iframe's
+ // contentDocument. It's done here because the HTML parser treats the
+ // content of iframe as a text node.
+ iframe.appendChild(div);
+ trusted_request(div, iframe.contentDocument.body);
+ document.onfullscreenchange = t.unreached_func("second fullscreenchange event");
+ document.onfullscreenerror = t.step_func_done();
+ });
+ trusted_request(iframe);
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-iframe-child-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-iframe-child-manual.html
new file mode 100644
index 00000000000..0c1dd29a1e6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-iframe-child-manual.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<title>Element ready check for child of iframe</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<div id="log"></div>
+<iframe><!-- script inserts child here --></iframe>
+<script>
+async_test(function(t)
+{
+ var div = document.createElement("div");
+ document.querySelector("iframe").appendChild(div);
+ document.onfullscreenchange = t.unreached_func("fullscreenchange event");
+ document.onfullscreenerror = t.step_func_done();
+ trusted_request(div, document.body);
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-not-in-document-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-not-in-document-manual.html
new file mode 100644
index 00000000000..904d319908d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-not-in-document-manual.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<title>Element ready check for element not in a document</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<div id="log"></div>
+<script>
+async_test(function(t)
+{
+ var div = document.createElement("div");
+ document.onfullscreenchange = t.unreached_func("fullscreenchange event");
+ document.onfullscreenerror = t.step_func_done();
+ trusted_request(div, document.body);
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-manual.html
new file mode 100644
index 00000000000..81bd6a05e34
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-manual.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<title>Element.requestFullscreen()</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<div id="log"></div>
+<script>
+async_test(function(t)
+{
+ var div = document.querySelector("div");
+
+ document.addEventListener("fullscreenchange", t.step_func(function(event)
+ {
+ assert_equals(event.target, document, "event.target");
+ assert_false(event.bubbles, "event.bubbles");
+ assert_false(event.cancelable, "event.cancelable");
+ t.done();
+ }));
+
+ trusted_request(div);
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-non-top-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-non-top-manual.html
new file mode 100644
index 00000000000..88eff090abe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-non-top-manual.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<title>Element.requestFullscreen() for non-top element in fullscreen element stack</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<div id="log"></div>
+<div id="first">
+ <div id="last"></div>
+</div>
+<script>
+async_test(function(t)
+{
+ var first = document.getElementById("first");
+ trusted_request(first);
+ document.onfullscreenchange = t.step_func(function()
+ {
+ assert_equals(document.fullscreenElement, first);
+ var last = document.getElementById("last");
+ trusted_request(last);
+ document.onfullscreenchange = t.step_func(function()
+ {
+ assert_equals(document.fullscreenElement, last);
+ trusted_request(first, last);
+ document.onfullscreenerror = t.step_func_done();
+ });
+ });
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-svg-rect-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-svg-rect-manual.html
new file mode 100644
index 00000000000..5661bfef760
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-svg-rect-manual.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<title>Element.requestFullscreen() for SVG rect element</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<div id="log"></div>
+<svg><rect/></svg>
+<script>
+async_test(function(t)
+{
+ var rect = document.querySelector("rect");
+ assert_true(rect instanceof SVGRectElement);
+ trusted_request(rect, document.body);
+ document.onfullscreenchange = t.unreached_func("fullscreenerror event");
+ document.onfullscreenerror = t.step_func_done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-svg-svg-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-svg-svg-manual.html
new file mode 100644
index 00000000000..553785d29b9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-svg-svg-manual.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<title>Element.requestFullscreen() for SVG svg element</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<div id="log"></div>
+<svg></svg>
+<script>
+async_test(function(t)
+{
+ var svg = document.querySelector("svg");
+ assert_true(svg instanceof SVGSVGElement);
+ trusted_request(svg, document.body);
+ document.onfullscreenchange = t.step_func_done();
+ document.onfullscreenerror = t.unreached_func("fullscreenerror event");
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-top-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-top-manual.html
new file mode 100644
index 00000000000..3618344409b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-top-manual.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<title>Element.requestFullscreen() for top element in fullscreen element stack</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<div id="log"></div>
+<div id="top"></div>
+<script>
+async_test(function(t)
+{
+ var top = document.getElementById("top");
+ trusted_request(top);
+ document.onfullscreenchange = t.step_func(function()
+ {
+ assert_equals(document.fullscreenElement, top);
+ document.onfullscreenchange = t.unreached_func("fullscreenchange event");
+ trusted_click(t.step_func(function()
+ {
+ top.requestFullscreen();
+ // A fullscreenerror event would be fired after an async section
+ // and an animation frame task, so wait until after that.
+ t.step_timeout(function()
+ {
+ requestAnimationFrame(t.step_func_done());
+ }, 0);
+ }), top);
+ });
+ document.onfullscreenerror = t.unreached_func("fullscreenerror event");
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/model/remove-child-manual.html b/tests/wpt/web-platform-tests/fullscreen/model/remove-child-manual.html
new file mode 100644
index 00000000000..63cc727fb18
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/model/remove-child-manual.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<title>Remove the child of the fullscreen element</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<div id="log"></div>
+<div id="parent">
+ <div></div>
+</div>
+<script>
+async_test(function(t)
+{
+ var parent = document.getElementById("parent");
+ trusted_request(parent);
+ document.onfullscreenchange = t.step_func(function()
+ {
+ assert_equals(document.fullscreenElement, parent);
+ parent.textContent = ""; // removes all children
+ document.onfullscreenchange = t.unreached_func("fullscreenchange event");
+ // A fullscreenchange event would be fired after an async section
+ // and an animation frame task, so wait until after that.
+ t.step_timeout(function()
+ {
+ requestAnimationFrame(t.step_func_done());
+ }, 0);
+ });
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/model/remove-first-manual.html b/tests/wpt/web-platform-tests/fullscreen/model/remove-first-manual.html
new file mode 100644
index 00000000000..5873a1cfc62
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/model/remove-first-manual.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<title>Remove the first element on the fullscreen element stack</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<div id="log"></div>
+<div id="first">
+ <div id="last"></div>
+</div>
+<script>
+async_test(function(t)
+{
+ var first = document.getElementById("first");
+ trusted_request(first);
+ document.onfullscreenchange = t.step_func(function()
+ {
+ assert_equals(document.fullscreenElement, first);
+ var last = document.getElementById("last");
+ trusted_request(last);
+ document.onfullscreenchange = t.step_func(function()
+ {
+ assert_equals(document.fullscreenElement, last);
+ first.remove();
+ document.onfullscreenchange = t.step_func(function()
+ {
+ assert_equals(document.fullscreenElement, null);
+ t.done();
+ });
+ });
+ });
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/model/remove-last-manual.html b/tests/wpt/web-platform-tests/fullscreen/model/remove-last-manual.html
new file mode 100644
index 00000000000..3e52049624d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/model/remove-last-manual.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<title>Remove the last element on the fullscreen element stack</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<div id="log"></div>
+<div id="first">
+ <div id="last"></div>
+</div>
+<script>
+async_test(function(t)
+{
+ var first = document.getElementById("first");
+ trusted_request(first);
+ document.onfullscreenchange = t.step_func(function()
+ {
+ assert_equals(document.fullscreenElement, first);
+ var last = document.getElementById("last");
+ trusted_request(last);
+ document.onfullscreenchange = t.step_func(function()
+ {
+ assert_equals(document.fullscreenElement, last);
+ last.remove();
+ document.onfullscreenchange = t.step_func(function()
+ {
+ assert_equals(document.fullscreenElement, first);
+ t.done();
+ });
+ });
+ });
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/model/remove-parent-manual.html b/tests/wpt/web-platform-tests/fullscreen/model/remove-parent-manual.html
new file mode 100644
index 00000000000..74327637ee9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/model/remove-parent-manual.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<title>Remove the parent of the fullscreen element</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<div id="log"></div>
+<div>
+ <div id="child"></div>
+</div>
+<script>
+async_test(function(t)
+{
+ var child = document.getElementById("child");
+ trusted_request(child);
+ document.onfullscreenchange = t.step_func(function()
+ {
+ assert_equals(document.fullscreenElement, child);
+ child.parentNode.remove();
+ document.onfullscreenchange = t.step_func(function()
+ {
+ assert_equals(document.fullscreenElement, null);
+ t.done();
+ });
+ });
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/model/remove-single-manual.html b/tests/wpt/web-platform-tests/fullscreen/model/remove-single-manual.html
new file mode 100644
index 00000000000..53abb5e82fe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/model/remove-single-manual.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<title>Remove the single element on the fullscreen element stack</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<div id="log"></div>
+<div id="single"></div>
+<script>
+async_test(function(t)
+{
+ var single = document.getElementById("single");
+ document.onfullscreenchange = t.step_func(function()
+ {
+ assert_equals(document.fullscreenElement, single);
+ single.remove();
+ document.onfullscreenchange = t.step_func(function()
+ {
+ assert_equals(document.fullscreenElement, null);
+ t.done();
+ });
+ });
+ trusted_request(single);
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/trusted-click.js b/tests/wpt/web-platform-tests/fullscreen/trusted-click.js
new file mode 100644
index 00000000000..6cd4020f6ed
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/trusted-click.js
@@ -0,0 +1,24 @@
+// Invokes callback from a trusted click event, to satisfy
+// https://html.spec.whatwg.org/#triggered-by-user-activation
+function trusted_click(callback, container)
+{
+ var document = container.ownerDocument;
+ var button = document.createElement("button");
+ button.textContent = "click to continue test";
+ button.style.display = "block";
+ button.style.fontSize = "20px";
+ button.style.padding = "10px";
+ button.onclick = function()
+ {
+ callback();
+ container.removeChild(button);
+ };
+ container.appendChild(button);
+}
+
+// Invokes element.requestFullscreen() from a trusted click.
+function trusted_request(element, container)
+{
+ var request = element.requestFullscreen.bind(element);
+ trusted_click(request, container || element.parentNode);
+}
diff --git a/tests/wpt/web-platform-tests/hr-time/idlharness.html b/tests/wpt/web-platform-tests/hr-time/idlharness.html
index 0b1fd7d3260..729f7381f7b 100644
--- a/tests/wpt/web-platform-tests/hr-time/idlharness.html
+++ b/tests/wpt/web-platform-tests/hr-time/idlharness.html
@@ -19,20 +19,31 @@
interface Window {
};
-interface Performance {
+[Exposed=Worker]
+interface WorkerGlobalScope {
};
-partial interface Window {
- [Replaceable] readonly attribute Performance performance;
-};
</pre>
<pre id='idl'>
typedef double DOMHighResTimeStamp;
-partial interface Performance {
- DOMHighResTimeStamp now();
+[Exposed=(Window,Worker)]
+interface Performance : EventTarget {
+ DOMHighResTimeStamp now();
+ serializer = {attribute};
+};
+
+[NoInterfaceObject,
+ Exposed=(Window,Worker)]
+interface GlobalPerformance {
+ [Replaceable]
+ readonly attribute Performance performance;
};
+
+Window implements GlobalPerformance;
+
+WorkerGlobalScope implements GlobalPerformance;
</pre>
<script>
diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/014.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/014.html
index d084f5829df..605e181858d 100644
--- a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/014.html
+++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/014.html
@@ -4,7 +4,7 @@
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<iframe id="test" name="test"></iframe>
-<form action="javascript:parent.events.push('submit')"></form>
+<form target="test" action="javascript:parent.events.push('submit');"></form>
<a target="test" onclick="document.forms[0].submit()">Test</a>
<script>
var t = async_test(undefined, {timeout:4000});
diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling.html
index 2abf37c317f..621a8cbaecc 100644
--- a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling.html
+++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling.html
@@ -16,6 +16,9 @@
onload = t.step_func_done(function() {
assert_equals(frames[0].document.documentElement.textContent,
"1", "string return should cause navigation");
+ // The rest of the test is disabled for now, until
+ // https://github.com/whatwg/html/issues/1895 gets sorted out
+/*
assert_equals(frames[1].document.documentElement.textContent,
"", "number return should not cause navigation");
assert_equals(frames[2].document.documentElement.textContent,
@@ -28,5 +31,6 @@
"", "null return should not cause navigation");
assert_equals(frames[6].document.documentElement.textContent,
"", "String object return should not cause navigation");
+*/
});
</script>
diff --git a/tests/wpt/web-platform-tests/html/browsers/history/the-history-interface/history_go_to_uri-1.html b/tests/wpt/web-platform-tests/html/browsers/history/the-history-interface/history_go_to_uri-1.html
new file mode 100644
index 00000000000..46c744e95d6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/history/the-history-interface/history_go_to_uri-1.html
@@ -0,0 +1,23 @@
+<!doctype html>
+<script src="history.js"></script>
+<script>
+ onunload = function() {}
+
+ onload = function() {
+ if (!opener.started) {
+ queue_next();
+ } else {
+ opener.pages.push(id);
+ opener.start_test_wait();
+ if (!opener.gone) {
+ // This is meant to test that passing a string is not supported.
+ // According to the spec, the value passed to 'go' must be an int.
+ // Internet Explorer supports passing a string and will navigate
+ // to that Url. This test will protect against regressing in
+ // this area and reverting back to IE's incorrect behavior.
+ history.go("history_entry.html");
+ opener.gone = true;
+ }
+ }
+ };
+</script>
diff --git a/tests/wpt/web-platform-tests/html/browsers/history/the-history-interface/history_go_to_uri.html b/tests/wpt/web-platform-tests/html/browsers/history/the-history-interface/history_go_to_uri.html
new file mode 100644
index 00000000000..6b5ebf1bffa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/history/the-history-interface/history_go_to_uri.html
@@ -0,0 +1,32 @@
+<!doctype html>
+<title>history.go() negative tests</title>
+<link rel="author" title="John Jansen" href="mailto:johnjan@microsoft.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/browsers.html#dom-history-go">
+<meta charset="utf-8">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+ var t = async_test(undefined, {timeout:5000});
+ started = false;
+ gone = false;
+ pages = []
+ timer = null;
+ start_test_wait = t.step_func(
+ function() {
+ clearTimeout(timer);
+ timer = setTimeout(t.step_func(
+ function() {
+ try {
+ assert_array_equals(pages, [3, 2, 2], "Pages opened during history navigation");
+ t.done();
+ } finally {
+ win.close();
+ }
+ }
+ ), 500);
+ }
+ );
+ t.step(function() {win = window.open("history_entry.html?urls=history_go_to_uri-1.html,history_forward-2.html");
+ });
+</script>
diff --git a/tests/wpt/web-platform-tests/html/browsers/history/the-history-interface/non-automated/traverse_the_session_history_unload_prompt_1.html b/tests/wpt/web-platform-tests/html/browsers/history/the-history-interface/non-automated/traverse_the_session_history_unload_prompt_1-manual.html
index 8154e8e4724..8154e8e4724 100644
--- a/tests/wpt/web-platform-tests/html/browsers/history/the-history-interface/non-automated/traverse_the_session_history_unload_prompt_1.html
+++ b/tests/wpt/web-platform-tests/html/browsers/history/the-history-interface/non-automated/traverse_the_session_history_unload_prompt_1-manual.html
diff --git a/tests/wpt/web-platform-tests/html/browsers/history/the-location-interface/location-prototype-setting.html b/tests/wpt/web-platform-tests/html/browsers/history/the-location-interface/location-prototype-setting.html
new file mode 100644
index 00000000000..726aaea23ab
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/history/the-location-interface/location-prototype-setting.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>[[SetPrototypeOf]] on a location object should return false</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+ test(function() {
+ var origProto = Object.getPrototypeOf(location);
+ assert_throws(new TypeError, function() {
+ Object.setPrototypeOf(location, {});
+ });
+ assert_throws(new TypeError, function() {
+ location.__proto__ = {};
+ });
+ assert_false(Reflect.setPrototypeOf(location, {}));
+ assert_equals(Object.getPrototypeOf(location), origProto);
+ });
+</script>
diff --git a/tests/wpt/web-platform-tests/html/browsers/history/the-location-interface/location_hash.html b/tests/wpt/web-platform-tests/html/browsers/history/the-location-interface/location_hash.html
index 91c3f8205d3..74d2d015430 100644
--- a/tests/wpt/web-platform-tests/html/browsers/history/the-location-interface/location_hash.html
+++ b/tests/wpt/web-platform-tests/html/browsers/history/the-location-interface/location_hash.html
@@ -7,6 +7,8 @@
</head>
<body>
<div id="log"></div>
+ <iframe id="srcdoc-iframe"
+ srcdoc="<div style='height: 200vh'></div><div id='test'></div>"></iframe>
<script>
test(function () {
window.history.pushState(1, document.title, '#x=1');
@@ -15,6 +17,17 @@
assert_equals(hash, "#x=1", "hash");
}, "location hash");
+
+ var t = async_test("Setting location.hash on srcdoc iframe");
+ addEventListener("load", t.step_func_done(function() {
+ var frameWin = document.getElementById("srcdoc-iframe").contentWindow;
+ assert_equals(frameWin.location.href, "about:srcdoc");
+ assert_equals(frameWin.scrollY, 0, "Should not have scrolled yet");
+ frameWin.location.hash = "test";
+ assert_equals(frameWin.location.href, "about:srcdoc#test");
+ assert_true(frameWin.scrollY > frameWin.innerHeight,
+ "Should have scrolled by more than one viewport height");
+ }));
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/browsers/history/the-location-interface/security_location_0.sub.htm b/tests/wpt/web-platform-tests/html/browsers/history/the-location-interface/security_location_0.htm
index f509c23b18c..f509c23b18c 100644
--- a/tests/wpt/web-platform-tests/html/browsers/history/the-location-interface/security_location_0.sub.htm
+++ b/tests/wpt/web-platform-tests/html/browsers/history/the-location-interface/security_location_0.htm
diff --git a/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/cross-origin-objects.html b/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/cross-origin-objects.html
index abb5eae4a61..79440e212d5 100644
--- a/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/cross-origin-objects.html
+++ b/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/cross-origin-objects.html
@@ -55,7 +55,7 @@ function addTest(fun, desc) { testList.push([fun, desc]); }
addTest(function() {
// Note: we do not check location.host as its default port semantics are hard to reflect statically
assert_equals(location.hostname, host_info.ORIGINAL_HOST, 'Need to run the top-level test from domain ' + host_info.ORIGINAL_HOST);
- assert_equals(location.port, host_info.HTTP_PORT, 'Need to run the top-level test from port ' + host_info.HTTP_PORT);
+ assert_equals(get_port(location), host_info.HTTP_PORT, 'Need to run the top-level test from port ' + host_info.HTTP_PORT);
assert_equals(B.parent, window, "window.parent works same-origin");
assert_equals(C.parent, window, "window.parent works cross-origin");
assert_equals(B.location.pathname, path, "location.href works same-origin");
diff --git a/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/win-documentdomain.sub.html b/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/win-documentdomain.sub.html
index e05c4d9e5d4..3bfcd0cd1a5 100644
--- a/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/win-documentdomain.sub.html
+++ b/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/win-documentdomain.sub.html
@@ -10,9 +10,9 @@
var path = location.pathname.substring(0, location.pathname.lastIndexOf('/')) + '/frame.html';
A.location = 'frame.html';
- B.location = '//{{domains[www2]}}:' + location.port + path;
- C.location = '//{{domains[www2]}}:' + location.port + path;
- D.location = '//{{domains[www1]}}:' + location.port + path;
+ B.location = '//{{domains[www2]}}:' + get_port(location) + path;
+ C.location = '//{{domains[www2]}}:' + get_port(location) + path;
+ D.location = '//{{domains[www1]}}:' + get_port(location) + path;
var loadCount = 0;
function frameLoaded() {
diff --git a/tests/wpt/web-platform-tests/html/browsers/sandboxing/inner-iframe.html b/tests/wpt/web-platform-tests/html/browsers/sandboxing/inner-iframe.html
new file mode 100644
index 00000000000..229f6b3d852
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/sandboxing/inner-iframe.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <script>
+ window.onload = function() {
+ top.calledFromIframe();
+ }
+ </script>
+ </head>
+ <body>
+ <div id="inner">foo</div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/browsers/sandboxing/sandbox-allow-same-origin.html b/tests/wpt/web-platform-tests/html/browsers/sandboxing/sandbox-allow-same-origin.html
new file mode 100644
index 00000000000..d6b3b099f28
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/sandboxing/sandbox-allow-same-origin.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>DOM access in sandbox="allow-same-origin" iframe</title>
+ <link rel="author" title="Kinuko Yasuda" href="mailto:kinuko@chromium.org">
+ <link rel="help" href="http://www.w3.org/html/wg/drafts/html/master/browsers.html#sandboxing">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+
+ <body>
+ <h1>DOM access in sandbox="allow-same-origin" iframe</h1>
+ <script type="text/javascript">
+ var t = async_test("DOM access in sandbox='allow-same-origin' iframe is allowed")
+ var called = 0;
+ function calledFromIframe() {
+ called++;
+ }
+ function loaded() {
+ assert_equals(document.getElementById('sandboxedframe').contentWindow.document.getElementById('inner').innerHTML, 'foo');
+ assert_equals(called, 0);
+ t.done();
+ }
+ </script>
+
+ <iframe src="/html/browsers/sandboxing/inner-iframe.html" style="visibility:hidden;display:none" sandbox="allow-same-origin" id="sandboxedframe" onload="loaded();"></iframe>
+
+ <div id="log"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/browsers/sandboxing/sandbox-allow-scripts.html b/tests/wpt/web-platform-tests/html/browsers/sandboxing/sandbox-allow-scripts.html
new file mode 100644
index 00000000000..6cf3f5a4a8c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/sandboxing/sandbox-allow-scripts.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Script execution in sandbox="allow-scripts" iframe</title>
+ <link rel="author" title="Kinuko Yasuda" href="mailto:kinuko@chromium.org">
+ <link rel="help" href="http://www.w3.org/html/wg/drafts/html/master/browsers.html#sandboxing">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+
+ <body>
+ <h1>Script execution in sandbox="allow-scripts" iframe</h1>
+ <script type="text/javascript">
+ var t = async_test("Running script from sandbox='allow-scripts' iframe is allowed")
+ var called = 0;
+ function calledFromIframe() {
+ called++;
+ }
+ function loaded() {
+ assert_equals(called, 1);
+ t.done();
+ }
+ </script>
+
+ <iframe src="/html/browsers/sandboxing/inner-iframe.html" style="visibility:hidden;display:none" sandbox="allow-scripts allow-same-origin" id="sandboxedframe" onload="loaded();"></iframe>
+
+ <div id="log"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/browsers/sandboxing/sandbox-disallow-same-origin.html b/tests/wpt/web-platform-tests/html/browsers/sandboxing/sandbox-disallow-same-origin.html
new file mode 100644
index 00000000000..327a1f5e867
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/sandboxing/sandbox-disallow-same-origin.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Access to sandbox iframe</title>
+ <link rel="author" title="Kinuko Yasuda" href="mailto:kinuko@chromium.org">
+ <link rel="help" href="http://www.w3.org/html/wg/drafts/html/master/browsers.html#sandboxing">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+
+ <body>
+ <h1>Access to sandbox iframe</h1>
+ <script type="text/javascript">
+ var t = async_test("Access to sandbox iframe is disallowed")
+ var called = 0;
+ function calledFromIframe() {
+ called++;
+ }
+ function loaded() {
+ assert_equals(document.getElementById('sandboxedframe').contentWindow.document, undefined);
+ assert_equals(called, 0);
+ t.done();
+ }
+ </script>
+
+ <iframe src="/html/browsers/sandboxing/inner-iframe.html" style="visibility:hidden;display:none" sandbox id="sandboxedframe" onload="loaded();"></iframe>
+ </body>
+
+ <div id="log"></div>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/browsers/sandboxing/sandbox-disallow-scripts.html b/tests/wpt/web-platform-tests/html/browsers/sandboxing/sandbox-disallow-scripts.html
new file mode 100644
index 00000000000..1bc116ada46
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/sandboxing/sandbox-disallow-scripts.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Script execution in sandbox iframe</title>
+ <link rel="author" title="Kinuko Yasuda" href="mailto:kinuko@chromium.org">
+ <link rel="help" href="http://www.w3.org/html/wg/drafts/html/master/browsers.html#sandboxing">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+
+ <body>
+ <h1>Script execution in sandbox iframe</h1>
+ <script type="text/javascript">
+ var t = async_test("Running script from sandbox iframe is disallowed")
+ var called = 0;
+ function calledFromIframe() {
+ called++;
+ }
+ function loaded() {
+ assert_equals(called, 0);
+ t.done();
+ }
+ </script>
+
+ <iframe src="/html/browsers/sandboxing/inner-iframe.html" style="visibility:hidden;display:none" sandbox id="sandboxedframe" onload="loaded();"></iframe>
+
+ <div id="log"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/browsers/the-window-object/named-access-on-the-window-object/named-objects.html b/tests/wpt/web-platform-tests/html/browsers/the-window-object/named-access-on-the-window-object/named-objects.html
index 05a831e87a6..f020e0ecbe1 100644
--- a/tests/wpt/web-platform-tests/html/browsers/the-window-object/named-access-on-the-window-object/named-objects.html
+++ b/tests/wpt/web-platform-tests/html/browsers/the-window-object/named-access-on-the-window-object/named-objects.html
@@ -33,30 +33,28 @@ test(function() {
}, "Check if the first nested browsing context is returned by window['c']");
test(function() {
- assert_equals(window['a'].length, 7, "The length should be 7.");
+ assert_equals(window['a'].length, 5, "The length should be 5.");
assert_true(window['a'] instanceof HTMLCollection);
assert_array_equals(window['a'],
- [ document.getElementById('a1'), document.getElementById('app1'),
- document.getElementById('area1'), document.getElementById('embed1'),
+ [ document.getElementById('app1'), document.getElementById('embed1'),
document.getElementById('form1'), document.getElementById('img1'),
document.getElementById('obj1') ],
"The elements are not in tree order.");
- document.getElementById('a1').setAttribute("name", "");
- document.getElementById('area1').setAttribute("name", "");
+ document.getElementById('form1').setAttribute("name", "");
+ document.getElementById('embed1').setAttribute("name", "");
assert_array_equals(window['a'],
- [ document.getElementById('app1'), document.getElementById('embed1'),
- document.getElementById('form1'), document.getElementById('img1'),
+ [ document.getElementById('app1'), document.getElementById('img1'),
document.getElementById('obj1') ],
"Window['a'] should not contain the elements with empty name attribute.");
-}, "Check if window['a'] contains all a, applet, area, embed, form, img, and object elements, and their order");
+}, "Check if window['a'] contains all applet, embed, form, img, and object elements, and their order");
-var t = async_test("Check if window['fs'] return the frameset element with name='fs'");
+var t = async_test("Check that window['fs'] does not return the frameset element with name='fs' (historical)");
function on_load () {
t.step(function () {
assert_equals(document.getElementById('fm2').contentWindow['fs'],
- document.getElementById('fm2').contentDocument.getElementById('fs1'),
- "The frameset element should be returned.");
+ undefined,
+ "The frameset element should not be returned.");
});
t.done();
}
diff --git a/tests/wpt/web-platform-tests/html/browsers/the-window-object/security-window/window-security.sub.html b/tests/wpt/web-platform-tests/html/browsers/the-window-object/security-window/window-security.html
index 9a9ef358ec1..9a9ef358ec1 100644
--- a/tests/wpt/web-platform-tests/html/browsers/the-window-object/security-window/window-security.sub.html
+++ b/tests/wpt/web-platform-tests/html/browsers/the-window-object/security-window/window-security.html
diff --git a/tests/wpt/web-platform-tests/html/browsers/the-window-object/support/noopener-target.html b/tests/wpt/web-platform-tests/html/browsers/the-window-object/support/noopener-target.html
new file mode 100644
index 00000000000..d0d0360260c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/the-window-object/support/noopener-target.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<script>
+ var channelName = location.search.substr(1);
+ var channel = new BroadcastChannel(channelName);
+ channel.postMessage({ name: window.name,
+ haveOpener: window.opener !== null });
+ window.close();
+</script>
diff --git a/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-open-noopener.html b/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-open-noopener.html
new file mode 100644
index 00000000000..808f55e23a4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-open-noopener.html
@@ -0,0 +1,105 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>window.open() with "noopener" tests</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+var testData = [
+ { testDescription: "window.open() with 'noopener' should not reuse existing target",
+ secondWindowFeatureString: "noopener",
+ shouldReuse: false },
+ { testDescription: "noopener needs to be present as a token on its own",
+ secondWindowFeatureString: "noopener=1",
+ shouldReuse: true },
+ { testDescription: "noopener needs to be present as a token on its own again",
+ secondWindowFeatureString: "noopener=0",
+ shouldReuse: true },
+ { testDescription: "noopener needs to be present as a token on its own yet again",
+ secondWindowFeatureString: "make me noopener",
+ shouldReuse: true },
+ { testDescription: "Trailing noopener should work",
+ secondWindowFeatureString: "abc def, \n\r noopener",
+ shouldReuse: false },
+ { testDescription: "Leading noopener should work",
+ secondWindowFeatureString: "noopener \f\t , hey, there",
+ shouldReuse: false },
+ { testDescription: "Interior noopener should work",
+ secondWindowFeatureString: "and now, noopener , hey, there",
+ shouldReuse: false },
+];
+
+var tests = [];
+/**
+ * Loop over our testData array and kick off an async test for each entry. Each
+ * async test opens a window using window.open() with some per-test unique name,
+ * then tries to do a second window.open() call with the same name and the
+ * test-specific feature string. It then checks whether that second
+ * window.open() call reuses the existing window, whether the return value of
+ * the second window.open() call is correct (it should be null in the noopener
+ * cases and non-null in the cases when the existing window gets reused) and so
+ * forth.
+ */
+for (var i = 0; i < testData.length; ++i) {
+ var test = testData[i];
+ var t = async_test(test.testDescription);
+ tests.push(t);
+ t.secondWindowFeatureString = test.secondWindowFeatureString;
+ t.windowName = "someuniquename" + i;
+
+ if (test.shouldReuse) {
+ t.step(function() {
+ var windowName = this.windowName;
+
+ var w1 = window.open("", windowName);
+ this.add_cleanup(function() { w1.close(); });
+
+ assert_equals(w1.opener, window);
+
+ var w2 = window.open("", windowName, this.secondWindowFeatureString);
+ assert_equals(w2, w1);
+ assert_equals(w2.opener, w1.opener);
+ assert_equals(w2.opener, window);
+ this.done();
+ });
+ } else {
+ t.step(function() {
+ var w1;
+ this.add_cleanup(function() { w1.close(); });
+
+ var windowName = this.windowName;
+ var channel = new BroadcastChannel(windowName);
+
+ channel.onmessage = this.step_func_done(function(e) {
+ var data = e.data;
+ assert_equals(data.name, windowName, "Should have the right name");
+ assert_equals(data.haveOpener, false, "Should not have opener");
+ assert_equals(w1.opener, window);
+ assert_equals(w1.location.href, "about:blank");
+ });
+
+ w1 = window.open("", windowName);
+ assert_equals(w1.opener, window);
+
+ var w2 = window.open("support/noopener-target.html?" + windowName,
+ windowName, this.secondWindowFeatureString);
+ assert_equals(w2, null);
+
+ assert_equals(w1.opener, window);
+ });
+ }
+}
+
+/**
+ * Loop over the special targets that ignore noopener and check that doing a
+ * window.open() with those targets correctly reuses the existing window.
+ */
+for (var target of ["_self", "_parent", "_top"]) {
+ var t = async_test("noopener window.open targeting " + target);
+ tests.push(t);
+ t.openedWindow = window.open(`javascript:var w2 = window.open("", "${target}", "noopener"); this.checkValues(w2); this.close(); void(0);`);
+ assert_equals(t.openedWindow.opener, window);
+ t.openedWindow.checkValues = t.step_func_done(function(win) {
+ assert_equals(win, this.openedWindow);
+ });
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/html/browsers/windows/nested-browsing-contexts/frameElement.sub.html b/tests/wpt/web-platform-tests/html/browsers/windows/nested-browsing-contexts/frameElement.html
index f1d5581f689..f1d5581f689 100644
--- a/tests/wpt/web-platform-tests/html/browsers/windows/nested-browsing-contexts/frameElement.sub.html
+++ b/tests/wpt/web-platform-tests/html/browsers/windows/nested-browsing-contexts/frameElement.html
diff --git a/tests/wpt/web-platform-tests/html/browsers/windows/support-open-cross-origin.sub.html b/tests/wpt/web-platform-tests/html/browsers/windows/support-open-cross-origin.sub.html
new file mode 100644
index 00000000000..06137ef7504
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/windows/support-open-cross-origin.sub.html
@@ -0,0 +1,3 @@
+<meta charset=utf-8>
+<p>Follow this link to open a new browsing context in a separate origin.
+<a target=second href="{{location[scheme]}}://{{domains[www2]}}:{{location[port]}}/html/browsers/windows/support-open-cross-origin.sub.html">link</a>.
diff --git a/tests/wpt/web-platform-tests/html/browsers/windows/targeting-cross-origin-nested-browsing-contexts.sub.html b/tests/wpt/web-platform-tests/html/browsers/windows/targeting-cross-origin-nested-browsing-contexts.html
index e37a595f757..e37a595f757 100644
--- a/tests/wpt/web-platform-tests/html/browsers/windows/targeting-cross-origin-nested-browsing-contexts.sub.html
+++ b/tests/wpt/web-platform-tests/html/browsers/windows/targeting-cross-origin-nested-browsing-contexts.html
diff --git a/tests/wpt/web-platform-tests/html/browsers/windows/targeting-multiple-cross-origin-manual.sub.html b/tests/wpt/web-platform-tests/html/browsers/windows/targeting-multiple-cross-origin-manual.sub.html
new file mode 100644
index 00000000000..c5cb03baf09
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/windows/targeting-multiple-cross-origin-manual.sub.html
@@ -0,0 +1,9 @@
+<meta charset=utf-8>
+<p>Follow this link to open a new browsing context in a separate origin. Follow the instructions
+in that new window, and then come back to this window.
+<a target=first href="{{location[scheme]}}://{{domains[天気の良い日]}}:{{location[port]}}/html/browsers/windows/support-open-cross-origin.sub.html">link</a>.
+
+<p>Once you come back to this page, follow this link.
+<a target=second href="support-window-name-echo.html">link</a>.
+
+<p>After clicking that link, you should have three additional windows open.
diff --git a/tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/Document.currentScript.sub.html b/tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/Document.currentScript.html
index 76f1b64de23..76f1b64de23 100644
--- a/tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/Document.currentScript.sub.html
+++ b/tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/Document.currentScript.html
diff --git a/tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/document.forms.html b/tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/document.forms.html
index 3bb89f498c1..e0689c7c799 100644
--- a/tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/document.forms.html
+++ b/tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/document.forms.html
@@ -56,11 +56,11 @@ test(function() {
// http://heycam.github.io/webidl/#property-enumeration
// If the object supports indexed properties, then the object’s supported
// property indices are enumerated first, in numerical order.
- assert_array_equals(result.splice(0, 2), ["0", "1", "2"]);
+ assert_array_equals(result.splice(0, 3), ["0", "1", "2"]);
// [...]
// Finally, any enumerable own properties or properties from the object’s
// prototype chain are then enumerated, in no defined order.
- assert_array_equals(result.sort(), ["0", "1", "2", "item", "namedItem", "length"].sort())
+ assert_array_equals(result.sort(), ["item", "namedItem", "length"].sort())
}, "document.forms iteration")
test(function() {
diff --git a/tests/wpt/web-platform-tests/html/dom/interfaces.html b/tests/wpt/web-platform-tests/html/dom/interfaces.html
index 8e35f4175fa..d698f3bff26 100644
--- a/tests/wpt/web-platform-tests/html/dom/interfaces.html
+++ b/tests/wpt/web-platform-tests/html/dom/interfaces.html
@@ -726,7 +726,6 @@ interface CSSStyleDeclaration {
attribute DOMString marginRight;
attribute DOMString marginBottom;
attribute DOMString marginLeft;
- attribute DOMString markerOffset;
attribute DOMString marks;
attribute DOMString maxHeight;
attribute DOMString maxWidth;
@@ -883,7 +882,7 @@ interface HTMLAllCollection {
interface HTMLFormControlsCollection : HTMLCollection {
// inherits length and item()
- legacycaller getter (RadioNodeList or Element)? namedItem(DOMString name); // shadows inherited namedItem()
+ getter (RadioNodeList or Element)? namedItem(DOMString name); // shadows inherited namedItem()
};
interface RadioNodeList : NodeList {
@@ -891,13 +890,12 @@ interface RadioNodeList : NodeList {
};
interface HTMLOptionsCollection : HTMLCollection {
- // inherits item()
- attribute unsigned long length; // shadows inherited length
- legacycaller HTMLOptionElement? (DOMString name);
- setter creator void (unsigned long index, HTMLOptionElement? option);
- void add((HTMLOptionElement or HTMLOptGroupElement) element, optional (HTMLElement or long)? before = null);
- void remove(long index);
- attribute long selectedIndex;
+ // inherits item(), namedItem()
+ attribute unsigned long length; // shadows inherited length
+ [CEReactions] setter void (unsigned long index, HTMLOptionElement? option);
+ [CEReactions] void add((HTMLOptionElement or HTMLOptGroupElement) element, optional (HTMLElement or long)? before = null);
+ [CEReactions] void remove(long index);
+ attribute long selectedIndex;
};
typedef sequence<any> PropertyValueArray;
@@ -1179,7 +1177,6 @@ interface HTMLEmbedElement : HTMLElement {
attribute DOMString width;
attribute DOMString height;
Document getSVGDocument();
- legacycaller any (any... arguments);
// also has obsolete members
};
@@ -1203,8 +1200,6 @@ interface HTMLObjectElement : HTMLElement {
boolean reportValidity();
void setCustomValidity(DOMString error);
- legacycaller any (any... arguments);
-
// also has obsolete members
};
@@ -2628,9 +2623,9 @@ interface MessageEvent : Event {
readonly attribute DOMString origin;
readonly attribute DOMString lastEventId;
readonly attribute (WindowProxy or MessagePort)? source;
- readonly attribute MessagePort[]? ports;
+ readonly attribute FrozenArray<MessagePort> ports;
- void initMessageEvent(DOMString typeArg, boolean canBubbleArg, boolean cancelableArg, any dataArg, DOMString originArg, DOMString lastEventIdArg, (WindowProxy or MessagePort) sourceArg, MessagePort[]? portsArg);
+ void initMessageEvent(DOMString type, boolean bubbles, boolean cancelable, any data, DOMString origin, DOMString lastEventId, (WindowProxy or MessagePort) source, sequence<MessagePort> ports);
};
dictionary MessageEventInit : EventInit {
diff --git a/tests/wpt/web-platform-tests/html/dom/new-harness.js b/tests/wpt/web-platform-tests/html/dom/new-harness.js
index f7481996e12..11bf7623251 100644
--- a/tests/wpt/web-platform-tests/html/dom/new-harness.js
+++ b/tests/wpt/web-platform-tests/html/dom/new-harness.js
@@ -1,22 +1,11 @@
// We override only the things we need to -- the rest we'll just inherit from
// original-harness.js. Polymorphism, kind of.
-ReflectionHarness.catchUnexpectedExceptions = false;
+ReflectionHarness.conformanceTesting = true;
-ReflectionHarness.test = function(expected, actual, description) {
- test(function() {
- assert_equals(expected, actual);
- }, this.getTypeDescription() + ": " + description);
- // This is the test suite that will rate conformance, so we don't want to
- // bail out early if a test fails -- we want all tests to always run.
- return true;
-}
-
-ReflectionHarness.run = function(fun, description) {
+ReflectionHarness.test = function(fun, description) {
test(fun, this.getTypeDescription() + ": " + description);
}
-ReflectionHarness.testException = function(exceptionName, fn, description) {
- test(function() {
- assert_throws(exceptionName, fn);
- }, this.getTypeDescription() + ": " + description);
-}
+ReflectionHarness.assertEquals = assert_equals;
+
+ReflectionHarness.assertThrows = assert_throws;
diff --git a/tests/wpt/web-platform-tests/html/dom/original-harness.js b/tests/wpt/web-platform-tests/html/dom/original-harness.js
index 3cfa05bcb8d..113da5f9b28 100644
--- a/tests/wpt/web-platform-tests/html/dom/original-harness.js
+++ b/tests/wpt/web-platform-tests/html/dom/original-harness.js
@@ -5,13 +5,10 @@ ReflectionHarness.passed = document.getElementById("passed");
ReflectionHarness.failed = document.getElementById("failed");
/**
- * Should we report a failure for unexpected exceptions, or just rethrow them?
- * The original test framework reports an exception, but testharness.js doesn't
- * want that.
- *
- * @public
+ * In conformance testing mode, all tests will be run. Otherwise, we'll skip
+ * tests for attributes that have an entirely incorrect type.
*/
-ReflectionHarness.catchUnexpectedExceptions = true;
+ReflectionHarness.conformanceTesting = false;
/**
* Returns a string representing val. Basically just adds quotes for strings,
@@ -86,12 +83,28 @@ ReflectionHarness.stringRep = function(val) {
ReflectionHarness.currentTestInfo = {};
/**
- * This is called when we want to test a single element/attribute combination.
- * For the original harness, it does nothing special (just calls the function),
- * but for testharness.js, it can wrap everything in a test() call.
+ * .test() sets this, and it's used by .assertEquals()/.assertThrows().
+ * Calling .test() recursively is an error.
*/
-ReflectionHarness.testWrapper = function(fn) {
- fn();
+ReflectionHarness.currentTestDescription = null;
+
+/**
+ * Run a group of one or more assertions. If any exceptions are thrown, catch
+ * them and report a failure.
+ */
+ReflectionHarness.test = function(fn, description) {
+ if (this.currentTestDescription) {
+ throw "TEST BUG: test() may not be called recursively!";
+ }
+ this.currentTestDescription = description;
+ try {
+ fn();
+ // Not throwing is a success
+ this.success();
+ } catch(err) {
+ this.failure("Exception thrown during tests with " + description);
+ }
+ this.currentTestDescription = null;
}
/**
@@ -102,37 +115,29 @@ ReflectionHarness.testWrapper = function(fn) {
*
* @public
*/
-ReflectionHarness.test = function(expected, actual, description) {
+ReflectionHarness.assertEquals = function(expected, actual, description) {
// Special-case -0 yay!
if (expected === 0 && actual === 0 && 1/expected === 1/actual) {
this.increment(this.passed);
- return true;
} else if (expected === actual) {
this.increment(this.passed);
- return true;
} else {
this.increment(this.failed);
- this.reportFailure(description + ' (expected ' + this.stringRep(actual) + ', got ' + this.stringRep(expected) + ')');
- return false;
- }
-}
-
-ReflectionHarness.run = function(fun, description) {
- try {
- fun();
- } catch (err) {
- ReflectionHarness.failure(description);
+ this.reportFailure(this.currentTestDescription +
+ (description ? " followed by " + description : "") +
+ ' (expected ' + this.stringRep(actual) + ', got ' +
+ this.stringRep(expected) + ')');
}
}
/**
* If calling fn causes a DOMException of the type given by the string
- * exceptionName (e.g., "INDEX_SIZE_ERR"), output a success. Otherwise, report
- * a failure with the given description.
+ * exceptionName (e.g., "IndexSizeError"), output a success. Otherwise, report
+ * a failure.
*
* @public
*/
-ReflectionHarness.testException = function(exceptionName, fn, description) {
+ReflectionHarness.assertThrows = function(exceptionName, fn) {
try {
fn();
} catch (e) {
@@ -142,7 +147,8 @@ ReflectionHarness.testException = function(exceptionName, fn, description) {
}
}
this.increment(this.failed);
- this.reportFailure(description);
+ this.reportFailure(this.currentTestDescription + " must throw " +
+ exceptionName);
return false;
}
@@ -248,9 +254,9 @@ ReflectionHarness.reportFailure = function(description) {
}
/**
- * Shorthand function for when we have a failure outside of test(). Generally
- * used when the failure is an exception thrown unexpectedly or such, something
- * not equality-based.
+ * Shorthand function for when we have a failure outside of
+ * assertEquals()/assertThrows(). Generally used when the failure is an
+ * exception thrown unexpectedly or such, something not equality-based.
*
* @public
*/
@@ -260,8 +266,8 @@ ReflectionHarness.failure = function(message) {
}
/**
- * Shorthand function for when we have a success outside of test(). Only
- * called if catchUnexpectedExceptions is true.
+ * Shorthand function for when we have a success outside of
+ * assertEquals()/assertThrows().
*
* @public
*/
diff --git a/tests/wpt/web-platform-tests/html/dom/reflection.js b/tests/wpt/web-platform-tests/html/dom/reflection.js
index 72ed01ef7bf..b105a8b5ad6 100644
--- a/tests/wpt/web-platform-tests/html/dom/reflection.js
+++ b/tests/wpt/web-platform-tests/html/dom/reflection.js
@@ -567,15 +567,6 @@ ReflectionTests.reflects = function(data, idlName, idlObj, domName, domObj) {
// probably safe enough. Just don't read stuff that will change.
ReflectionHarness.currentTestInfo = {data: data, idlName: idlName, idlObj: idlObj, domName: domName, domObj: domObj};
- ReflectionHarness.testWrapper(function() {
- ReflectionTests.doReflects(data, idlName, idlObj, domName, domObj);
- });
-};
-
-/**
- * Actual implementation of the above.
- */
-ReflectionTests.doReflects = function(data, idlName, idlObj, domName, domObj) {
// If we don't recognize the type, testing is impossible.
if (this.typeMap[data.type] === undefined) {
if (unimplemented.indexOf(data.type) == -1) {
@@ -591,9 +582,15 @@ ReflectionTests.doReflects = function(data, idlName, idlObj, domName, domObj) {
}
// Test that typeof idlObj[idlName] is correct. If not, further tests are
- // probably pointless, so bail out.
- var isDefaultValueNull = data.isNullable && data.defaultVal === null;
- if (!ReflectionHarness.test(typeof idlObj[idlName], isDefaultValueNull ? "object" : typeInfo.jsType, "typeof IDL attribute")) {
+ // probably pointless, so bail out if we're not running conformance tests.
+ var expectedType = data.isNullable && data.defaultVal === null ? "object"
+ : typeInfo.jsType;
+ ReflectionHarness.test(function() {
+ ReflectionHarness.assertEquals(typeof idlObj[idlName], expectedType);
+ }, "typeof IDL attribute");
+
+ if (!ReflectionHarness.conformanceTesting &&
+ typeof idlObj[idlName] !== expectedType) {
return;
}
@@ -603,7 +600,9 @@ ReflectionTests.doReflects = function(data, idlName, idlObj, domName, domObj) {
defaultVal = typeInfo.defaultVal;
}
if (defaultVal !== null || data.isNullable) {
- ReflectionHarness.test(idlObj[idlName], defaultVal, "IDL get with DOM attribute unset");
+ ReflectionHarness.test(function() {
+ ReflectionHarness.assertEquals(idlObj[idlName], defaultVal);
+ }, "IDL get with DOM attribute unset");
}
var domTests = typeInfo.domTests.slice(0);
@@ -704,50 +703,42 @@ ReflectionTests.doReflects = function(data, idlName, idlObj, domName, domObj) {
// the test.
continue;
}
- try {
+ ReflectionHarness.test(function() {
domObj.setAttribute(domName, domTests[i]);
- ReflectionHarness.test(domObj.getAttribute(domName), String(domTests[i]), "setAttribute() to " + ReflectionHarness.stringRep(domTests[i]) + " followed by getAttribute()");
- ReflectionHarness.test(idlObj[idlName], domExpected[i], "setAttribute() to " + ReflectionHarness.stringRep(domTests[i]) + " followed by IDL get");
- if (ReflectionHarness.catchUnexpectedExceptions) {
- ReflectionHarness.success();
- }
- } catch (err) {
- if (ReflectionHarness.catchUnexpectedExceptions) {
- ReflectionHarness.failure("Exception thrown during tests with setAttribute() to " + ReflectionHarness.stringRep(domTests[i]));
- } else {
- throw err;
- }
- }
+ ReflectionHarness.assertEquals(domObj.getAttribute(domName),
+ String(domTests[i]), "getAttribute()");
+ ReflectionHarness.assertEquals(idlObj[idlName], domExpected[i],
+ "IDL get");
+ }, "setAttribute() to " + ReflectionHarness.stringRep(domTests[i]));
}
}
for (var i = 0; i < idlTests.length; i++) {
- if ((data.type == "limited long" && idlTests[i] < 0) ||
- (data.type == "limited unsigned long" && idlTests[i] == 0)) {
- ReflectionHarness.testException("INDEX_SIZE_ERR", function() {
- idlObj[idlName] = idlTests[i];
- }, "IDL set to " + ReflectionHarness.stringRep(idlTests[i]) + " must throw INDEX_SIZE_ERR");
- } else {
- ReflectionHarness.run(function() {
+ ReflectionHarness.test(function() {
+ if ((data.type == "limited long" && idlTests[i] < 0) ||
+ (data.type == "limited unsigned long" && idlTests[i] == 0)) {
+ ReflectionHarness.assertThrows("IndexSizeError", function() {
+ idlObj[idlName] = idlTests[i];
+ });
+ } else {
idlObj[idlName] = idlTests[i];
if (data.type == "boolean") {
// Special case yay
- ReflectionHarness.test(domObj.hasAttribute(domName), Boolean(idlTests[i]), "IDL set to " + ReflectionHarness.stringRep(idlTests[i]) + " followed by hasAttribute()");
+ ReflectionHarness.assertEquals(domObj.hasAttribute(domName),
+ Boolean(idlTests[i]), "hasAttribute()");
} else if (idlDomExpected[i] !== null || data.isNullable) {
var expected = idlDomExpected[i] + "";
if (data.isNullable && idlDomExpected[i] === null) {
expected = null;
}
- ReflectionHarness.test(domObj.getAttribute(domName), expected, "IDL set to " + ReflectionHarness.stringRep(idlTests[i]) + " followed by getAttribute()");
+ ReflectionHarness.assertEquals(domObj.getAttribute(domName), expected,
+ "getAttribute()");
}
if (idlIdlExpected[i] !== null || data.isNullable) {
- ReflectionHarness.test(idlObj[idlName], idlIdlExpected[i], "IDL set to " + ReflectionHarness.stringRep(idlTests[i]) + " followed by IDL get");
+ ReflectionHarness.assertEquals(idlObj[idlName], idlIdlExpected[i], "IDL get");
}
- if (ReflectionHarness.catchUnexpectedExceptions) {
- ReflectionHarness.success();
- }
- }, "IDL set to " + ReflectionHarness.stringRep(idlTests[i]) + " should not throw");
- }
+ }
+ }, "IDL set to " + ReflectionHarness.stringRep(idlTests[i]));
}
};
diff --git a/tests/wpt/web-platform-tests/html/editing/activation/click-manual.html b/tests/wpt/web-platform-tests/html/editing/activation/click-manual.html
new file mode 100644
index 00000000000..1359a43c1b8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/editing/activation/click-manual.html
@@ -0,0 +1,5 @@
+<!doctype html>
+<title>Interaction of UI input and the click in progress flag</title>
+<p>When you mouse click the checkbox below it should not be checked:</p>
+<p><input type=checkbox onclick=this.click()></p>
+<p>Now keyboard "click" the checkbox and confirm it's still not checked.</p>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/dndTransferCases-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/dndTransferCases-manual.html
index 84a8c7ea62d..6081b5d42c3 100755
--- a/tests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/dndTransferCases-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/dndTransferCases-manual.html
@@ -4,7 +4,8 @@
<meta charset='utf-8'>
<title>HTML Test: dropzone_attribute_data_item_kind_string</title>
<link rel='author' title='Intel' href='http://www.intel.com'>
- <link rel='help' href='http://www.w3.org/html/editing/dnd/the-datatransfer-interface/'>
+ <link rel='author' title='Domenic Denicola' href='mailto:d@domenic.com'>
+ <link rel='help' href='https://html.spec.whatwg.org/multipage/#the-datatransfer-interface'>
<script src='/resources/testharness.js'></script>
<script src='/resources/testharnessreport.js'></script>
<style>
@@ -37,6 +38,27 @@
test(function() {
assert_equals(event.dataTransfer.effectAllowed, 'uninitialized');
}, 'effectAllowed should be "uninitialized"');
+
+ test(function() {
+ assert_equals(event.dataTransfer.types.constructor, Array, 'should be an array');
+ assert_true(Object.isFrozen(event.dataTransfer.types), 'should be frozen');
+ }, 'types should be a frozen array');
+
+ test(function() {
+ assert_false('contains' in event.dataTransfer.types);
+ assert_false('item' in event.dataTransfer.types);
+ }, 'types should not have any of the historical methods');
+
+ test(function() {
+ assert_equals(event.dataTransfer.types, event.dataTransfer.types);
+ }, 'types should return the same object from multiple reads (assuming no changes)');
+
+ test(function() {
+ var before = event.dataTransfer.types;
+ event.dataTransfer.clearData();
+ assert_not_equals(event.dataTransfer.types, before);
+ }, 'types should return a different object after changes');
+
done();
});
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/focus/processing-model/focus-fixup-rule-one-no-dialogs.html b/tests/wpt/web-platform-tests/html/editing/focus/processing-model/focus-fixup-rule-one-no-dialogs.html
new file mode 100644
index 00000000000..dab9c575147
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/editing/focus/processing-model/focus-fixup-rule-one-no-dialogs.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Focus fixup rule one (no &lt;dialog>s involved)</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#focus-fixup-rule-one">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div>
+ <button id="button1">Button 1</button>
+ <button id="button2">Button 2</button>
+ <button id="button3">Button 3</button>
+ <div id="div" tabindex="0">Div</div>
+</div>
+
+<script>
+"use strict";
+
+async_test(t => {
+ const button = document.querySelector("#button1");
+ button.focus();
+
+ assert_equals(document.activeElement, button, "Sanity check: the button must start focused");
+
+ button.disabled = true;
+
+ assert_not_equals(document.activeElement, button, "After disabling, the button must no longer be focused");
+ assert_equals(document.activeElement, document.body, "After disabling, the body must be focused");
+
+}, "Disabling the active element (making it expressly inert)");
+
+test(() => {
+ const button = document.querySelector("#button2");
+ button.focus();
+
+ assert_equals(document.activeElement, button, "Sanity check: the button must start focused");
+
+ button.hidden = true;
+
+ assert_not_equals(document.activeElement, button, "After hiding, the button must no longer be focused");
+ assert_equals(document.activeElement, document.body, "After hiding, the body must be focused");
+
+}, "Hiding the active element");
+
+test(() => {
+ const button = document.querySelector("#button3");
+ button.focus();
+
+ assert_equals(document.activeElement, button, "Sanity check: the button must start focused");
+
+ button.remove();
+
+ assert_not_equals(document.activeElement, button, "After removing, the button must no longer be focused");
+ assert_equals(document.activeElement, document.body, "After removing, the body must be focused");
+
+}, "Removing the active element from the DOM");
+
+test(() => {
+ const div = document.querySelector("#div");
+ div.focus();
+
+ assert_equals(document.activeElement, div, "Sanity check: the div must start focused");
+
+ div.removeAttribute("tabindex");
+
+ assert_not_equals(document.activeElement, div, "After removing tabindex, the div must no longer be focused");
+ assert_equals(document.activeElement, document.body, "After removing tabindex, the body must be focused");
+
+}, "Removing the tabindex attribute from a div");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/infrastructure/common-dom-interfaces/collections/historical.html b/tests/wpt/web-platform-tests/html/infrastructure/common-dom-interfaces/collections/historical.html
new file mode 100644
index 00000000000..a26dd4ccd45
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/infrastructure/common-dom-interfaces/collections/historical.html
@@ -0,0 +1,25 @@
+<!doctype html>
+<title>Historical HTML*Collection features should not be supported</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id=log></div>
+<form id=form><input name=foo></form>
+<select id=select><option name=bar></select>
+<script>
+test(function() {
+ var collection = document.getElementById('form').elements;
+ assert_equals(typeof collection, 'object', 'typeof');
+ assert_throws(new TypeError(), function() {
+ collection('foo');
+ });
+}, 'HTMLFormControlsCollection legacycaller should not be supported');
+
+test(function() {
+ var collection = document.getElementById('select').options;
+ assert_equals(typeof collection, 'object', 'typeof');
+ assert_throws(new TypeError(), function() {
+ collection('bar');
+ });
+}, 'HTMLOptionsCollection legacycaller should not be supported');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/infrastructure/common-dom-interfaces/collections/htmlallcollection.html b/tests/wpt/web-platform-tests/html/infrastructure/common-dom-interfaces/collections/htmlallcollection.html
index 9ce8ec350d1..fd250426464 100644
--- a/tests/wpt/web-platform-tests/html/infrastructure/common-dom-interfaces/collections/htmlallcollection.html
+++ b/tests/wpt/web-platform-tests/html/infrastructure/common-dom-interfaces/collections/htmlallcollection.html
@@ -3,7 +3,8 @@
<head>
<title>HTMLAllCollection Tests</title>
<link rel="author" title="Dan Druta" href="mailto:dan.druta@att.com"/>
-<link rel="help" href="2.7.2.1 - Common Infrastructure/Common DOM Interfaces/Collections/HTMLAllCollection"/>
+<link rel="author" title="Philip Jägenstedt" href="mailto:philip@foolip.org"/>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/infrastructure.html#the-htmlallcollection-interface"/>
<meta name="flags" content="TOKENS" />
<meta name="assert" content="TEST ASSERTION"/>
<script src="/resources/testharness.js"></script>
@@ -13,34 +14,249 @@
<img src="../../../../images/green.png" name="picture">
<a name="foo"></a>
<a name="foo"></a>
+<span id="42"></span>
+<span id="043"></span>
+<div id="4294967294"></div>
+<div id="4294967295"></div>
+<div id="4294967296"></div>
<script>
-test(function(){ assert_equals(document.all.length,14)}, "Test for HTMLAllCollection size");
+var anchors = document.querySelectorAll("a");
+var divs = document.querySelectorAll("div");
+var scripts = document.querySelectorAll("script");
+var spans = document.querySelectorAll("span");
-test(function(){ assert_equals(document.all.item(0).tagName,"HTML")}, "Test lookup by index using ()");
+test(function() {
+ assert_true(document.all instanceof HTMLAllCollection);
+}, "document.all is an HTMLAllCollection");
-test(function(){ assert_equals(document.all[0].tagName,"HTML")}, "Test lookup by index using []");
+test(function() {
+ assert_equals(document.all.length, 20);
+}, "length attribute");
-test(function(){ assert_equals(document.all.item("picture").nodeName,"IMG")}, "Test lookup IMG by name");
+// indexed property getter
-test(function(){ assert_equals(document.all.namedItem("picture").nodeName,"IMG")}, "Test lookup IMG by namedItem ");
+test(function() {
+ assert_equals(document.all[0], document.documentElement);
+ assert_equals(document.all[19], scripts[2]);
+}, "indexed property getter");
-test(function(){ assert_equals(document.all("picture").nodeName,"IMG")}, "Test lookup IMG in collection using ()");
+test(function() {
+ assert_equals(document.all[-1], undefined);
+ assert_equals(document.all[20], undefined);
+ assert_equals(document.all[42], undefined);
+ assert_equals(document.all[43], undefined);
+ assert_equals(document.all[4294967294], undefined);
+ assert_equals(document.all[4294967295], divs[1]);
+ assert_equals(document.all[4294967296], divs[2]);
+}, "indexed property getter out of range");
-test(function(){ assert_equals(document.all["picture"].nodeName,"IMG")}, "Test lookup IMG in collection using []");
+// named property getter
-test(function(){ assert_equals(document.all.picture.nodeName,"IMG")}, "Test lookup IMG in collection using .");
+test(function() {
+ assert_equals(document.all["root"], document.documentElement);
+ assert_equals(document.all["flags"].content, "TOKENS");
+ assert_equals(document.all["picture"].tagName, "IMG");
+}, "named property getter");
-test(function(){ assert_equals(document.all.tags.id,"tags")}, "Test lookup tags in collection using .");
+test(function() {
+ assert_equals(document.all.root, document.documentElement);
+ assert_equals(document.all.flags.content, "TOKENS");
+ assert_equals(document.all.picture.tagName, "IMG");
+}, "named property getter with dot syntax");
test(function() {
- assert_equals(document.all["root"], document.documentElement);
-}, "Should find root element too");
+ assert_equals(document.all["noname"], undefined);
+ assert_equals(document.all.noname, undefined);
+}, "named property getter with invalid name");
+
+test(function() {
+ var collection = document.all["foo"];
+ assert_equals(collection.length, 2);
+ assert_equals(collection[0], anchors[0]);
+ assert_equals(collection[1], anchors[1]);
+}, "named property getter returning collection");
+
+test(function() {
+ assert_equals(document.all["0"], document.documentElement);
+ assert_equals(document.all["19"], document.scripts[2]);
+ assert_equals(document.all["20"], undefined);
+ assert_equals(document.all["42"], undefined);
+ assert_equals(document.all["43"], undefined);
+}, "named property getter with \"array index property name\"");
+
+test(function() {
+ assert_equals(document.all["00"], undefined);
+ assert_equals(document.all["042"], undefined);
+ assert_equals(document.all["043"], spans[1]);
+ assert_equals(document.all["4294967294"], undefined);
+ assert_equals(document.all["4294967295"], divs[1]);
+ assert_equals(document.all["4294967296"], divs[2]);
+}, "named property getter with invalid \"array index property name\"");
+
+// namedItem method
test(function() {
- assert_equals(document.all["foo"].length, 2);
-}, "Should find both anchors and produce a list");
+ assert_equals(document.all.namedItem("root"), document.documentElement);
+ assert_equals(document.all.namedItem("flags").content, "TOKENS");
+ assert_equals(document.all.namedItem("picture").tagName, "IMG");
+}, "namedItem method");
-test
+test(function() {
+ assert_equals(document.all.namedItem("noname"), null);
+}, "namedItem method with invalid name");
+
+test(function() {
+ var collection = document.all.namedItem("foo");
+ assert_equals(collection.length, 2);
+ assert_equals(collection[0], anchors[0]);
+ assert_equals(collection[1], anchors[1]);
+}, "namedItem method returning collection");
+
+test(function() {
+ assert_equals(document.all.namedItem("0"), null);
+ assert_equals(document.all.namedItem("19"), null);
+ assert_equals(document.all.namedItem("20"), null);
+ assert_equals(document.all.namedItem("42"), spans[0]);
+ assert_equals(document.all.namedItem("43"), null);
+}, "namedItem method with \"array index property name\"");
+
+test(function() {
+ assert_equals(document.all.namedItem("00"), null);
+ assert_equals(document.all.namedItem("042"), null);
+ assert_equals(document.all.namedItem("043"), spans[1]);
+ assert_equals(document.all.namedItem("4294967294"), divs[0]);
+ assert_equals(document.all.namedItem("4294967295"), divs[1]);
+ assert_equals(document.all.namedItem("4294967296"), divs[2]);
+}, "namedItem method with invalid \"array index property name\"");
+
+test(function() {
+ assert_equals(document.all.namedItem.length, 1);
+ assert_throws(new TypeError, function() {
+ document.all.namedItem();
+ });
+}, "namedItem method with no argument");
+
+// legacy caller
+
+test(function() {
+ assert_equals(document.all("root"), document.documentElement);
+ assert_equals(document.all("flags").content, "TOKENS");
+ assert_equals(document.all("picture").tagName, "IMG");
+}, "legacy caller");
+
+test(function() {
+ assert_equals(document.all("noname"), null);
+}, "legacy caller with invalid name");
+
+test(function() {
+ var collection = document.all("foo");
+ assert_equals(collection.length, 2);
+ assert_equals(collection[0], anchors[0]);
+ assert_equals(collection[1], anchors[1]);
+}, "legacy caller returning collection");
+
+test(function() {
+ assert_equals(document.all("0"), document.documentElement);
+ assert_equals(document.all("19"), document.scripts[2]);
+ assert_equals(document.all("20"), null);
+ assert_equals(document.all("42"), null);
+ assert_equals(document.all("43"), null);
+}, "legacy caller with \"array index property name\"");
+
+test(function() {
+ assert_equals(document.all(0), document.documentElement);
+ assert_equals(document.all(19), document.scripts[2]);
+ assert_equals(document.all(20), null);
+ assert_equals(document.all(42), null);
+ assert_equals(document.all(43), null);
+}, "legacy caller with \"array index property name\" as number");
+
+test(function() {
+ assert_equals(document.all("00"), null);
+ assert_equals(document.all("042"), null);
+ assert_equals(document.all("043"), spans[1]);
+ assert_equals(document.all("4294967294"), null);
+ assert_equals(document.all("4294967295"), divs[1]);
+ assert_equals(document.all("4294967296"), divs[2]);
+}, "legacy caller with invalid \"array index property name\"");
+
+test(function() {
+ assert_equals(document.all(), null);
+}, "legacy caller with no argument");
+
+// item method
+
+test(function() {
+ assert_equals(document.all.item("root"), document.documentElement);
+ assert_equals(document.all.item("flags").content, "TOKENS");
+ assert_equals(document.all.item("picture").tagName, "IMG");
+}, "item method");
+
+test(function() {
+ assert_equals(document.all.item("noname"), null);
+}, "item method with invalid name");
+
+test(function() {
+ var collection = document.all.item("foo");
+ assert_equals(collection.length, 2);
+ assert_equals(collection[0], anchors[0]);
+ assert_equals(collection[1], anchors[1]);
+}, "item method returning collection");
+
+test(function() {
+ assert_equals(document.all.item("0"), document.documentElement);
+ assert_equals(document.all.item("19"), document.scripts[2]);
+ assert_equals(document.all.item("20"), null);
+ assert_equals(document.all.item("42"), null);
+ assert_equals(document.all.item("43"), null);
+}, "item method with \"array index property name\"");
+
+test(function() {
+ assert_equals(document.all.item(0), document.documentElement);
+ assert_equals(document.all.item(19), document.scripts[2]);
+ assert_equals(document.all.item(20), null);
+ assert_equals(document.all.item(42), null);
+ assert_equals(document.all.item(43), null);
+}, "item method with \"array index property name\" as number");
+
+test(function() {
+ assert_equals(document.all.item("00"), null);
+ assert_equals(document.all.item("042"), null);
+ assert_equals(document.all.item("043"), spans[1]);
+ assert_equals(document.all.item("4294967294"), null);
+ assert_equals(document.all.item("4294967295"), divs[1]);
+ assert_equals(document.all.item("4294967296"), divs[2]);
+}, "item method with invalid \"array index property name\"");
+
+test(function() {
+ assert_equals(document.all.item.length, 0);
+ assert_equals(document.all.item(), null);
+}, "item method with no argument");
+
+// live HTMLCollection
+
+test(function() {
+ var collections = [
+ document.all["foo"],
+ document.all.namedItem("foo"),
+ document.all("foo"),
+ document.all.item("foo"),
+ ];
+ // a new HTMLCollection is created for each call
+ for (var i = 0; i < collections.length; i++) {
+ assert_true(collections[i] instanceof HTMLCollection);
+ for (var j = i + 1; j < collections.length; j++) {
+ assert_not_equals(collections[i], collections[j]);
+ }
+ }
+ for (var c of collections) {
+ assert_equals(c.length, 2);
+ }
+ anchors[0].name = "bar";
+ for (var c of collections) {
+ assert_equals(c.length, 1);
+ }
+}, "collections are new live HTMLCollection instances");
</script>
<div id="log"></div>
</body>
diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-base-element/base_href_specified.sub.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-base-element/base_href_specified.html
index 83e71387a0b..83e71387a0b 100644
--- a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-base-element/base_href_specified.sub.html
+++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-base-element/base_href_specified.html
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/interfaces/TrackEvent/constructor.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/interfaces/TrackEvent/constructor.html
index 54567d14a68..cb5b89711fb 100644
--- a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/interfaces/TrackEvent/constructor.html
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/interfaces/TrackEvent/constructor.html
@@ -13,12 +13,13 @@ test(function(){
assert_equals(ev.track, null, 'ev.track after assignment');
}, document.title+', one arg');
test(function(){
- var obj = {};
- var ev = new TrackEvent('foo', {track:obj});
+ var video = document.createElement('video');
+ var testTrack = video.addTextTrack('subtitles', 'foo', 'foo');
+ var ev = new TrackEvent('foo', {track: testTrack});
assert_true(ev instanceof TrackEvent, 'ev instanceof TrackEvent');
assert_true(ev instanceof Event, 'ev instanceof Event');
- assert_equals(ev.track, obj, 'ev.track');
+ assert_equals(ev.track, testTrack, 'ev.track');
ev.track = {};
- assert_equals(ev.track, obj, 'ev.track after assignment');
+ assert_equals(ev.track, testTrack, 'ev.track after assignment');
}, document.title+', two args');
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-embed-element/historical.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-embed-element/historical.html
new file mode 100644
index 00000000000..168a8468e06
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-embed-element/historical.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<title>Historical embed element features should not be supported</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id=log></div>
+<embed id=embed>
+<script>
+test(function() {
+ var elm = document.getElementById('embed');
+ assert_equals(typeof elm, 'object', 'typeof');
+ assert_throws(new TypeError(), function() {
+ elm();
+ });
+}, 'embed legacycaller should not be supported');
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe-append-to-child-document.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe-append-to-child-document.html
new file mode 100644
index 00000000000..ac8bd5e053b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe-append-to-child-document.html
@@ -0,0 +1,17 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Append iframe element to its own child document</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id=x></iframe>
+<script>
+test(function() {
+ var iframe = document.getElementById('x');
+ var childWindow = iframe.contentWindow;
+ assert_equals(childWindow.parent, window);
+ childWindow.document.body.appendChild(iframe);
+ assert_equals(childWindow.parent, null);
+ assert_equals(iframe.contentWindow, null);
+ assert_equals(childWindow.document.body.firstChild, iframe);
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_script.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_script.html
index 5e015ce98d2..cd05f224601 100644
--- a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_script.html
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_script.html
@@ -7,9 +7,10 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
-<iframe id="testIframe" src="support/sandbox_allow_script.html" sandbox="allow-same-origin" style="display:none"></iframe>
<div id="log"></div>
<script>
+ // Set up all our script stuff before the iframe starts loading, so we don't
+ // miss any messages from it.
var step1 = false;
var t = async_test("iframe_sandbox_allow_scripts");
@@ -35,5 +36,11 @@
t.done();
}
- setTimeout(run, 500);
+ // Make sure the iframe loads before we mess with it.
+ window.addEventListener("load", function() {
+ // The load event might fire before a message from the child comes in...
+ // Wait a bit to see if that message does come in.
+ setTimeout(run, 500);
+ });
</script>
+<iframe id="testIframe" src="support/sandbox_allow_script.html" sandbox="allow-same-origin" style="display:none"></iframe>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html
index 271f8462fda..342d4220364 100644
--- a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping.html
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html
@@ -19,7 +19,7 @@
assert_equals(e.data.origin, ourOrigin, "Should have escaped the sandbox");
});
- document.querySelector("iframe").src = "iframe_sandbox_popups_helper.html";
+ document.querySelector("iframe").src = "iframe_sandbox_popups_helper-1.html";
});
postMessage("hello", "*");
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html
new file mode 100644
index 00000000000..40ffbb1e020
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html
@@ -0,0 +1,31 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Check that popups from a sandboxed iframe escape the sandbox if
+ allow-popups-to-escape-sandbox is used</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<iframe sandbox="allow-scripts allow-popups allow-popups-to-escape-sandbox">
+</iframe>
+<script>
+ var t = async_test();
+ var ourOrigin;
+ onmessage = t.step_func(function(e) {
+ assert_equals(e.data, "hello", "This is our origin getter message");
+ ourOrigin = e.origin;
+
+ onmessage = t.step_func_done(function(e) {
+ assert_equals(e.origin, "null", "It came from a sandboxed iframe");
+ assert_equals(e.data.data, undefined, "Should have the right message");
+ assert_equals(e.data.origin, ourOrigin, "Should have escaped the sandbox");
+ });
+
+ var iframe = document.querySelector("iframe");
+ iframe.onload = function() {
+ frames[0].postMessage("start", "*");
+ }
+ iframe.src = "iframe_sandbox_popups_helper-2.html";
+ });
+ addEventListener("load", function() {
+ postMessage("hello", "*");
+ });
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html
new file mode 100644
index 00000000000..2d35fd5fc14
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html
@@ -0,0 +1,25 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Check that popups from a sandboxed iframe escape the sandbox if
+ allow-popups-to-escape-sandbox is used</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<iframe sandbox="allow-scripts allow-popups allow-popups-to-escape-sandbox">
+</iframe>
+<script>
+ var t = async_test();
+ var ourOrigin;
+ onmessage = t.step_func(function(e) {
+ assert_equals(e.data, "hello", "This is our origin getter message");
+ ourOrigin = e.origin;
+
+ onmessage = t.step_func_done(function(e) {
+ assert_equals(e.origin, "null", "It came from a sandboxed iframe");
+ assert_equals(e.data.data, undefined, "Should have the right message");
+ assert_equals(e.data.origin, ourOrigin, "Should have escaped the sandbox");
+ });
+
+ document.querySelector("iframe").src = "iframe_sandbox_popups_helper-3.html";
+ });
+ postMessage("hello", "*");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_helper.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_helper-1.html
index ee993dd0db7..6b120f15d0d 100644
--- a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_helper.html
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_helper-1.html
@@ -1,6 +1,5 @@
<!DOCTYPE html>
<script>
- var popupWin;
if (opener) {
// We're the popup. Send back our state. What we really want to send is
// our origin, but that will come automatically.
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_helper-2.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_helper-2.html
new file mode 100644
index 00000000000..9c393fc954a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_helper-2.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<body>
+<script>
+ if (opener) {
+ // We're the popup. Send back our state. What we really want to send is
+ // our origin, but that will come automatically.
+ opener.postMessage(undefined, "*");
+ self.close();
+ } else {
+ // We're the child. Start listening for messages from our parent and open
+ // ourselves as the popup when we get the "start" message.
+ onmessage = function (e) {
+ if (e.data == "start") {
+ // Now listen for messages from the thing we plan to open.
+ onmessage = function(e) {
+ parent.postMessage({ data: e.data, origin: e.origin }, "*");
+ }
+
+ var a = document.createElement("a");
+ a.href = location.href;
+ a.target = "_blank";
+ document.body.appendChild(a);
+ a.click();
+ }
+ };
+ }
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_helper-3.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_helper-3.html
new file mode 100644
index 00000000000..ef3e59037f4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_helper-3.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<script>
+ if (opener) {
+ // We're the popup. Send back our state. What we really want to send is
+ // our origin, but that will come automatically.
+ opener.postMessage(undefined, "*");
+ self.close();
+ } else {
+ // We're the child. Start listening for messages and open ourselves as the
+ // popup.
+ onmessage = function (e) {
+ parent.postMessage({ data: e.data, origin: e.origin }, "*");
+ };
+ var popupWin = window.open();
+ popupWin.location.href = location.href;
+ }
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html
index 546f9d53d33..3dee96d67aa 100644
--- a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping.html
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html
@@ -12,4 +12,4 @@
});
</script>
<iframe sandbox="allow-scripts allow-popups"
- src="iframe_sandbox_popups_helper.html"></iframe>
+ src="iframe_sandbox_popups_helper-1.html"></iframe>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html
new file mode 100644
index 00000000000..27046db7444
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Check that popups from a sandboxed iframe do not escape the sandbox</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+ var t = async_test();
+ onmessage = t.step_func_done(function(e) {
+ assert_equals(e.origin, "null", "It came from a sandboxed iframe");
+ assert_equals(e.data.data, undefined, "Should have the right message");
+ assert_equals(e.data.origin, "null", "Should not have escaped the sandbox");
+ });
+ addEventListener("load", function() {
+ frames[0].postMessage("start", "*");
+ });
+</script>
+<iframe sandbox="allow-scripts allow-popups"
+ src="iframe_sandbox_popups_helper-2.html"></iframe>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html
new file mode 100644
index 00000000000..556387e14a4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Check that popups from a sandboxed iframe do not escape the sandbox</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+ var t = async_test();
+ onmessage = t.step_func_done(function(e) {
+ assert_equals(e.origin, "null", "It came from a sandboxed iframe");
+ assert_equals(e.data.data, undefined, "Should have the right message");
+ assert_equals(e.data.origin, "null", "Should not have escaped the sandbox");
+ });
+</script>
+<iframe sandbox="allow-scripts allow-popups"
+ src="iframe_sandbox_popups_helper-3.html"></iframe>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/data-url.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/data-url.html
new file mode 100644
index 00000000000..2fa63004390
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/data-url.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>data URL image</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id=log></div>
+<script>
+var c = document.createElement("canvas"),
+ con = c.getContext("2d"),
+ img = document.createElement("img")
+img.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAA+UlEQVR4nO3RoRHAQBDEsOu/6YR+B2sgIO4Z3919pMwDMCRtHoAhafMADEmbB2BI2jwAQ9LmARiSNg/AkLR5AIakzQMwJG0egCFp8wAMSZsHYEjaPABD0uYBGJI2D8CQtHkAhqTNAzAkbR6AIWnzAAxJmwdgSNo8AEPS5gEYkjYPwJC0eQCGpM0DMCRtHoAhafMADEmbB2BI2jwAQ9LmARiSNg/AkLR5AIakzQMwJG0egCFp8wAMSZsHYEjaPABD0uYBGJI2D8CQtHkAhqTNAzAkbR6AIWnzAAxJmwdgSNo8AEPS5gEYkjYPwJC0eQCGpM0DMCRtHsDjB5K06yueJFXJAAAAAElFTkSuQmCC"
+img.onload = () => {
+ con.drawImage(img, 0, 0)
+ var data = con.getImageData(0, 0, 10, 10) // should not throw as data URLs are same-origin
+ for(var i = 0; i < data.data.length; i++) {
+ var expected = ((i+1) % 4 == 0) ? 255 : 0
+ assert_equals(data.data[i], expected)
+ }
+ c.toDataURL() // shouldn't throw either
+ done()
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/invalid-src.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/invalid-src.html
index a4323da4b87..f1fbe34c596 100644
--- a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/invalid-src.html
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/invalid-src.html
@@ -3,10 +3,11 @@
<title>Loading a non-parsing URL as an image should silently fail; triggering appropriate events</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
-<img id=myimg />
+<img id=brokenurl />
+<img id=emptysrc />
<script>
async_test(function(t) {
- var img = document.getElementById("myimg");
+ var img = document.getElementById("brokenurl");
img.src = "http://also a broken url";
var errorevent = false;
@@ -16,6 +17,26 @@ async_test(function(t) {
img.addEventListener('loadend', t.step_func_done(function() {
assert_true(errorevent, "error event fired");
}));
-});
+}, 'src="http://also a broken url"');
+
+async_test(function(t) {
+ var img = document.getElementById("emptysrc");
+ img.src = "";
+ var loadendevent = false;
+
+ // Setting src to empty string triggers only error event.
+ // The errors should be queued in the event loop, so they should only trigger
+ // after this block of code finishes, not during the img.src setter itself
+ img.addEventListener('error', t.step_func(function() {
+ // Queue this check in the event loop to check there is no loadend event
+ // fired.
+ t.step_timeout(t.step_func_done(function() {
+ assert_false(loadendevent, "loadend event should not fired");
+ }), 0)
+ }));
+ img.addEventListener('loadend', t.step_func(function() {
+ loadendevent = true;
+ }));
+}, 'src=""');
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/usemap-casing.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/usemap-casing.html
new file mode 100644
index 00000000000..c15741ab067
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/usemap-casing.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>img usemap case-sensitive</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-a-hash-name-reference">
+<!-- See also: https://github.com/whatwg/html/issues/1666 -->
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="log"></div>
+
+<img src="/images/threecolors.png" usemap="#sanityCheck" width="300" height="300">
+<map name="sanityCheck"><area shape="rect" coords="0,0,300,300"></map>
+
+<img src="/images/threecolors.png" usemap="#sImPlE" width="300" height="300">
+<map name="simple"><area shape="rect" coords="0,0,300,300"></map>
+<map name="SIMPLE"><area shape="rect" coords="0,0,300,300"></map>
+
+<img src="/images/threecolors.png" usemap="#paSSfield-killroyß" width="300" height="300">
+<map name="passfield-killroyß"><area shape="rect" coords="0,0,300,300"></map>
+<map name="PASSFIELD-KILLROYß"><area shape="rect" coords="0,0,300,300"></map>
+<map name="paſſfield-killroyß"><area shape="rect" coords="0,0,300,300"></map>
+<map name="passfield-&#x212a;illroyß"><area shape="rect" coords="0,0,300,300"></map>
+<map name="paßfield-killroyß"><area shape="rect" coords="0,0,300,300"></map>
+<map name="paẞfield-killroyß"><area shape="rect" coords="0,0,300,300"></map>
+<map name="passfield-killroyẞ"><area shape="rect" coords="0,0,300,300"></map>
+<map name="passfield-killroyß"><area shape="rect" coords="0,0,300,300"></map>
+<map name="passfıeld-killroyß"><area shape="rect" coords="0,0,300,300"></map>
+<map name="passfİeld-killroyß"><area shape="rect" coords="0,0,300,300"></map>
+
+<img src="/images/threecolors.png" usemap="#глупый" width="300" height="300">
+<map name="глупы&#x438;&#x306;"><area shape="rect" coords="0,0,300,300"></map>
+<map name="ГЛУПЫЙ"><area shape="rect" coords="0,0,300,300"></map>
+<map name="ГЛУПЫ&#x418;&#x306;"><area shape="rect" coords="0,0,300,300"></map>
+
+<img src="/images/threecolors.png" usemap="#åωk" width="300" height="300">
+<map name="ÅΩK"><area shape="rect" coords="0,0,300,300"></map>
+<map name="&#x212b;ωk"><area shape="rect" coords="0,0,300,300"></map>
+<map name="å&#x2126;k"><area shape="rect" coords="0,0,300,300"></map>
+<map name="åω&#x212a;"><area shape="rect" coords="0,0,300,300"></map>
+
+<img src="/images/threecolors.png" usemap="#blah1" width="300" height="300">
+<map name="blah&#x2460;"><area shape="rect" coords="0,0,300,300"></map>
+<map name="bl&#x24b6;h1"><area shape="rect" coords="0,0,300,300"></map>
+<map name="bl&#x24d0;h1"><area shape="rect" coords="0,0,300,300"></map>
+
+<img src="/images/threecolors.png" usemap="#t&Eacute;dz5アパートFi" width="300" height="300">
+<map name="T&Eacute;DZ5アパートFi"><area shape="rect" coords="0,0,300,300"></map>
+<map name="T&eacute;&#x01F1;&#x2075;アパートFi"><area shape="rect" coords="0,0,300,300"></map>
+<map name="t&Eacute;dz5&#x3300;Fi"><area shape="rect" coords="0,0,300,300"></map>
+<map name="t&Eacute;dz5&#x30A2;&#x30CF;&#x309A;&#x30FC;&#x30C8;Fi"><area shape="rect" coords="0,0,300,300"></map>
+<map name="T&Eacute;DZ⁵アパートFi"><area shape="rect" coords="0,0,300,300"></map>
+<map name="T&Eacute;DZ5アパートfi"><area shape="rect" coords="0,0,300,300"></map>
+
+<img src="/images/threecolors.png" usemap="#ΣΣ" width="300" height="300">
+<map name="σς"><area shape="rect" coords="0,0,300,300"></map>
+
+<script>
+"use strict";
+setup({ explicit_done: true });
+
+onload = () => {
+ test(() => {
+ const image = document.querySelector(`img[usemap="#sanityCheck"]`);
+ const imageRect = image.getBoundingClientRect();
+ const x = imageRect.left + imageRect.width / 2;
+ const y = imageRect.top + imageRect.height / 2;
+ const element = document.elementFromPoint(x, y);
+ const area = document.querySelector(`map[name="sanityCheck"] > area`);
+
+ assert_equals(element, area);
+ }, `Image with usemap of #sanityCheck should match the area with map named sanityCheck`);
+
+ const images = Array.from(document.querySelectorAll(`img:not([usemap="#sanityCheck"])`));
+
+ for (let image of images) {
+ test(() => {
+ const imageRect = image.getBoundingClientRect();
+ const x = imageRect.left + imageRect.width / 2;
+ const y = imageRect.top + imageRect.height / 2;
+ const element = document.elementFromPoint(x, y);
+
+ const name = element.parentElement.getAttribute("name");
+ const messageSuffix = name ? `; used <map> with name "${name}"` : "";
+
+ assert_equals(element, image, "The element retrieved must be the image, not an area" + messageSuffix);
+ }, `Image with usemap of ${image.useMap} should not match any of the areas`);
+ }
+
+ done();
+};
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-object-element/historical.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-object-element/historical.html
new file mode 100644
index 00000000000..0fba470303d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-object-element/historical.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<title>Historical object element features should not be supported</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id=log></div>
+<object id=object></object>
+<script>
+test(function() {
+ var elm = document.getElementById('object');
+ assert_equals(typeof elm, 'object', 'typeof');
+ assert_throws(new TypeError(), function() {
+ elm();
+ });
+}, 'object legacycaller should not be supported');
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-object-element/usemap-casing.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-object-element/usemap-casing.html
new file mode 100644
index 00000000000..cac7d470aed
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-object-element/usemap-casing.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>object usemap case-sensitive</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/infrastructure.html#rules-for-parsing-a-hash-name-reference">
+<!-- See also: https://github.com/whatwg/html/issues/1666 -->
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="log"></div>
+
+<object data="/images/threecolors.png" usemap="#sanityCheck" width="300" height="300"></object>
+<map name="sanityCheck"><area shape="rect" coords="0,0,300,300"></map>
+
+<object data="/images/threecolors.png" usemap="#sImPlE" width="300" height="300"></object>
+<map name="simple"><area shape="rect" coords="0,0,300,300"></map>
+<map name="SIMPLE"><area shape="rect" coords="0,0,300,300"></map>
+
+<object data="/images/threecolors.png" usemap="#paSSfield-killroyß" width="300" height="300"></object>
+<map name="passfield-killroyß"><area shape="rect" coords="0,0,300,300"></map>
+<map name="PASSFIELD-KILLROYß"><area shape="rect" coords="0,0,300,300"></map>
+<map name="paſſfield-killroyß"><area shape="rect" coords="0,0,300,300"></map>
+<map name="passfield-&#x212a;illroyß"><area shape="rect" coords="0,0,300,300"></map>
+<map name="paßfield-killroyß"><area shape="rect" coords="0,0,300,300"></map>
+<map name="paẞfield-killroyß"><area shape="rect" coords="0,0,300,300"></map>
+<map name="passfield-killroyẞ"><area shape="rect" coords="0,0,300,300"></map>
+<map name="passfield-killroyß"><area shape="rect" coords="0,0,300,300"></map>
+<map name="passfıeld-killroyß"><area shape="rect" coords="0,0,300,300"></map>
+<map name="passfİeld-killroyß"><area shape="rect" coords="0,0,300,300"></map>
+
+<object data="/images/threecolors.png" usemap="#глупый" width="300" height="300"></object>
+<map name="глупы&#x438;&#x306;"><area shape="rect" coords="0,0,300,300"></map>
+<map name="ГЛУПЫЙ"><area shape="rect" coords="0,0,300,300"></map>
+<map name="ГЛУПЫ&#x418;&#x306;"><area shape="rect" coords="0,0,300,300"></map>
+
+<object data="/images/threecolors.png" usemap="#åωk" width="300" height="300"></object>
+<map name="ÅΩK"><area shape="rect" coords="0,0,300,300"></map>
+<map name="&#x212b;ωk"><area shape="rect" coords="0,0,300,300"></map>
+<map name="å&#x2126;k"><area shape="rect" coords="0,0,300,300"></map>
+<map name="åω&#x212a;"><area shape="rect" coords="0,0,300,300"></map>
+
+<object data="/images/threecolors.png" usemap="#blah1" width="300" height="300"></object>
+<map name="blah&#x2460;"><area shape="rect" coords="0,0,300,300"></map>
+<map name="bl&#x24b6;h1"><area shape="rect" coords="0,0,300,300"></map>
+<map name="bl&#x24d0;h1"><area shape="rect" coords="0,0,300,300"></map>
+
+<object data="/images/threecolors.png" usemap="#t&Eacute;dz5アパートFi" width="300" height="300"></object>
+<map name="T&Eacute;DZ5アパートFi"><area shape="rect" coords="0,0,300,300"></map>
+<map name="T&eacute;&#x01F1;&#x2075;アパートFi"><area shape="rect" coords="0,0,300,300"></map>
+<map name="t&Eacute;dz5&#x3300;Fi"><area shape="rect" coords="0,0,300,300"></map>
+<map name="t&Eacute;dz5&#x30A2;&#x30CF;&#x309A;&#x30FC;&#x30C8;Fi"><area shape="rect" coords="0,0,300,300"></map>
+<map name="T&Eacute;DZ⁵アパートFi"><area shape="rect" coords="0,0,300,300"></map>
+<map name="T&Eacute;DZ5アパートfi"><area shape="rect" coords="0,0,300,300"></map>
+
+<object data="/images/threecolors.png" usemap="#ΣΣ" width="300" height="300"></object>
+<map name="σς"><area shape="rect" coords="0,0,300,300"></map>
+
+<script>
+"use strict";
+setup({ explicit_done: true });
+
+onload = () => {
+ test(() => {
+ const object = document.querySelector(`object[usemap="#sanityCheck"]`);
+ const objectRect = object.getBoundingClientRect();
+ const x = objectRect.left + objectRect.width / 2;
+ const y = objectRect.top + objectRect.height / 2;
+ const element = document.elementFromPoint(x, y);
+ const area = document.querySelector(`map[name="sanityCheck"] > area`);
+
+ assert_equals(element, area);
+ }, `Object with usemap of #sanityCheck should match the area with map named sanityCheck`);
+
+ const objects = Array.from(document.querySelectorAll(`object:not([usemap="#sanityCheck"])`));
+
+ for (let object of objects) {
+ test(() => {
+ const objectRect = object.getBoundingClientRect();
+ const x = objectRect.left + objectRect.width / 2;
+ const y = objectRect.top + objectRect.height / 2;
+ const element = document.elementFromPoint(x, y);
+
+ const name = element.parentElement.getAttribute("name");
+ const messageSuffix = name ? `; used <map> with name "${name}"` : "";
+
+ assert_equals(element, object, "The element retrieved must be the object, not an area" + messageSuffix);
+ }, `Object with usemap of ${object.useMap} should not match any of the areas`);
+ }
+
+ done();
+};
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-checkValidity.html b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-checkValidity.html
index 429fa32819c..2e790c75d82 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-checkValidity.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-checkValidity.html
@@ -15,7 +15,7 @@
types: ["text", "search", "tel", "password"],
testData: [
{conditions: {}, expected: true, name: "[target] no constraint"},
- {conditions: {maxLength: "4", value: "abcdef"}, expected: false, name: "[target] suffering from being too long", dirty: true},
+ {conditions: {maxLength: "4", value: "abcdef"}, expected: true, name: "[target] not suffering from being too long", dirty: true},
{conditions: {pattern: "[A-Z]", value: "abc"}, expected: false, name: "[target] suffering from a pattern mismatch"},
{conditions: {required: true, value: ""}, expected: false, name: "[target] suffering from being missing"}
]
@@ -25,7 +25,7 @@
types: ["url"],
testData: [
{conditions: {}, expected: true, name: "[target] no constraint"},
- {conditions: {maxLength: "20", value: "http://www.example.com"}, expected: false, name: "[target] suffering from being too long", dirty: true},
+ {conditions: {maxLength: "20", value: "http://www.example.com"}, expected: true, name: "[target] suffering from being too long", dirty: true},
{conditions: {pattern: "http://www.example.com", value: "http://www.example.net"}, expected: false, name: "[target] suffering from a pattern mismatch"},
{conditions: {value: "abc"}, expected: false, name: "[target] suffering from a type mismatch"},
{conditions: {required: true, value: ""}, expected: false, name: "[target] suffering from being missing"}
@@ -36,7 +36,7 @@
types: ["email"],
testData: [
{conditions: {}, expected: true, name: "[target] no constraint"},
- {conditions: {maxLength: "10", value: "test@example.com"}, expected: false, name: "[target] suffering from being too long", dirty: true},
+ {conditions: {maxLength: "10", value: "test@example.com"}, expected: true, name: "[target] not suffering from being too long", dirty: true},
{conditions: {pattern: "test@example.com", value: "test@example.net"}, expected: false, name: "[target] suffering from a pattern mismatch"},
{conditions: {value: "abc"}, expected: false, name: "[target] suffering from a type mismatch"},
{conditions: {required: true, value: ""}, expected: false, name: "[target] suffering from being missing"}
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-reportValidity.html b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-reportValidity.html
index e7f91051d8f..c68e21c9d5f 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-reportValidity.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-reportValidity.html
@@ -15,7 +15,7 @@
types: ["text", "search", "tel", "password"],
testData: [
{conditions: {}, expected: true, name: "[target] no constraint"},
- {conditions: {maxLength: "4", value: "abcdef"}, expected: false, name: "[target] suffering from being too long", dirty: true},
+ {conditions: {maxLength: "4", value: "abcdef"}, expected: true, name: "[target] not suffering from being too long", dirty: true},
{conditions: {pattern: "[A-Z]", value: "abc"}, expected: false, name: "[target] suffering from a pattern mismatch"},
{conditions: {required: true, value: ""}, expected: false, name: "[target] suffering from being missing"}
]
@@ -25,7 +25,7 @@
types: ["url"],
testData: [
{conditions: {}, expected: true, name: "[target] no constraint"},
- {conditions: {maxLength: "20", value: "http://www.example.com"}, expected: false, name: "[target] suffering from being too long", dirty: true},
+ {conditions: {maxLength: "20", value: "http://www.example.com"}, expected: true, name: "[target] not suffering from being too long", dirty: true},
{conditions: {pattern: "http://www.example.com", value: "http://www.example.net"}, expected: false, name: "[target] suffering from a pattern mismatch"},
{conditions: {value: "abc"}, expected: false, name: "[target] suffering from a type mismatch"},
{conditions: {required: true, value: ""}, expected: false, name: "[target] suffering from being missing"}
@@ -36,7 +36,7 @@
types: ["email"],
testData: [
{conditions: {}, expected: true, name: "[target] no constraint"},
- {conditions: {maxLength: "10", value: "test@example.com"}, expected: false, name: "[target] suffering from being too long", dirty: true},
+ {conditions: {maxLength: "10", value: "test@example.com"}, expected: true, name: "[target] not suffering from being too long", dirty: true},
{conditions: {pattern: "test@example.com", value: "test@example.net"}, expected: false, name: "[target] suffering from a pattern mismatch"},
{conditions: {value: "abc"}, expected: false, name: "[target] suffering from a type mismatch"},
{conditions: {required: true, value: ""}, expected: false, name: "[target] suffering from being missing"}
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-stepMismatch.html b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-stepMismatch.html
index b6239391ed6..174ecaf33a2 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-stepMismatch.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-stepMismatch.html
@@ -16,9 +16,9 @@
types: ["date"],
testData: [
{conditions: {step: "", value: "2000-01-01"}, expected: false, name: "[target] The step attribute is not set"},
- {conditions: {step: 2 * 1 * 86400000, value: ""}, expected: false, name: "[target] The value attibute is empty string"},
- {conditions: {step: 2 * 1 * 86400000, value: "1970-01-02"}, expected: false, name: "[target] The value must match the step"},
- {conditions: {step: 2 * 1 * 86400000, value: "1970-01-03"}, expected: true, name: "[target] The value must mismatch the step"}
+ {conditions: {step: 2, value: ""}, expected: false, name: "[target] The value attibute is empty string"},
+ {conditions: {step: 2, value: "1970-01-03"}, expected: false, name: "[target] The value must match the step"},
+ {conditions: {step: 2, value: "1970-01-02"}, expected: true, name: "[target] The value must mismatch the step"}
]
},
{
@@ -26,9 +26,9 @@
types: ["month"],
testData: [
{conditions: {step: "", value: "2000-01"}, expected: false, name: "[target] The step attribute is not set"},
- {conditions: {step: 2 * 1 * 1, value: ""}, expected: false, name: "[target] The value attibute is empty string"},
- {conditions: {step: 2 * 1 * 1, value: "1970-03"}, expected: false, name: "[target] The value must match the step"},
- {conditions: {step: 2 * 1 * 1, value: "1970-04"}, expected: true, name: "[target] The value must mismatch the step"}
+ {conditions: {step: 2, value: ""}, expected: false, name: "[target] The value attibute is empty string"},
+ {conditions: {step: 2, value: "1970-03"}, expected: false, name: "[target] The value must match the step"},
+ {conditions: {step: 2, value: "1970-04"}, expected: true, name: "[target] The value must mismatch the step"}
]
},
{
@@ -36,9 +36,9 @@
types: ["week"],
testData: [
{conditions: {step: "", value: "1970-W01"}, expected: false, name: "[target] The step attribute is not set"},
- {conditions: {step: 2 * 1 * 604800000, value: ""}, expected: false, name: "[target] The value attibute is empty string"},
- {conditions: {step: 2 * 1 * 604800000, value: "1970-W03"}, expected: false, name: "[target] The value must match the step"},
- {conditions: {step: 2 * 1 * 604800000, value: "1970-W04"}, expected: true, name: "[target] The value must mismatch the step"}
+ {conditions: {step: 2, value: ""}, expected: false, name: "[target] The value attibute is empty string"},
+ {conditions: {step: 2, value: "1970-W03"}, expected: false, name: "[target] The value must match the step"},
+ {conditions: {step: 2, value: "1970-W04"}, expected: true, name: "[target] The value must mismatch the step"}
]
},
{
@@ -46,9 +46,9 @@
types: ["time"],
testData: [
{conditions: {step: "", value: "12:00:00"}, expected: false, name: "[target] The step attribute is not set"},
- {conditions: {step: 2 * 60 * 1000, value: ""}, expected: false, name: "[target] The value attibute is empty string"},
- {conditions: {step: 2 * 60 * 1000, value: "12:02:00"}, expected: false, name: "[target] The value must match the step"},
- {conditions: {step: 2 * 60 * 1000, value: "12:03:00"}, expected: true, name: "[target] The value must mismatch the step"}
+ {conditions: {step: 2 * 60, value: ""}, expected: false, name: "[target] The value attibute is empty string"},
+ {conditions: {step: 2 * 60, value: "12:02:00"}, expected: false, name: "[target] The value must match the step"},
+ {conditions: {step: 2 * 60, value: "12:03:00"}, expected: true, name: "[target] The value must mismatch the step"}
]
},
{
@@ -56,9 +56,9 @@
types: ["datetime-local"],
testData: [
{conditions: {step: "", value: "2000-01-01T12:00:00"}, expected: false, name: "[target] The step attribute is not set"},
- {conditions: {step: 2 * 60 * 1000, value: ""}, expected: false, name: "[target] The value attibute is empty string"},
- {conditions: {step: 2 * 60 * 1000, value: "1970-01-01T12:02:00"}, expected: false, name: "[target] The value must match the step"},
- {conditions: {step: 2 * 60 * 1000, value: "1970-01-01T12:03:00"}, expected: true, name: "[target] The value must mismatch the step"}
+ {conditions: {step: 2 * 60, value: ""}, expected: false, name: "[target] The value attibute is empty string"},
+ {conditions: {step: 2 * 60, value: "1970-01-01T12:02:00"}, expected: false, name: "[target] The value must match the step"},
+ {conditions: {step: 2 * 60, value: "1970-01-01T12:03:00"}, expected: true, name: "[target] The value must mismatch the step"}
]
},
{
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valid.html b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valid.html
index bf312538f41..5dacfeae3a0 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valid.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/constraints/form-validation-validity-valid.html
@@ -14,7 +14,6 @@
tag: "input",
types: ["text", "search", "tel", "password"],
testData: [
- {conditions: {maxLength: "4", value: "abcdef"}, expected: false, name: "[target] validity.valid must be false if validity.tooLong is true", dirty: true},
{conditions: {pattern: "[A-Z]", value: "abc"}, expected: false, name: "[target] validity.valid must be false if validity.patternMismatch is true"},
{conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
]
@@ -23,7 +22,6 @@
tag: "input",
types: ["url"],
testData: [
- {conditions: {maxLength: "20", value: "http://www.example.com"}, expected: false, name: "[target] validity.valid must be false if validity.tooLong is true", dirty: true},
{conditions: {pattern: "http://www.example.com", value: "http://www.example.net"}, expected: false, name: "[target] validity.valid must be false if validity.patternMismatch is true"},
{conditions: {value: "abc"}, expected: false, name: "[target] validity.valid must be false if validity.typeMismatch is true"},
{conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
@@ -33,7 +31,6 @@
tag: "input",
types: ["email"],
testData: [
- {conditions: {maxLength: "10", value: "test@example.com"}, expected: false, name: "[target] validity.valid must be false if validity.tooLong is true", dirty: true},
{conditions: {pattern: "test@example.com", value: "test@example.net"}, expected: false, name: "[target] validity.valid must be false if validity.patternMismatch is true"},
{conditions: {value: "abc"}, expected: false, name: "[target] validity.valid must be false if validity.typeMismatch is true"},
{conditions: {required: true, value: ""}, expected: false, name: "[target] validity.valid must be false if validity.valueMissing is true"}
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-indexed-element.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-indexed-element.html
index 44471aa8ca3..66f00e7615d 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-indexed-element.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-indexed-element.html
@@ -18,5 +18,28 @@ test(function() {
assert_equals(form[1], document.getElementById("r2"));
assert_equals(form[2], undefined);
assert_equals(form[-1], undefined);
- }, "form.elements should be accessed correctly by index")
+}, "form.elements should be accessed correctly by index")
+
+test(function(){
+ var form = document.getElementById("form");
+ var old_item = form[0];
+ var old_desc = Object.getOwnPropertyDescriptor(form, 0);
+ assert_equals(old_desc.value, old_item);
+ assert_true(old_desc.enumerable);
+ assert_true(old_desc.configurable);
+ assert_false(old_desc.writable);
+
+ Object.prototype[0] = 5;
+ this.add_cleanup(function () { delete Object.prototype[0]; });
+ assert_equals(form[0], old_item);
+
+ delete form[0];
+ assert_equals(form[0], old_item);
+
+ assert_throws(new TypeError(), function() {
+ "use strict";
+ delete form[0];
+ });
+ assert_equals(form[0], old_item);
+}, 'Trying to delete an indexed property name should never work');
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-nameditem.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-nameditem.html
index f372742a721..3edf903b735 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-nameditem.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-nameditem.html
@@ -115,6 +115,11 @@ test(function() {
var button = document.getElementsByTagName("input")[0]
assert_equals(button.type, "button")
assert_equals(form.button, button)
+ var desc = Object.getOwnPropertyDescriptor(form, "button");
+ assert_equals(desc.value, button);
+ assert_false(desc.writable);
+ assert_true(desc.configurable);
+ assert_false(desc.enumerable);
assert_equals(form.button.length, undefined)
}, "Name for a single element should work")
@@ -222,6 +227,12 @@ test(function() {
assert_equals(input2.localName, "input")
assert_equals(input2.getAttribute("form"), "c")
+ var desc = Object.getOwnPropertyDescriptor(form, "d");
+ assert_equals(desc.value, form.d);
+ assert_false(desc.writable);
+ assert_true(desc.configurable);
+ assert_false(desc.enumerable);
+
assert_true(form.d instanceof NodeList, "form.d should be a NodeList")
assert_array_equals(form.d, [input1, input2])
}, "The form attribute should be taken into account for named getters (multiple elements)")
@@ -236,4 +247,84 @@ test(function() {
assert_equals(f.x, undefined)
assert_equals(g.x, input)
}, "Input should only be a named property on the innermost form that contains it")
+
+test(function() {
+ var form = document.getElementsByTagName("form")[1];
+ var old_item = form["l1"];
+ var old_desc = Object.getOwnPropertyDescriptor(form, "l1");
+ assert_equals(old_desc.value, old_item);
+ assert_false(old_desc.enumerable);
+ assert_true(old_desc.configurable);
+ assert_false(old_desc.writable);
+
+ form["l1"] = 5;
+ assert_equals(form["l1"], old_item);
+ assert_throws(new TypeError(), function() {
+ "use strict";
+ form["l1"] = 5;
+ });
+ assert_throws(new TypeError(), function() {
+ Object.defineProperty(form, "l1", { value: 5 });
+ });
+
+ delete form["l1"];
+ assert_equals(form["l1"], old_item);
+
+ assert_throws(new TypeError(), function() {
+ "use strict";
+ delete form["l1"];
+ });
+ assert_equals(form["l1"], old_item);
+
+}, 'Trying to set an expando that would shadow an already-existing named property');
+
+test(function() {
+ var form = document.getElementsByTagName("form")[1];
+ var old_item = form["new-name"];
+ var old_desc = Object.getOwnPropertyDescriptor(form, "new-name");
+ assert_equals(old_item, undefined);
+ assert_equals(old_desc, undefined);
+
+ form["new-name"] = 5;
+ assert_equals(form["new-name"], 5);
+
+ var input = document.createElement("input");
+ this.add_cleanup(function () {input.remove();});
+ input.name = "new-name";
+ form.appendChild(input);
+
+ assert_equals(form["new-name"], 5);
+
+ delete form["new-name"];
+ assert_equals(form["new-name"], input);
+}, 'Trying to set an expando that shadows a named property that gets added later');
+
+test(function() {
+ var form = document.getElementsByTagName("form")[1];
+ var old_item = form["new-name2"];
+ var old_desc = Object.getOwnPropertyDescriptor(form, "new-name2");
+ assert_equals(old_item, undefined);
+ assert_equals(old_desc, undefined);
+
+ Object.defineProperty(form, "new-name2", { configurable: false, writable:
+ false, value: 5 });
+ assert_equals(form["new-name2"], 5);
+
+ var input = document.createElement("input");
+ this.add_cleanup(function () {input.remove();});
+ input.name = "new-name2";
+ form.appendChild(input);
+
+ assert_equals(form["new-name2"], 5);
+
+ delete form["new-name2"];
+ assert_equals(form["new-name2"], 5);
+
+ assert_throws(new TypeError(), function() {
+ "use strict";
+ delete form["new-name2"];
+ });
+ assert_equals(form["new-name2"], 5);
+}, 'Trying to set a non-configurable expando that shadows a named property that gets added later');
+
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/radio-groupname-case.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/radio-groupname-case.html
index 05192fc7df4..3c54aca3e76 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/radio-groupname-case.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/radio-groupname-case.html
@@ -1,11 +1,16 @@
<!DOCTYPE html>
<meta charset=utf-8>
-<title>radio group name compatibility caseless</title>
+<title>radio group name case-sensitive</title>
<link rel="author" title="Denis Ah-Kang" href="mailto:denis@w3.org">
-<link rel="help" href="http://people.mozilla.org/~jdaggett/tests/radiobuttonnamecase.html">
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/forms.html#radio-button-group">
+<!-- See also: https://github.com/whatwg/html/issues/1666 -->
+
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+
<div id="log"></div>
+
<input id=r1 type="radio" name="sImPlE">
<input id=r2 type="radio" name="simple">
<input id=r3 type="radio" name="SIMPLE">
@@ -43,33 +48,36 @@
<input id=r30 type="radio" name="T&eacute;&#x01F1;&#x2075;アパートFi">
<input id=r31 type="radio" name="t&Eacute;dz5&#x3300;Fi">
<input id=r32 type="radio" name="t&Eacute;dz5&#x30A2;&#x30CF;&#x309A;&#x30FC;&#x30C8;Fi">
-<input id=r33 type="radio" name="t&Eacute;dz5&#x30A2;&#x30D1;&#x30FC;&#x30C8;Fi">
<input id=r34 type="radio" name="T&Eacute;DZ⁵アパートFi">
<input id=r35 type="radio" name="T&Eacute;DZ5アパートfi">
<input id=r36 type="radio" name="ΣΣ">
<input id=r37 type="radio" name="σς">
+
<script>
- var groups = [["r1" ,"r2", "r3"],
- ["r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14"],
- ["r15", "r16", "r17", "r18"],
- ["r19", "r20", "r21", "r22", "r23"],
- ["r24", "r25", "r26", "r27"],
- ["r28", "r29", "r30", "r31", "r32", "r33", "r34", "r35"],
- ["r36", "r37"]],
- groupName = ["sImPlE", "paSSfield-killroyß", "глупый", "åωk", "blah1", "tÉdz5アパートFi", "ΣΣ"];
- groups.forEach(function(group, index) {
- test(function(){
- group.forEach(function(radioId) {
- assert_false(document.getElementById(radioId).checked);
- });
- for (var i = 0; i < group.length; i++) {
- document.getElementById(group[i]).checked = true;
- assert_true(document.getElementById(group[i]).checked);
- for (var j = 0; j < group.length; j++) {
- if (j != i) assert_false(document.getElementById(group[j]).checked);
- }
- }
- }, "radio button group name = " + groupName[index]);
- });
+"use strict";
+const notGroups = {
+ "sImPlE": ["r1" ,"r2", "r3"],
+ "paSSfield-killroyß": ["r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14"],
+ "глупый": ["r15", "r16", "r17", "r18"],
+ "åωk": ["r19", "r20", "r21", "r22", "r23"],
+ "blah1": ["r24", "r25", "r26", "r27"],
+ "tÉdz5アパートFi": ["r28", "r29", "r30", "r31", "r32", "r34", "r35"],
+ "ΣΣ": ["r36", "r37"]
+};
+
+for (let notGroupLabel of Object.keys(notGroups)) {
+ test(() => {
+ const ids = notGroups[notGroupLabel];
+ const radios = ids.map(id => document.getElementById(id));
+
+ for (let radio of radios) {
+ radio.checked = true;
+ }
+
+ for (let radio of radios) {
+ assert_true(radio.checked, `${radio.name} must be checked`);
+ }
+ }, `Among names like ${notGroupLabel}, everything must be checkable at the same time`);
+}
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-meter-element/meter.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-meter-element/meter.html
index 7a77513d31e..1c1ce4f18c2 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/the-meter-element/meter.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-meter-element/meter.html
@@ -42,7 +42,6 @@
var meters = [
{value: 0, expectedValue: 0, expectedMin: 0, expectedMax: 1.0, expectedLow: 0, expectedHigh: 1.0, expectedOptimum: 0.5, testname: "Default values"},
{value: 3, expectedValue: 3, min: -10.1, expectedMin: -10.1, max: 10.1, expectedMax: 10.1, low: -9.1, expectedLow: -9.1, high: 9.1, expectedHigh: 9.1, optimum: 3, expectedOptimum: 3, testname: "Setting values to min, max, low, high and optimum"},
- {value: "foobar", expectedValue: 0, min: "foobar", expectedMin: 0, max: "foobar", expectedMax: 1.0, low: "foobar", expectedLow: 0, high: "foobar", expectedHigh: 1.0, optimum: "foobar", expectedOptimum: 0.5, testname: "Invalid floating-point number values"},
{value: 0, expectedValue: 0, min: 0, expectedMin: 0, max: -1.0, expectedMax: 0, expectedLow: 0, expectedHigh: 0, expectedOptimum: 0, testname: "max < min"},
{value: 0, expectedValue: 10, min: 10, expectedMin: 10, max: 20, expectedMax: 20, expectedLow: 10, expectedHigh: 20, expectedOptimum: 15, testname: "value < min"},
{value: 30, expectedValue: 20, min: 10, expectedMin: 10, max: 20, expectedMax: 20, expectedLow: 10, expectedHigh: 20, expectedOptimum: 15, testname: "value > max"},
@@ -71,6 +70,15 @@
assert_equals(meter.optimum, m.expectedOptimum, "optimum value");
}, m.testname);
}
+ test(function() {
+ var meter = document.createElement("meter");
+ assert_throws(new TypeError(), function() { meter.value = "foobar"; }, "value attribute");
+ assert_throws(new TypeError(), function() { meter.min = "foobar"; }, "min attribute");
+ assert_throws(new TypeError(), function() { meter.max = "foobar"; }, "max attribute");
+ assert_throws(new TypeError(), function() { meter.low = "foobar"; }, "low attribute");
+ assert_throws(new TypeError(), function() { meter.high = "foobar"; }, "high attribute");
+ assert_throws(new TypeError(), function() { meter.optimum = "foobar"; }, "optimum attribute");
+ }, "Invalid floating-point number values");
</script>
<script type="text/javascript">
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-001-ref.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-001-ref.html
index 5ff5296e2a1..23b6cdabe80 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-001-ref.html
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-001-ref.html
@@ -11,9 +11,7 @@
<h1>Description</h1>
<p>This test continues to validate the li element.</p>
- <p>The spec states:</p>
- <blockquote>"If the parent element is an ol element, then the li element has an ordinal value. The value attribute is processed relative to the element's parent ol element (q.v.), if there is one. If there is not, the attribute has no effect."</blockquote>
- <p>This reftest verifies that the value attribute has no effect when applied to a list item NOT having an ol parent.</p>
+ <p>This reftest verifies that the value attribute has no effect when applied to a list item NOT having an ol parent and not marked as display: list-item.</p>
<p>A reftest is necessary because the values of li elements as calculated by the user agent are NOT available programatically. Only explicitly-set values are then available programatically.</p>
<p>This reftest passes if you see NO sequencing information on any of the items below.</p>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-001.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-001.html
index 71b72c2ce9e..86200edadf3 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-001.html
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-001.html
@@ -12,9 +12,7 @@
<h1>Description</h1>
<p>This test continues to validate the li element.</p>
- <p>The spec states:</p>
- <blockquote>"If the parent element is an ol element, then the li element has an ordinal value. The value attribute is processed relative to the element's parent ol element (q.v.), if there is one. If there is not, the attribute has no effect."</blockquote>
- <p>This reftest verifies that the value attribute has no effect when applied to a list item NOT having an ol parent.</p>
+ <p>This reftest verifies that the value attribute has no effect when applied to a list item NOT having an ol parent and not marked as display: list-item.</p>
<p>A reftest is necessary because the values of li elements as calculated by the user agent are NOT available programatically. Only explicitly-set values are then available programatically.</p>
<p>This reftest passes if you see NO sequencing information on any of the items below.</p>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-002-ref.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-002-ref.html
index bdb728fafd3..1e453e1afb3 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-002-ref.html
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-002-ref.html
@@ -15,8 +15,6 @@
<h1>Description</h1>
<p>This test continues to validate the li element.</p>
- <p>The spec states:</p>
- <blockquote>"If the parent element is an ol element, then the li element has an ordinal value. The value attribute is processed relative to the element's parent ol element (q.v.), if there is one. If there is not, the attribute has no effect."</blockquote>
<p>This reftest verifies that the value attribute has an effect when applied to a list item with an ol parent.</p>
<p>A reftest is necessary because the values of li elements as calculated by the user agent are NOT available programatically. Only explicitly-set values are then available programatically.</p>
<p>This reftest passes if you see the numbers 1. 2. 3. below the words "Ordered List"</p>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-002.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-002.html
index ae4eebee196..3c0a464255d 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-002.html
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-002.html
@@ -18,8 +18,6 @@
<h1>Description</h1>
<p>This test continues to validate the li element.</p>
- <p>The spec states:</p>
- <blockquote>"If the parent element is an ol element, then the li element has an ordinal value. The value attribute is processed relative to the element's parent ol element (q.v.), if there is one. If there is not, the attribute has no effect."</blockquote>
<p>This reftest verifies that the value attribute has an effect when applied to a list item with an ol parent.</p>
<p>A reftest is necessary because the values of li elements as calculated by the user agent are NOT available programatically. Only explicitly-set values are then available programatically.</p>
<p>This reftest passes if you see the numbers 1. 2. 3. below the words "Ordered List"</p>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-display-list-item-ref.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-display-list-item-ref.html
new file mode 100644
index 00000000000..fb142f84b83
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-display-list-item-ref.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>display: list-item on non-&lt;li> elements</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#ordinal-value">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#list-owner">
+
+<style>
+ .list-item {
+ display: list-item;
+ list-style-type: decimal;
+ }
+
+ .list-item[hidden] {
+ display: none;
+ }
+</style>
+
+<p>This test matches if both lists display similar to the following:</p>
+
+<pre>1. A
+2. B
+ D
+3. E</pre>
+
+<hr>
+
+<ol>
+ <li value="1">A</li>
+ <li value="2">B</li>
+ <span>D</span>
+ <li value="3">E</li>
+</ol>
+
+<ol>
+ <li value="1">A</li>
+ <li value="2">B</li>
+ <span>D</span>
+ <li value="3">E</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-display-list-item.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-display-list-item.html
new file mode 100644
index 00000000000..ce63cf7c7c0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-display-list-item.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>display: list-item on non-&lt;li> elements</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#ordinal-value">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#list-owner">
+
+<link rel="match" href="grouping-li-reftest-display-list-item-ref.html">
+
+<style>
+ .list-item {
+ display: list-item;
+ list-style-type: decimal;
+ }
+
+ .list-item[hidden] {
+ display: none;
+ }
+</style>
+
+<p>This test matches if both lists display similar to the following:</p>
+
+<pre>1. A
+2. B
+ D
+3. E</pre>
+
+<hr>
+
+<ul>
+ <span class="list-item">A</span>
+ <span class="list-item">B</span>
+ <span class="list-item" hidden>C</span>
+ <span>D</span>
+ <span class="list-item">E</span>
+</ul>
+
+<ol>
+ <div class="list-item">A</div>
+ <div class="list-item">B</div>
+ <div class="list-item" hidden>C</div>
+ <div>D</div>
+ <div class="list-item">E</div>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu-ref.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu-ref.html
new file mode 100644
index 00000000000..2b1ea76656f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu-ref.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>list owner is calculated to be narest ancestor menu if it exists</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#ordinal-value">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#list-owner">
+
+<p>This test matches if the list displays similar to the following</p>
+
+<pre>1. A
+2. B
+3. C
+4. D
+5. E
+ 1. F
+ 2. G
+6. H
+ 1. I
+ 2. J
+ 1. K
+ 2. L</pre>
+
+<hr>
+
+<ol>
+ <li value="1">A</li>
+ <li value="2">B</li>
+ <li value="3">C</li>
+ <li value="4">D</li>
+ <li value="5">E</li>
+ <ol>
+ <li value="1">F</li>
+ <li value="2">G</li>
+ </ol>
+ <li value="6">H</li>
+ <ol>
+ <li value="1">I</li>
+ <li value="2">
+ J
+ <ol>
+ <li value="1">K</li>
+ <li value="2">L</li>
+ </ol>
+ </li>
+ </ol>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu.html
new file mode 100644
index 00000000000..86afa5d2067
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>list owner is calculated to be narest ancestor menu if it exists</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#ordinal-value">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#list-owner">
+
+<link rel="match" href="grouping-li-reftest-list-owner-menu-ref.html">
+
+<style>
+ li {
+ list-style-type: decimal;
+ }
+</style>
+
+<p>This test matches if the list displays similar to the following</p>
+
+<pre>1. A
+2. B
+3. C
+4. D
+5. E
+ 1. F
+ 2. G
+6. H
+ 1. I
+ 2. J
+ 1. K
+ 2. L</pre>
+
+<hr>
+
+<menu>
+ <li>A</li>
+ <li>B</li>
+ <div>
+ <li>C</li>
+ <span>
+ <li>D</li>
+ <li>E</li>
+ </span>
+ <menu>
+ <li>F</li>
+ <li>G</li>
+ </menu>
+ </div>
+ <li>H</li>
+ <menu>
+ <li>I</li>
+ <li>
+ J
+ <menu>
+ <li>K</li>
+ <li>L</li>
+ </menu>
+ </li>
+ </menu>
+</menu>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-mixed-ref.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-mixed-ref.html
new file mode 100644
index 00000000000..b72768aefc5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-mixed-ref.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>list owner is calculated to be nearest ancestor ul or ul (but not dir) if it exists</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#ordinal-value">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#list-owner">
+
+<style>
+ li {
+ list-style-type: decimal;
+ }
+</style>
+
+<p>This test matches if the list displays similar to the following</p>
+
+<pre>1. A
+2. B
+3. C
+4. D
+5. E
+ 1. F
+ 2. G
+6. H
+ 1. I
+ 2. J
+ 3. K
+ 4. L</pre>
+
+<hr>
+
+<ol>
+ <li value="1">A</li>
+ <li value="2">B</li>
+ <li value="3">C</li>
+ <li value="4">D</li>
+ <li value="5">E</li>
+ <ol>
+ <li value="1">F</li>
+ <li value="2">G</li>
+ </ol>
+ <li value="6">H</li>
+ <ol>
+ <li value="1">I</li>
+ <li value="2">
+ J
+ <dir>
+ <li value="3">K</li>
+ <li value="4">L</li>
+ </dir>
+ </li>
+ </ol>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-mixed.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-mixed.html
new file mode 100644
index 00000000000..82e39f995ec
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-mixed.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>list owner is calculated to be nearest ancestor ul or ul (but not dir) if it exists</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#ordinal-value">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#list-owner">
+
+<link rel="match" href="grouping-li-reftest-list-owner-mixed-ref.html">
+
+<style>
+ li {
+ list-style-type: decimal;
+ }
+
+ .list-item {
+ display: list-item;
+ list-style-type: decimal;
+ }
+
+</style>
+
+<p>This test matches if the list displays similar to the following</p>
+
+<pre>1. A
+2. B
+3. C
+4. D
+5. E
+ 1. F
+ 2. G
+6. H
+ 1. I
+ 2. J
+ 3. K
+ 4. L</pre>
+
+<hr>
+
+<ul>
+ <li>A</li>
+ <li>B</li>
+ <div>
+ <li>C</li>
+ <span>
+ <li>D</li>
+ <li>E</li>
+ </span>
+ <ol>
+ <li>F</li>
+ <span class="list-item">G</span>
+ </ol>
+ </div>
+ <li>H</li>
+ <ol>
+ <li>I</li>
+ <li>
+ J
+ <dir>
+ <li>K</li>
+ <li>L</li>
+ </dir>
+ </li>
+ </ol>
+</ul>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-not-dir-ref.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-not-dir-ref.html
new file mode 100644
index 00000000000..fad00fa3bde
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-not-dir-ref.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>The dir element is not treated specially when calculating list owners</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#ordinal-value">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#list-owner">
+
+<style>
+ li {
+ list-style-type: decimal;
+ }
+</style>
+
+<p>This test matches if the list displays similar to the following</p>
+
+<pre>1. A
+2. B
+3. C
+4. D
+5. E
+ 6. F
+ 7. G
+8. H
+ 9. I
+ 10. J
+ 11. K
+ 12. L</pre>
+
+<hr>
+
+<ol>
+ <li value="1">A</li>
+ <li value="2">B</li>
+ <li value="3">C</li>
+ <li value="4">D</li>
+ <li value="5">E</li>
+ <dir>
+ <li value="6">F</li>
+ <li value="7">G</li>
+ </dir>
+ <li value="8">H</li>
+ <dir>
+ <li value="9">I</li>
+ <li value="10">
+ J
+ <dir>
+ <li value="11">K</li>
+ <li value="12">L</li>
+ </dir>
+ </li>
+ </dir>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-not-dir.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-not-dir.html
new file mode 100644
index 00000000000..747d90738b0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-not-dir.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>The dir element is not treated specially when calculating list owners</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#ordinal-value">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#list-owner">
+
+<link rel="match" href="grouping-li-reftest-list-owner-not-dir-ref.html">
+
+<style>
+ li {
+ list-style-type: decimal;
+ }
+</style>
+
+<p>This test matches if the list displays similar to the following</p>
+
+<pre>1. A
+2. B
+3. C
+4. D
+5. E
+ 6. F
+ 7. G
+8. H
+ 9. I
+ 10. J
+ 11. K
+ 12. L</pre>
+
+<hr>
+
+<ol>
+ <li>A</li>
+ <li>B</li>
+ <div>
+ <li>C</li>
+ <span>
+ <li>D</li>
+ <li>E</li>
+ </span>
+ <dir>
+ <li>F</li>
+ <li>G</li>
+ </dir>
+ </div>
+ <li>H</li>
+ <dir>
+ <li>I</li>
+ <li>
+ J
+ <dir>
+ <li>K</li>
+ <li>L</li>
+ </dir>
+ </li>
+ </dir>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ol-ref.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ol-ref.html
new file mode 100644
index 00000000000..96cc9c3600d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ol-ref.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>list owner is calculated to be narest ancestor ol if it exists</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#ordinal-value">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#list-owner">
+
+<p>This test matches if the list displays similar to the following</p>
+
+<pre>1. A
+2. B
+3. C
+4. D
+5. E
+ 1. F
+ 2. G
+6. H
+ 1. I
+ 2. J
+ 1. K
+ 2. L</pre>
+
+<hr>
+
+<ol>
+ <li value="1">A</li>
+ <li value="2">B</li>
+ <li value="3">C</li>
+ <li value="4">D</li>
+ <li value="5">E</li>
+ <ol>
+ <li value="1">F</li>
+ <li value="2">G</li>
+ </ol>
+ <li value="6">H</li>
+ <ol>
+ <li value="1">I</li>
+ <li value="2">
+ J
+ <ol>
+ <li value="1">K</li>
+ <li value="2">L</li>
+ </ol>
+ </li>
+ </ol>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ol.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ol.html
new file mode 100644
index 00000000000..fcb93cfbb53
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ol.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>list owner is calculated to be narest ancestor ol if it exists</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#ordinal-value">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#list-owner">
+
+<link rel="match" href="grouping-li-reftest-list-owner-ol-ref.html">
+
+<p>This test matches if the list displays similar to the following</p>
+
+<pre>1. A
+2. B
+3. C
+4. D
+5. E
+ 1. F
+ 2. G
+6. H
+ 1. I
+ 2. J
+ 1. K
+ 2. L</pre>
+
+<hr>
+
+<ol>
+ <li>A</li>
+ <li>B</li>
+ <div>
+ <li>C</li>
+ <span>
+ <li>D</li>
+ <li>E</li>
+ </span>
+ <ol>
+ <li>F</li>
+ <li>G</li>
+ </ol>
+ </div>
+ <li>H</li>
+ <ol>
+ <li>I</li>
+ <li>
+ J
+ <ol>
+ <li>K</li>
+ <li>L</li>
+ </ol>
+ </li>
+ </ol>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-parent-ref.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-parent-ref.html
new file mode 100644
index 00000000000..03a0570ba40
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-parent-ref.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>list owner is calculated to be the parent if there is no ancestor ul/ol/menu</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#ordinal-value">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#list-owner">
+
+<style>
+ li {
+ list-style-type: decimal;
+ list-style-position: inside;
+ }
+
+ ol {
+ padding: 50px;
+ margin: 0;
+ }
+</style>
+
+<p>This test matches if the list displays similar to the following</p>
+
+<pre>1. A
+2. B
+1. C
+1. D
+ 1. E
+3. F</pre>
+
+<hr>
+
+<ol>
+ <li value="1">A</li>
+ <li value="2">B</li>
+ <li value="1">C</li>
+ <li value="1">D</li>
+ <blockquote>
+ <li value="1">E</li>
+ </blockquote>
+ <li value="3">F</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-parent.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-parent.html
new file mode 100644
index 00000000000..0345add996e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-parent.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>list owner is calculated to be the parent if there is no ancestor ul/ol/menu</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#ordinal-value">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#list-owner">
+
+<link rel="match" href="grouping-li-reftest-list-owner-parent-ref.html">
+
+<style>
+ li {
+ list-style-type: decimal;
+ list-style-position: inside;
+ }
+
+ .container {
+ padding: 50px;
+ }
+</style>
+
+<p>This test matches if the list displays similar to the following</p>
+
+<pre>1. A
+2. B
+1. C
+1. D
+ 1. E
+3. F</pre>
+
+<hr>
+
+<div class="container">
+ <li>A</li>
+ <li>B</li>
+ <div>
+ <li>C</li>
+ <span>
+ <li>D</li>
+ </span>
+ </div>
+ <blockquote>
+ <li>E</li>
+ </blockquote>
+ <li>F</li>
+</div>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes-ref.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes-ref.html
new file mode 100644
index 00000000000..e758f52be96
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes-ref.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>list owner calculation skips elements that do not generate layout boxes</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#ordinal-value">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#list-owner">
+
+<p>This test matches if the list displays similar to the following</p>
+
+<pre>1. A
+2. B
+3. C
+4. D
+5. E
+6. F
+7. G
+8. H
+9. I
+10. J
+ 1. K
+ 2. L</pre>
+
+<hr>
+
+<ol>
+ <li value="1">A</li>
+ <li value="2">B</li>
+ <li value="3">C</li>
+ <li value="4">D</li>
+ <li value="5">E</li>
+ <li value="6">F</li>
+ <li value="7">G</li>
+ <li value="8">H</li>
+ <li value="9">I</li>
+ <li value="10">
+ J
+ <ol>
+ <li value="1">K</li>
+ <li value="2">L</li>
+ </ol>
+ </li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes.html
new file mode 100644
index 00000000000..defdcb70003
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-skip-no-boxes.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>list owner calculation skips elements that do not generate layout boxes</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#ordinal-value">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#list-owner">
+
+<link rel="match" href="grouping-li-reftest-list-owner-skip-no-boxes-ref.html">
+
+<p>This test matches if the list displays similar to the following</p>
+
+<pre>1. A
+2. B
+3. C
+4. D
+5. E
+6. F
+7. G
+8. H
+9. I
+10. J
+ 1. K
+ 2. L</pre>
+
+<hr>
+
+<ol>
+ <li>A</li>
+ <li>B</li>
+ <div>
+ <li>C</li>
+ <span>
+ <li>D</li>
+ <li>E</li>
+ </span>
+ <ol style="display: contents;">
+ <li>F</li>
+ <li>G</li>
+ </ol>
+ </div>
+ <li>H</li>
+ <ol style="display: contents;">
+ <li>I</li>
+ <li>
+ J
+ <ol>
+ <li>K</li>
+ <li>L</li>
+ </ol>
+ </li>
+ </ol>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ul-ref.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ul-ref.html
new file mode 100644
index 00000000000..22ee9f437f1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ul-ref.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>list owner is calculated to be nearest ancestor ul if it exists</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#ordinal-value">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#list-owner">
+
+<p>This test matches if the list displays similar to the following</p>
+
+<pre>1. A
+2. B
+3. C
+4. D
+5. E
+ 1. F
+ 2. G
+6. H
+ 1. I
+ 2. J
+ 1. K
+ 2. L</pre>
+
+<hr>
+
+<ol>
+ <li value="1">A</li>
+ <li value="2">B</li>
+ <li value="3">C</li>
+ <li value="4">D</li>
+ <li value="5">E</li>
+ <ol>
+ <li value="1">F</li>
+ <li value="2">G</li>
+ </ol>
+ <li value="6">H</li>
+ <ol>
+ <li value="1">I</li>
+ <li value="2">
+ J
+ <ol>
+ <li value="1">K</li>
+ <li value="2">L</li>
+ </ol>
+ </li>
+ </ol>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ul.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ul.html
new file mode 100644
index 00000000000..8f1c7e3766a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-ul.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>list owner is calculated to be nearest ancestor ul if it exists</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#ordinal-value">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#list-owner">
+
+<link rel="match" href="grouping-li-reftest-list-owner-ul-ref.html">
+
+<style>
+ li {
+ list-style-type: decimal;
+ }
+</style>
+
+<p>This test matches if the list displays similar to the following</p>
+
+<pre>1. A
+2. B
+3. C
+4. D
+5. E
+ 1. F
+ 2. G
+6. H
+ 1. I
+ 2. J
+ 1. K
+ 2. L</pre>
+
+<hr>
+
+<ul>
+ <li>A</li>
+ <li>B</li>
+ <div>
+ <li>C</li>
+ <span>
+ <li>D</li>
+ <li>E</li>
+ </span>
+ <ul>
+ <li>F</li>
+ <li>G</li>
+ </ul>
+ </div>
+ <li>H</li>
+ <ul>
+ <li>I</li>
+ <li>
+ J
+ <ul>
+ <li>K</li>
+ <li>L</li>
+ </ul>
+ </li>
+ </ul>
+</ul>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-no-list-owner-ref.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-no-list-owner-ref.html
new file mode 100644
index 00000000000..e3ed2a51482
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-no-list-owner-ref.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>If no ancestors generate CSS boxes, the list item has no owner, and thus gets numbered as 0</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#ordinal-value">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#list-owner">
+
+<style>
+ html, body {
+ display: contents;
+ }
+
+ li {
+ list-style-type: decimal;
+ margin-left: 50px;
+ }
+</style>
+
+<p>This test matches if the list displays similar to the following</p>
+
+<pre>0. A
+0. B
+0. C</pre>
+
+<hr>
+
+<li value="0">A</li>
+<li value="0">B</li>
+<li value="0">C</li>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-no-list-owner.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-no-list-owner.html
new file mode 100644
index 00000000000..02fdd63de8c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-no-list-owner.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>If no ancestors generate CSS boxes, the list item has no owner, and thus gets numbered as 0</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#ordinal-value">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#list-owner">
+
+<link rel="match" href="grouping-li-reftest-no-list-owner-ref.html">
+
+<style>
+ html, body {
+ display: contents;
+ }
+
+ li {
+ list-style-type: decimal;
+ margin-left: 50px;
+ }
+</style>
+
+<p>This test matches if the list displays similar to the following</p>
+
+<pre>0. A
+0. B
+0. C</pre>
+
+<hr>
+
+<li>A</li>
+<li>B</li>
+<li>C</li>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-not-being-rendered-ref.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-not-being-rendered-ref.html
new file mode 100644
index 00000000000..9a018cfaf3e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-not-being-rendered-ref.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>List items that are not being rendered do not participate in numbering</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#ordinal-value">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#list-owner">
+
+<p>This test matches if the list displays similar to the following</p>
+
+<pre>1. A
+2. B
+3. D
+4. E
+5. G</pre>
+
+<hr>
+
+<ol>
+ <li value="1">A</li>
+ <li value="2">B</li>
+ <li value="3">D</li>
+ <li value="4">E</li>
+ <li value="5">G</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-not-being-rendered.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-not-being-rendered.html
new file mode 100644
index 00000000000..da476c4bffc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/grouping-li-reftest-not-being-rendered.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>List items that are not being rendered do not participate in numbering</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#ordinal-value">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#list-owner">
+
+<link rel="match" href="grouping-li-reftest-not-being-rendered-ref.html">
+
+<p>This test matches if the list displays similar to the following</p>
+
+<pre>1. A
+2. B
+3. D
+4. E
+5. G</pre>
+
+<hr>
+
+<ol>
+ <li>A</li>
+ <li>B</li>
+ <li hidden>C</li>
+ <li>D</li>
+ <div>
+ <li>E</li>
+ <li hidden>F</li>
+ <li>G</li>
+ </div>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/.gitkeep b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/.gitkeep
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/.gitkeep
+++ /dev/null
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-rev-reftest-001-ref.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-rev-reftest-001-ref.html
index 019aef1b6ff..8da32887f8e 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-rev-reftest-001-ref.html
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-rev-reftest-001-ref.html
@@ -17,9 +17,6 @@
<p>These reftests are necessary because the values of the ol's li children as calculated by the user agent are NOT available programatically. Only explicitly-set values are available programatically. Therefore, we need to check actual rendering against expected rendering.</p>
- <p>The spec states:</p>
- <blockquote>"The reversed attribute is a boolean attribute. If present, it indicates that the list is a descending list (..., 3, 2, 1). If the attribute is omitted, the list is an ascending list (1, 2, 3, ...)."</blockquote>
-
<p><strong>This reftest passes if you see an ascending list followed by two descending lists.</strong></p>
<p>(Note: each list item has no content; only the sequencing should appear.)</p>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-rev-reftest-001.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-rev-reftest-001.html
index 32d4f2c86f9..7c502e38357 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-rev-reftest-001.html
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-rev-reftest-001.html
@@ -20,9 +20,6 @@
<p>These reftests are necessary because the values of the ol's li children as calculated by the user agent are NOT available programatically. Only explicitly-set values are available programatically. Therefore, we need to check actual rendering against expected rendering.</p>
- <p>The spec states:</p>
- <blockquote>"The reversed attribute is a boolean attribute. If present, it indicates that the list is a descending list (..., 3, 2, 1). If the attribute is omitted, the list is an ascending list (1, 2, 3, ...)."</blockquote>
-
<p><strong>This reftest passes if you see an ascending list followed by two descending lists.</strong></p>
<p>(Note: each list item has no content; only the sequencing should appear.)</p>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-001-ref.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-001-ref.html
index f87074899a5..0f651183a8d 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-001-ref.html
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-001-ref.html
@@ -14,10 +14,6 @@
<body>
<p>This test continues to validate the ol element. This reftest is necessary because the values of the ol's li children as calculated and displayed by the user agent are NOT systematically available programatically. Only explicitly-set values are available programatically. Therefore, we need to check actual rendering against expected rendering.</p>
- <p>The spec states:</p>
- <blockquote><p>The first item in the list has the ordinal value given by the ol element's start attribute, unless that li element has a value attribute with a value that can be successfully parsed, in which case it has the ordinal value given by that value attribute.</p>
- <p>Each subsequent item in the list has the ordinal value given by its value attribute, if it has one, or, if it doesn't, the ordinal value of the previous item, plus one if the reversed is absent, or minus one if it is present.</p></blockquote>
-
<p><strong>This reftest passes if each list's items are numbered identically to the horizontal sequence immediately above those list items.</strong></p>
<p>(Note: each list item has no content; only the sequencing should appear.)</p>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-001.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-001.html
index dc373f91019..b6de3dbb4b1 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-001.html
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-001.html
@@ -17,10 +17,6 @@
<body>
<p>This test continues to validate the ol element. This reftest is necessary because the values of the ol's li children as calculated and displayed by the user agent are NOT systematically available programatically. Only explicitly-set values are available programatically. Therefore, we need to check actual rendering against expected rendering.</p>
- <p>The spec states:</p>
- <blockquote><p>The first item in the list has the ordinal value given by the ol element's start attribute, unless that li element has a value attribute with a value that can be successfully parsed, in which case it has the ordinal value given by that value attribute.</p>
- <p>Each subsequent item in the list has the ordinal value given by its value attribute, if it has one, or, if it doesn't, the ordinal value of the previous item, plus one if the reversed is absent, or minus one if it is present.</p></blockquote>
-
<p><strong>This reftest passes if each list's items are numbered identically to the horizontal sequence immediately above those list items.</strong></p>
<p>(Note: each list item has no content; only the sequencing should appear.)</p>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-002-ref.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-002-ref.html
index 2ba4af9b100..2dbdf4aa744 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-002-ref.html
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-002-ref.html
@@ -14,10 +14,6 @@
<body>
<p>This test continues to validate the ol element. This reftest is necessary because the values of the ol's li children as calculated and displayed by the user agent are NOT systematically available programatically. Only explicitly-set values are available programatically. Therefore, we need to check actual rendering against expected rendering.</p>
- <p>The spec states:</p>
- <blockquote><p>The first item in the list has the ordinal value given by the ol element's start attribute, unless that li element has a value attribute with a value that can be successfully parsed, in which case it has the ordinal value given by that value attribute.</p>
- <p>Each subsequent item in the list has the ordinal value given by its value attribute, if it has one, or, if it doesn't, the ordinal value of the previous item, plus one if the reversed is absent, or minus one if it is present.</p></blockquote>
-
<p><strong>This reftest passes if each list's items are numbered identically to the horizontal sequence immediately above those list items.</strong></p>
<p>(Note: each list item has no content; only the sequencing should appear.)</p>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-002.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-002.html
index 559e3c21967..9b21c79496f 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-002.html
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-start-reftest-002.html
@@ -17,10 +17,6 @@
<body>
<p>This test continues to validate the ol element. This reftest is necessary because the values of the ol's li children as calculated and displayed by the user agent are NOT systematically available programatically. Only explicitly-set values are available programatically. Therefore, we need to check actual rendering against expected rendering.</p>
- <p>The spec states:</p>
- <blockquote><p>The first item in the list has the ordinal value given by the ol element's start attribute, unless that li element has a value attribute with a value that can be successfully parsed, in which case it has the ordinal value given by that value attribute.</p>
- <p>Each subsequent item in the list has the ordinal value given by its value attribute, if it has one, or, if it doesn't, the ordinal value of the previous item, plus one if the reversed is absent, or minus one if it is present.</p></blockquote>
-
<p><strong>This reftest passes if each list's items are numbered identically to the horizontal sequence immediately above those list items.</strong></p>
<p>(Note: each list item has no content; only the sequencing should appear.)</p>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-001-ref.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-001-ref.html
index 294c9abc2d2..391859efc63 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-001-ref.html
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-001-ref.html
@@ -14,9 +14,6 @@
<body>
<p>This test continues to validate the ol element. This reftest is necessary because the values of the ol's li children as calculated and displayed by the user agent are NOT systematically available programatically. Only explicitly-set values are available programatically. Therefore, we need to check actual rendering against expected rendering.</p>
- <p>The spec states:</p>
- <blockquote><p>The type attribute represents the state given in the cell in the second column of the row whose first cell matches the attribute's value; if none of the cells match, or if the attribute is omitted, then the attribute represents the decimal state.</p></blockquote>
-
<p><strong>This reftest passes if each list's items are labelled identically to the horizontal sequence immediately above those list items:</strong></p>
<p>(Note: each list item has no content; only the sequencing should appear.)</p>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-001.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-001.html
index 32b0e200ba5..b7dc22d779a 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-001.html
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-001.html
@@ -16,9 +16,6 @@
<body>
<p>This test continues to validate the ol element. This reftest is necessary because the values of the ol's li children as calculated and displayed by the user agent are NOT systematically available programatically. Only explicitly-set values are available programatically. Therefore, we need to check actual rendering against expected rendering.</p>
- <p>The spec states:</p>
- <blockquote><p>The type attribute represents the state given in the cell in the second column of the row whose first cell matches the attribute's value; if none of the cells match, or if the attribute is omitted, then the attribute represents the decimal state.</p></blockquote>
-
<p><strong>This reftest passes if each list's items are labelled identically to the horizontal sequence immediately above those list items:</strong></p>
<p>(Note: each list item has no content; only the sequencing should appear.)</p>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-002-ref.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-002-ref.html
index cf31b7a9c2e..8d8012e8eda 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-002-ref.html
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-002-ref.html
@@ -14,9 +14,6 @@
<body>
<p>This test continues to validate the ol element. This reftest is necessary because the values of the ol's li children as calculated and displayed by the user agent are NOT systematically available programatically. Only explicitly-set values are available programatically. Therefore, we need to check actual rendering against expected rendering.</p>
- <p>The spec states:</p>
- <blockquote>User agents should render the items of the list in a manner consistent with the state of the type attribute of the ol element.</blockquote>
-
<p><strong>This reftest passes if each list's items are labelled identically to the horizontal sequence immediately above those list items:</strong></p>
<p>(Note: each list item has no content; only the sequencing should appear.)</p>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-002.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-002.html
index 7daea54c027..db55fd4bc41 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-002.html
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-002.html
@@ -16,9 +16,6 @@
<body>
<p>This test continues to validate the ol element. This reftest is necessary because the values of the ol's li children as calculated and displayed by the user agent are NOT systematically available programatically. Only explicitly-set values are available programatically. Therefore, we need to check actual rendering against expected rendering.</p>
- <p>The spec states:</p>
- <blockquote>User agents should render the items of the list in a manner consistent with the state of the type attribute of the ol element.</blockquote>
-
<p><strong>This reftest passes if each list's items are labelled identically to the horizontal sequence immediately above those list items:</strong></p>
<p>(Note: each list item has no content; only the sequencing should appear.)</p>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-003-ref.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-003-ref.html
index 4906f3ca6df..6c836cf3675 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-003-ref.html
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-003-ref.html
@@ -14,8 +14,6 @@
<body>
<p>This test continues to validate the ol element. This reftest is necessary because the values of the ol's li children as calculated and displayed by the user agent are NOT systematically available programatically. Only explicitly-set values are available programatically. Therefore, we need to check actual rendering against expected rendering.</p>
- <p>The spec states: Numbers less than or equal to zero should always use the decimal system regardless of the type attribute.</p>
-
<p><strong>This reftest passes if each list's items are labelled identically to the horizontal sequence immediately above those list items:</strong></p>
<p>(Note: each list item has no content; only the sequencing should appear.)</p>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-003.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-003.html
index 5e4b5a58885..654287298f8 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-003.html
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol-type-reftest-003.html
@@ -16,8 +16,6 @@
<body>
<p>This test continues to validate the ol element. This reftest is necessary because the values of the ol's li children as calculated and displayed by the user agent are NOT systematically available programatically. Only explicitly-set values are available programatically. Therefore, we need to check actual rendering against expected rendering.</p>
- <p>The spec states: Numbers less than or equal to zero should always use the decimal system regardless of the type attribute.</p>
-
<p><strong>This reftest passes if each list's items are labelled identically to the horizontal sequence immediately above those list items:</strong></p>
<p>(Note: each list item has no content; only the sequencing should appear.)</p>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol.html
index 0de2a064103..80fa734a92e 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol.html
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/grouping-ol.html
@@ -230,83 +230,68 @@
// is the number of child li elements otherwise."
// "The start IDL attribute has the same default as its content attribute."
- // basic - default should be 1
test(function() {
- assert_equals(document.getElementById("basic").start, 1, "no start attribute provided -> 1");
+ assert_equals(document.getElementById("basic").start, 1);
}, "Default start value for non-reversed list should be 1");
- // decimal's first element has value of .5 which should return 1
test(function() {
- assert_equals(document.getElementById("decimal").start, 1, "start of .5 -> 1 (default)");
+ assert_equals(document.getElementById("decimal").start, 1);
}, "IDL and content attribute parse start of '.5' correctly.");
- // letter's first element has value of A which should return 1
test(function() {
- assert_equals(document.getElementById("letter").start, 1, "start of A -> 1 (default)");
+ assert_equals(document.getElementById("letter").start, 1);
}, "IDL and content attribute parse start of 'A' correctly.");
- // basicRevGoodName - default should be 3
test(function() {
- assert_equals(document.getElementById("basicRevGoodName").start, 3, "no start attribute provided -> 3");
- }, "Default start value (if none provided) for reversed list = child li elements.");
+ assert_equals(document.getElementById("basicRevGoodName").start, 1);
+ }, "Default start value (if none provided) for reversed list = 1.");
- // basicRevEmpty - default should be 3
test(function() {
- assert_equals(document.getElementById("basicRevEmpty").start, 3, "start of A -> 3 (default)");
- }, "Default start value (if failed to parse) for reversed list = child li elements.");
+ assert_equals(document.getElementById("basicRevEmpty").start, 1);
+ }, "Default start value (if failed to parse) for reversed list = 1.");
- // lots - default should be 3
test(function() {
- assert_equals(document.getElementById("lots").start, 3, "no start attribute -> 3 (default)");
- }, "Default start value for reversed list = child li elements (even with tons of other child elements).");
+ assert_equals(document.getElementById("lots").start, 1);
+ }, "Default start value for reversed list = 1 (even with tons of other child elements).");
- // adding child element changes default start value for reversed list
test(function() {
var myList = document.getElementById("basicRevGoodName"), myLI = document.createElement("li");
myList.appendChild(myLI);
- assert_equals(document.getElementById("basicRevGoodName").start, 4, "Adding child element to reversed list adds 1 to start value");
- }, "Adding child element to reversed list adds 1 to start value");
+ assert_equals(document.getElementById("basicRevGoodName").start, 1);
+ }, "Adding child element to reversed list does not change start value");
- // removing child element changes default start value for reversed list
test(function() {
var myList = document.getElementById("basicRevTrue");
myList.removeChild(myList.children[0]);
- assert_equals(document.getElementById("basicRevTrue").start, 2, "Deleting child element from reversed list reduces start value by 1");
- }, "Deleting child element from reversed list reduces start value by 1");
+ assert_equals(document.getElementById("basicRevTrue").start, 1);
+ }, "Deleting child element from reversed list does not change start value");
- // start2's first element has value of 2
test(function() {
- assert_equals(document.getElementById("start2").start, 2, "start of 2 -> 2");
+ assert_equals(document.getElementById("start2").start, 2);
}, "IDL and content attribute parse start of '2' correctly.");
- // negative's first element has value of -10
test(function() {
- assert_equals(document.getElementById("negative").start, -10, "start of -10 -> -10");
+ assert_equals(document.getElementById("negative").start, -10);
}, "IDL and content attribute parse start of '-10' correctly.");
- // posFloatDown's first element has value of 4.03 which should return 4
test(function() {
- assert_equals(document.getElementById("posFloatDown").start, 4, "start of 4.03 -> 4");
+ assert_equals(document.getElementById("posFloatDown").start, 4);
}, "IDL and content attribute parse start of '4.03' correctly.");
- // negFloatDown's first element has value of -4.03 which should return -4
test(function() {
- assert_equals(document.getElementById("negFloatDown").start, -4, "start of -4.03 -> -4");
+ assert_equals(document.getElementById("negFloatDown").start, -4);
}, "IDL and content attribute parse start of '-4.03' correctly.");
- // posFloatUp's first element has value of 4.9 which should return 4
test(function() {
- assert_equals(document.getElementById("posFloatUp").start, 4, "start of 4.9 -> 4");
+ assert_equals(document.getElementById("posFloatUp").start, 4);
}, "IDL and content attribute parse start of '4.9' correctly.");
- // negFloatUp's first element has value of -4.9 which should return -4
test(function() {
- assert_equals(document.getElementById("negFloatUp").start, -4, "start of -4.9 -> -4");
+ assert_equals(document.getElementById("negFloatUp").start, -4);
}, "IDL and content attribute parse start of '-4.9' correctly.");
- // exponent's first element has value of 7e2 which should return 7
test(function() {
- assert_equals(document.getElementById("exponent").start, 7, "start of 7e2 -> 7");
+ assert_equals(document.getElementById("exponent").start, 7);
}, "IDL and content attribute parse start of '7e2' correctly.");
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/ol.start-reflection-2.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/ol.start-reflection-2.html
index f6a260a8b4e..c7c9aeab481 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/ol.start-reflection-2.html
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/ol.start-reflection-2.html
@@ -18,7 +18,7 @@
<div id='log'></div>
<script>
test(function() {
- assert_equals(document.getElementById('ol').start, 3);
+ assert_equals(document.getElementById('ol').start, 1);
})
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1a.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1a.html
index 35e967c05e6..202315b1c6b 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1a.html
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1a.html
@@ -1,4 +1,8 @@
<!DOCTYPE html>
+<meta charset=utf-8>
+<title>`reversed` should reverse the numbering correctly</title>
+<link rel=match href="reversed-1-ref.html">
+<link rel=help href="https://html.spec.whatwg.org/#attr-ol-reversed">
<ol reversed>
<li>Three</li>
<li>Two</li>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1b.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1b.html
index d9810560eb7..4d6202943d0 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1b.html
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1b.html
@@ -1,4 +1,8 @@
<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Dynamically setting `reversed` should update the numbering</title>
+<link rel=match href="reversed-1-ref.html">
+<link rel=help href="https://html.spec.whatwg.org/#attr-ol-reversed">
<ol id="x">
<li>Three</li>
<li>Two</li>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1c.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1c.html
index 82ae844335e..6fad13053f1 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1c.html
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1c.html
@@ -1,4 +1,8 @@
<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Reversed numbering should update on dynamic addition of child nodes</title>
+<link rel=match href="reversed-1-ref.html">
+<link rel=help href="https://html.spec.whatwg.org/#attr-ol-reversed">
<ol id="x" reversed>
<li>Three</li>
<li>Two</li>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1d.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1d.html
new file mode 100644
index 00000000000..a256b6a428f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1d.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Reverse numbering should not be affected by nested div</title>
+<link rel=match href="reversed-1-ref.html">
+<link rel=help href="https://html.spec.whatwg.org/#attr-ol-reversed">
+<ol reversed>
+ <li>Three</li>
+ <div>
+ <li>Two</li>
+ <li>One</li>
+ </div>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1e.html b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1e.html
new file mode 100644
index 00000000000..48a27999423
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-ol-element/reversed-1e.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Reverse numbering should not count display:none elements</title>
+<link rel=match href="reversed-1-ref.html">
+<link rel=help href="https://html.spec.whatwg.org/#attr-ol-reversed">
+<ol reversed>
+ <li>Three</li>
+ <li style="display:none">Three</li>
+ <li>Two</li>
+ <li>One</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html b/tests/wpt/web-platform-tests/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html
new file mode 100644
index 00000000000..3d22481d29f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html
@@ -0,0 +1,78 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Test behavior of rel="noopener" links</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<iframe name="oursubframe"></iframe>
+<a href="support/noopener-target-2.html" rel="noopener" target="ourpopup"></a>
+<a href="support/noopener-target-2.html" rel="noopener" target="oursubframe"></a>
+<script>
+var tests = [];
+// First test the special targets
+function target1Loaded(win) {
+ // Find the relevant test
+ var test = tests.find((t) => t.openedWindow == win);
+ test.step(function() {
+ assert_equals(win.opener, window);
+ win.close();
+ test.done();
+ });
+}
+/**
+ * Test that <a rel="noopener"> targeted at one of _self, _parent, _top does the
+ * load in the appropriate existing browsing context instead of opening a new
+ * one. The test is run in a separate popup window we open and which we can
+ * navigate without causing the test harness going into conniptions.
+ */
+for (var target of ["self", "parent", "top"]) {
+ var t = async_test("Check that rel=noopener with target=_" + target + " does a normal load");
+ tests.push(t);
+ t.openedWindow = window.open("support/noopener-popup.html");
+ t.targetName = target;
+ t.openedWindow.onload = t.step_func(function() {
+ this.openedWindow.findLink(this.targetName).click();
+ });
+}
+
+/**
+ * And now check that a noopener load targeted at something other than one of
+ * the three special targets above in fact ignores existing things with the
+ * given name. We do this in two ways. First, by opening a window named
+ * "ourpopup" and then doing a load via <a rel="noopener" target="ourpopup"> and
+ * verifying that the load happens in a window with a null opener, etc, while
+ * the opener of the thing we opened is not modified. And second, by targeting
+ * <a rel="noopener"> at a name that an existing subframe has, and ensuring that
+ * this subframe is not navigated.
+ */
+var t1 = async_test("Check that targeting of rel=noopener with a given name ignores an existing window with that name");
+var w;
+t1.add_cleanup(function() { w.close(); });
+var channel = new BroadcastChannel("ourpopup");
+channel.onmessage = t1.step_func_done(function(e) {
+ var data = e.data;
+ assert_false(data.hasOpener);
+ assert_false(data.hasParent);
+ assert_equals(data.name, "ourpopup");
+ assert_equals(w.opener, window);
+ assert_equals(w.location.href, "about:blank");
+});
+t1.step(function() {
+ w = window.open("", "ourpopup");
+ assert_equals(w.opener, window);
+ document.querySelectorAll("a")[0].click();
+});
+
+var t2 = async_test("Check that targeting of rel=noopener with a given name ignores an existing subframe with that name");
+var channel = new BroadcastChannel("oursubframe");
+channel.onmessage = t2.step_func_done(function(e) {
+ var data = e.data;
+ assert_false(data.hasOpener);
+ assert_false(data.hasParent);
+ assert_equals(data.name, "oursubframe");
+ assert_equals(document.querySelector("iframe").contentWindow.location.href,
+ "about:blank");
+});
+t2.step(function() {
+ document.querySelectorAll("a")[1].click();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/links/links-created-by-a-and-area-elements/support/noopener-popup.html b/tests/wpt/web-platform-tests/html/semantics/links/links-created-by-a-and-area-elements/support/noopener-popup.html
new file mode 100644
index 00000000000..2057dbf0bea
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/links/links-created-by-a-and-area-elements/support/noopener-popup.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<script>
+ function findLink(arg) {
+ var doc;
+ if (arg == "self") {
+ doc = document;
+ } else {
+ doc = frames[0].document;
+ }
+ return doc.getElementById(arg + "target");
+ }
+</script>
+<a rel="noopener" target="_self" id="selftarget"
+ href="noopener-target-1.html"></a>
+<iframe srcdoc='
+ <a rel="noopener" target="_parent" id="parenttarget"
+ href="noopener-target-1.html"></a>
+ <a rel="noopener" target="_top" id="toptarget"
+ href="noopener-target-1.html"></a>'></iframe>
diff --git a/tests/wpt/web-platform-tests/html/semantics/links/links-created-by-a-and-area-elements/support/noopener-target-1.html b/tests/wpt/web-platform-tests/html/semantics/links/links-created-by-a-and-area-elements/support/noopener-target-1.html
new file mode 100644
index 00000000000..0dbd14275cb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/links/links-created-by-a-and-area-elements/support/noopener-target-1.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<script>
+ opener.target1Loaded(this);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/links/links-created-by-a-and-area-elements/support/noopener-target-2.html b/tests/wpt/web-platform-tests/html/semantics/links/links-created-by-a-and-area-elements/support/noopener-target-2.html
new file mode 100644
index 00000000000..dd2d719134f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/links/links-created-by-a-and-area-elements/support/noopener-target-2.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<script>
+ var channel = new BroadcastChannel(this.name);
+ channel.postMessage({ hasOpener: opener !== null ,
+ hasParent: parent != this,
+ name: window.name });
+ window.close();
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/data-url.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/data-url.html
new file mode 100644
index 00000000000..86190b6cf9f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/data-url.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>data URL and scripts</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id=log></div>
+<script>
+ setup({allow_uncaught_exception:true})
+ async_test(t => {
+ var counter = 1
+ window.onerror = t.step_func((message, x, xx, xxx, e) => {
+ assert_not_equals(message, "Script error.") // Cannot be "muted" as data URLs are same-origin
+ assert_equals(typeof e, "number")
+ assert_equals(e, counter)
+ if (counter == 3) {
+ t.done()
+ }
+ counter++
+ })
+ })
+</script>
+<script src="data:,throw 1"></script>
+<script src="data:,throw 2" crossorigin></script>
+<script src="data:,throw 3" crossorigin=use-credentials></script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-1.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-1.html
new file mode 100644
index 00000000000..0fe39b11a81
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-1.html
@@ -0,0 +1,12 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Test that the insertion point is defined in the error event of a parser-inserted script that actually started a fetch (but just had it fail).</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+ var t = async_test("");
+ var writeDone = t.step_func_done(function(text) {
+ assert_equals(text, "Some text");
+ });
+</script>
+<iframe src="support/script-onerror-insertion-point-1-helper.html"></iframe>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-2.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-2.html
new file mode 100644
index 00000000000..6d3f3ef09ee
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-onerror-insertion-point-2.html
@@ -0,0 +1,13 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Test that the insertion point is not defined in the error event of a
+ parser-inserted script that has an unparseable URL</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+ var t = async_test("");
+ var writeDone = t.step_func_done(function(text) {
+ assert_equals(text, "text");
+ });
+</script>
+<iframe src="support/script-onerror-insertion-point-2-helper.html"></iframe>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-onload-insertion-point.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-onload-insertion-point.html
new file mode 100644
index 00000000000..ce3ddeee65f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-onload-insertion-point.html
@@ -0,0 +1,12 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Test that the insertion point is defined in the load event of a parser-inserted script.</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+ var t = async_test("");
+ var writeDone = t.step_func_done(function(text) {
+ assert_equals(text, "Some text");
+ });
+</script>
+<iframe src="support/script-onload-insertion-point-helper.html"></iframe>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/support/script-onerror-insertion-point-1-helper.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/support/script-onerror-insertion-point-1-helper.html
new file mode 100644
index 00000000000..d9b0c84ca4f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/support/script-onerror-insertion-point-1-helper.html
@@ -0,0 +1,2 @@
+Some <script src="nosuchscripthere.js"
+ onerror="document.write('text'); parent.writeDone(document.documentElement.textContent)"></script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/support/script-onerror-insertion-point-2-helper.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/support/script-onerror-insertion-point-2-helper.html
new file mode 100644
index 00000000000..7a173981562
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/support/script-onerror-insertion-point-2-helper.html
@@ -0,0 +1,2 @@
+Some <script src="http://this is not parseable"
+ onerror="document.write('text'); parent.writeDone(document.documentElement.textContent)"></script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/support/script-onload-insertion-point-helper.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/support/script-onload-insertion-point-helper.html
new file mode 100644
index 00000000000..f0236b4fbb3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/support/script-onload-insertion-point-helper.html
@@ -0,0 +1,2 @@
+Some <script src="script-onload-insertion-point-helper.js"
+ onload="document.write('xt'); parent.writeDone(document.documentElement.textContent)"></script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/support/script-onload-insertion-point-helper.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/support/script-onload-insertion-point-helper.js
new file mode 100644
index 00000000000..8a96a0b783e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/support/script-onload-insertion-point-helper.js
@@ -0,0 +1 @@
+document.write("te");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-template-element/template-element/node-document-changes.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-template-element/template-element/node-document-changes.html
index 8027fbb9196..0c60c10738d 100644
--- a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-template-element/template-element/node-document-changes.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-template-element/template-element/node-document-changes.html
@@ -14,7 +14,6 @@
<div id="log"></div>
<script type="text/javascript">
-
test(function() {
var doc1 = newHTMLDocument();
var template = doc1.createElement('template');
@@ -35,7 +34,6 @@ test(function() {
}, 'Changing of template element\'s node document. ' +
'Test that ownerDocument of an empty template and its content changes');
-
test(function() {
var doc1 = newHTMLDocument();
doc1.body.innerHTML = '<template id="tmpl"><div>Div content</div> And some more text</template>';
@@ -63,7 +61,6 @@ test(function() {
}, 'Changing of template element\'s node document. ' +
'Test that ownerDocument of a not empty template and its content changes');
-
test(function() {
var doc1 = newHTMLDocument();
doc1.body.innerHTML = ''
@@ -109,7 +106,6 @@ test(function() {
}, 'Changing of template element\'s node document. ' +
'Test that ownerDocument of nested template and its content changes');
-
testInIFrame('../resources/template-contents.html', function(context) {
var doc1 = context.iframes[0].contentDocument;
@@ -131,7 +127,6 @@ testInIFrame('../resources/template-contents.html', function(context) {
}, 'Changing of template element\'s node document. ' +
'Test document loaded from a file');
-
testInIFrame('../resources/template-contents.html', function(context) {
var doc1 = context.iframes[0].contentDocument;
@@ -161,7 +156,6 @@ testInIFrame('../resources/template-contents.html', function(context) {
}, 'Changing of template element\'s node document. ' +
'Adobt template element into a document that has a browsing context');
-
testInIFrame('../resources/template-contents.html', function(context) {
var doc1 = context.iframes[0].contentDocument;
@@ -173,7 +167,6 @@ testInIFrame('../resources/template-contents.html', function(context) {
doc2.body.appendChild(template);
-
assert_not_equals(template.ownerDocument, doc1,
'Template node owner document should be changed');
assert_not_equals(template.content.ownerDocument, templateContentOwner,
diff --git a/tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/indeterminate.html b/tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/indeterminate.html
index ffe607389a4..df048466766 100644
--- a/tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/indeterminate.html
+++ b/tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/indeterminate.html
@@ -24,7 +24,7 @@
testSelectorIdsMatch(":indeterminate", ["radio4", "radio5", "progress1"], "dynamically check a radio input in a radio button group");
document.getElementById("radio4").click();
- testSelectorIdsMatch(":indeterminate", ["checkbox1", "progress2"], "click on radio4 which is in the indeterminate state");
+ testSelectorIdsMatch(":indeterminate", ["progress1"], "click on radio4 which is in the indeterminate state");
document.getElementById("progress1").setAttribute("value", "20");
testSelectorIdsMatch(":indeterminate", [], "adding a value to progress1 should put it in a determinate state");
diff --git a/tests/wpt/web-platform-tests/html/semantics/tabular-data/the-table-element/remove-row.html b/tests/wpt/web-platform-tests/html/semantics/tabular-data/the-table-element/remove-row.html
index b0e529f91ec..dc152292e27 100644
--- a/tests/wpt/web-platform-tests/html/semantics/tabular-data/the-table-element/remove-row.html
+++ b/tests/wpt/web-platform-tests/html/semantics/tabular-data/the-table-element/remove-row.html
@@ -42,9 +42,23 @@ test(function() {
assert_equals(old_length, el.rows.length);
}, "check normal deleteRow");
test(function() {
- while (el.rows.length > 1) {
+ assert_equals(el.rows.length, 3);
+ do {
+ var old_length = el.rows.length;
el.deleteRow(-1);
- }
- assert_equals(1, el.rows.length);
+ assert_equals(el.rows.length, old_length - 1);
+ } while (el.rows.length);
}, "check normal deleteRow bis");
+
+test(function() {
+ assert_equals(el.rows.length, 0);
+ el.deleteRow(-1);
+}, 'deleteRow(-1) with no rows');
+
+test(function() {
+ assert_equals(el.rows.length, 0);
+ assert_throws("IndexSizeError", function() {
+ el.deleteRow(0);
+ });
+}, 'deleteRow(0) with no rows');
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/tabular-data/the-tbody-element/deleteRow.html b/tests/wpt/web-platform-tests/html/semantics/tabular-data/the-tbody-element/deleteRow.html
index c81abd82600..5e50a318739 100644
--- a/tests/wpt/web-platform-tests/html/semantics/tabular-data/the-tbody-element/deleteRow.html
+++ b/tests/wpt/web-platform-tests/html/semantics/tabular-data/the-tbody-element/deleteRow.html
@@ -51,4 +51,11 @@ test(function () {
assert_equals(tbody.rows.length, 0);
}, "HTMLTableSectionElement deleteRow(-1) with no rows");
+test(function () {
+ assert_equals(tbody.rows.length, 0);
+ assert_throws("IndexSizeError", function () {
+ tbody.deleteRow(0);
+ });
+}, "HTMLTableSectionElement deleteRow(0) with no rows");
+
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/tabular-data/the-tr-element/deleteCell.html b/tests/wpt/web-platform-tests/html/semantics/tabular-data/the-tr-element/deleteCell.html
index 1400d32e1b1..aa15ef77ec2 100644
--- a/tests/wpt/web-platform-tests/html/semantics/tabular-data/the-tr-element/deleteCell.html
+++ b/tests/wpt/web-platform-tests/html/semantics/tabular-data/the-tr-element/deleteCell.html
@@ -51,4 +51,11 @@ test(function () {
assert_equals(tr.cells.length, 0);
}, "HTMLTableRowElement deleteCell(-1) with no cells");
+test(function () {
+ assert_equals(tr.cells.length, 0);
+ assert_throws("IndexSizeError", function () {
+ tr.deleteCell(0);
+ });
+}, "HTMLTableRowElement deleteCell(0) with no cells");
+
</script>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-exception.html b/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-exception.html
new file mode 100644
index 00000000000..fecda221dec
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-exception.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>requestIdleCallback callback exception reported to error handler</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id="log"></div>
+<script>
+ var custom_exception = 'requestIdleCallbackException';
+ setup({allow_uncaught_exception : true});
+ async_test(function (t) {
+ assert_false(document.hidden, "document.hidden must exist and be false to run this test properly");
+ addEventListener("error",function(e) {
+ t.step(function() {
+ assert_equals(e.error.message, custom_exception);
+ t.done();
+ })
+ });
+ window.requestIdleCallback(function () {
+ throw new Error(custom_exception);
+ });
+ }, "requestIdleCallback callback exceptions are reported to error handler");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-iframe.html b/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-iframe.html
new file mode 100644
index 00000000000..965941be107
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-iframe.html
@@ -0,0 +1,17 @@
+<!doctype html>
+<meta charset=utf-8>
+<title></title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id="log"></div>
+<iframe style="display:none" id="frame"></iframe>
+<script>
+ async_test(function (t) {
+ let frame = document.getElementById("frame");
+ frame.contentWindow.test = function() {
+ frame.contentWindow.requestIdleCallback(t.step_func_done());
+ }
+
+ frame.contentWindow.test();
+ });
+</script>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-invoked.html b/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-invoked.html
new file mode 100644
index 00000000000..5e799cf39f9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-invoked.html
@@ -0,0 +1,12 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>requestIdleCallback callback must be called eventually</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id="log"></div>
+<script>
+ async_test(function (t) {
+ assert_false(document.hidden, "document.hidden must exist and be false to run this test properly");
+ window.requestIdleCallback(t.step_func_done());
+ }, "requestIdleCallback callback is invoked at least once before the timeout");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-multiple-calls.html b/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-multiple-calls.html
new file mode 100644
index 00000000000..8584c71daf1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-multiple-calls.html
@@ -0,0 +1,41 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>multiple calls to requestIdleCallback</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id="log"></div>
+<script>
+ async_test(function (t) {
+ assert_false(document.hidden, "document.hidden must exist and be false to run this test properly");
+ var counter = 0;
+ function f(c) {
+ assert_equals(counter, c);
+ if (counter === 99) {
+ t.done();
+ }
+
+ ++counter;
+ }
+ for (var i = 0; i < 100; ++i) {
+ let j = i;
+ window.requestIdleCallback(t.step_func(function () { f(j) }));
+ }
+ }, "requestIdleCallback callbacks should be invoked in order (called iteratively)");
+
+ async_test(function (t) {
+ assert_false(document.hidden, "document.hidden must exist and be false to run this test properly");
+ var counter = 0;
+
+ function f(c) {
+ assert_equals(counter, c);
+ if (counter === 99) {
+ t.done();
+ }
+
+ ++counter;
+ window.requestIdleCallback(t.step_func(function () { f(c + 1) }));
+ }
+
+ window.requestIdleCallback(t.step_func(function () { f(0) }));
+ }, "requestIdleCallback callbacks should be invoked in order (called recursively)");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-timeout.html b/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-timeout.html
new file mode 100644
index 00000000000..823d5f5db47
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-timeout.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>requestIdleCallback timeout callback must be called with didTimeout equal to true</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id="log"></div>
+<script>
+ async_test(function (t) {
+ assert_false(document.hidden, "document.hidden must exist and be false to run this test properly");
+ var counter = 0;
+
+ function g(deadline) {
+ assert_true(deadline.didTimeout)
+ t.done();
+ }
+
+ function f(deadline) {
+ assert_false(deadline.didTimeout);
+ window.requestIdleCallback(t.step_func(g), {timeout:300});
+
+ var d = Date.now() + 500;
+ while (Date.now() < d) {
+
+ }
+ }
+ window.requestIdleCallback(t.step_func(f));
+ }, "requestIdleCallback callback should time out");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/cancel-invoked.html b/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/cancel-invoked.html
new file mode 100644
index 00000000000..8956b8709dc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/cancel-invoked.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>cancelling idle requests</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id="log"></div>
+<script>
+ test(function (t) {
+ window.cancelIdleCallback(42);
+ assert_true(true);
+ }, "cancelIdleCallback does nothing if there is no callback with the given handle");
+
+ async_test(function (t) {
+ assert_false(document.hidden, "document.hidden must exist and be false to run this test properly");
+ var neverCalled = true;
+ var handle = window.requestIdleCallback(function () {
+ neverCalled = false;
+ });
+ window.cancelIdleCallback(handle);
+
+ t.step_timeout(function() {
+ assert_true(neverCalled);
+ t.done();
+ }, 2000);
+ }, "A cancelled callback is never invoked");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/idlharness.html b/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/idlharness.html
new file mode 100644
index 00000000000..6033535f397
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/idlharness.html
@@ -0,0 +1,34 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>idlharness test</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>
+
+<pre id='untested_idl' style='display:none'>
+[PrimaryGlobal]
+interface Window {
+};
+</pre>
+
+<pre id='idl'>
+partial interface Window {
+ unsigned long requestIdleCallback(IdleRequestCallback callback,
+ optional IdleRequestOptions options);
+ void cancelIdleCallback(unsigned long handle);
+};
+
+dictionary IdleRequestOptions {
+ unsigned long timeout;
+};
+
+callback IdleRequestCallback = void (IdleDeadline deadline);
+</pre>
+<script>
+ var idl_array = new IdlArray();
+ idl_array.add_untested_idls(document.getElementById("untested_idl").textContent);
+ idl_array.add_idls(document.getElementById("idl").textContent);
+ idl_array.add_objects({Window: ["window"]});
+ idl_array.test();
+</script>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/scripting/events/event-handler-attributes-body-window.html b/tests/wpt/web-platform-tests/html/webappapis/scripting/events/event-handler-attributes-body-window.html
index bfd6f9c6815..1c87892cba7 100644
--- a/tests/wpt/web-platform-tests/html/webappapis/scripting/events/event-handler-attributes-body-window.html
+++ b/tests/wpt/web-platform-tests/html/webappapis/scripting/events/event-handler-attributes-body-window.html
@@ -21,4 +21,14 @@ handlers.forEach(function(handler) {
}, handler);
});
+handlers.forEach(function(handler) {
+ document.body['on' + handler] = null;
+});
+
+handlers.forEach(function(handler) {
+ test(function() {
+ assert_equals(document.body['on' + handler], null);
+ assert_equals(window['on' + handler], null);
+ }, handler + " removal");
+});
</script>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/scripting/events/messageevent-constructor.https.html b/tests/wpt/web-platform-tests/html/webappapis/scripting/events/messageevent-constructor.https.html
new file mode 100644
index 00000000000..8a8a8f67f22
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/webappapis/scripting/events/messageevent-constructor.https.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<title>MessageEvent constructor</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
+<script>
+test(function() {
+ var ev = new MessageEvent("test")
+ assert_equals(ev.type, "test", "type attribute")
+ assert_equals(ev.target, null, "target attribute")
+ assert_equals(ev.currentTarget, null, "currentTarget attribute")
+ assert_equals(ev.eventPhase, Event.NONE, "eventPhase attribute")
+ assert_equals(ev.bubbles, false, "bubbles attribute")
+ assert_equals(ev.cancelable, false, "cancelable attribute")
+ assert_equals(ev.defaultPrevented, false, "defaultPrevented attribute")
+ assert_equals(ev.isTrusted, false, "isTrusted attribute")
+ assert_true(ev.timeStamp > 0, "timeStamp attribute")
+ assert_true("initMessageEvent" in ev, "initMessageEvent operation")
+ assert_equals(ev.data, null, "data attribute")
+ assert_equals(ev.origin, "", "origin attribute")
+ assert_equals(ev.lastEventId, "", "lastEventId attribute")
+ assert_equals(ev.source, null, "source attribute")
+ assert_array_equals(ev.ports, [], "ports attribute")
+}, "Default event values")
+
+test(function() {
+ var channel = new MessageChannel()
+ var ev = new MessageEvent("test", { data: "testData", origin: "testOrigin", lastEventId: "testId", source: window, ports: [channel.port1] })
+ assert_equals(ev.type, "test", "type attribute")
+ assert_equals(ev.data, "testData", "data attribute")
+ assert_equals(ev.origin, "testOrigin", "origin attribute")
+ assert_equals(ev.lastEventId, "testId", "lastEventId attribute")
+ assert_equals(ev.source, window, "source attribute")
+ assert_array_equals(ev.ports, [channel.port1], "ports attribute")
+}, "MessageEventInit dictionary")
+
+test(function() {
+ assert_throws(new TypeError(), function() {
+ new MessageEvent("test", { ports: null })
+ })
+}, "Passing null for ports member")
+
+test(function() {
+ var ev = new MessageEvent("test", { ports: [] })
+ assert_true(Array.isArray(ev.ports), "Array.isArray() should return true")
+ assert_true(Object.isFrozen(ev.ports), "Object.isFrozen() should return true")
+ assert_true(ev.ports === ev.ports, "ev.ports should return the same object")
+}, "ports attribute should be a FrozenArray")
+
+test(function() {
+ var ev = document.createEvent("messageevent");
+ var channel = new MessageChannel()
+ ev.initMessageEvent("test", true, false, "testData", "testOrigin", "testId", window, [channel.port1])
+ assert_equals(ev.type, "test", "type attribute")
+ assert_equals(ev.bubbles, true, "bubbles attribute")
+ assert_equals(ev.cancelable, false, "bubbles attribute")
+ assert_equals(ev.data, "testData", "data attribute")
+ assert_equals(ev.origin, "testOrigin", "origin attribute")
+ assert_equals(ev.lastEventId, "testId", "lastEventId attribute")
+ assert_equals(ev.source, window, "source attribute")
+ assert_array_equals(ev.ports, [channel.port1], "ports attribute")
+}, "initMessageEvent operation")
+
+test(function() {
+ var ev = document.createEvent("messageevent")
+ assert_throws(new TypeError(), function() {
+ ev.initMessageEvent("test", true, false, "testData", "testOrigin", "testId", window, null)
+ })
+}, "Passing null for ports parameter to initMessageEvent")
+
+test(function() {
+ var ev = document.createEvent("messageevent")
+ assert_equals(MessageEvent.prototype.initMessageEvent.length, 8, "MessageEvent.prototype.initMessageEvent.length should be 8")
+ assert_throws(new TypeError(), function() {
+ ev.initMessageEvent("test", true, false, "testData", "testOrigin", "testId", window)
+ }, "Calling initMessageEvent with only 7 parameters should throw a TypeError")
+}, "All parameters to initMessageEvent should be mandatory")
+
+promise_test(function(t) {
+ var worker_url = "/service-workers/service-worker/resources/empty-worker.js";
+ var scope = "/service-workers/service-worker/resources/";
+ var registration;
+
+ return service_worker_unregister_and_register(t, worker_url, scope)
+ .then(function(r) {
+ registration = r;
+ return wait_for_state(t, r.installing, "activated");
+ })
+ .then(function() {
+ var ev = new MessageEvent("test", { source: registration.active });
+ assert_equals(ev.source, registration.active, "source attribute should return the ServiceWorker");
+ service_worker_unregister(t, scope);
+ });
+ }, "Passing ServiceWorker for source member");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/NavigatorID.js b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/NavigatorID.js
index cf16c68d441..78706f44d74 100644
--- a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/NavigatorID.js
+++ b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/NavigatorID.js
@@ -1,11 +1,19 @@
function run_test() {
+ var compatibilityMode;
+ if (navigator.userAgent.includes("Chrome")) {
+ compatibilityMode = "Chrome";
+ } else if (navigator.userAgent.includes("WebKit")) {
+ compatibilityMode = "WebKit";
+ } else {
+ compatibilityMode = "Gecko";
+ }
+
test(function() {
assert_equals(navigator.appCodeName, "Mozilla");
}, "appCodeName");
test(function() {
- assert_equals(typeof navigator.appName, "string",
- "navigator.appName should be a string");
+ assert_equals(navigator.appName, "Netscape");
}, "appName");
test(function() {
@@ -23,31 +31,22 @@ function run_test() {
}, "product");
test(function() {
- // See https://www.w3.org/Bugs/Public/show_bug.cgi?id=22555
if ("window" in self) {
- // If you identify as WebKit, taintEnabled should not exist.
- if (navigator.userAgent.indexOf("WebKit") != -1) {
- assert_false("taintEnabled" in navigator);
- }
- // Otherwise it should exist and return false.
- else {
- assert_false(navigator.taintEnabled());
+ if (compatibilityMode == "Gecko") {
+ assert_equals(navigator.productSub, "20100101");
+ } else {
+ assert_equals(navigator.productSub, "20030107");
}
} else {
- // taintEnabled should not exist in workers.
- assert_false("taintEnabled" in navigator);
+ assert_false("productSub" in navigator);
}
- }, "taintEnabled");
+ }, "productSub");
test(function() {
assert_equals(typeof navigator.userAgent, "string",
"navigator.userAgent should be a string");
}, "userAgent type");
- test(function() {
- assert_equals(navigator.vendorSub, "");
- }, "vendorSub");
-
async_test(function() {
var request = new XMLHttpRequest();
request.onload = this.step_func_done(function() {
@@ -60,4 +59,48 @@ function run_test() {
"filter_name=User-Agent");
request.send();
}, "userAgent value");
+
+ test(function() {
+ if ("window" in self) {
+ if (compatibilityMode == "Chrome") {
+ assert_equals(navigator.vendor, "Google Inc.");
+ } else if (compatibilityMode == "WebKit") {
+ assert_equals(navigator.vendor, "Apple Computer, Inc.");
+ } else {
+ assert_equals(navigator.vendor, "");
+ }
+ } else {
+ assert_false("vendor" in navigator);
+ }
+ }, "vendor");
+
+ test(function() {
+ if ("window" in self) {
+ assert_equals(navigator.vendorSub, "");
+ } else {
+ assert_false("vendorSub" in navigator);
+ }
+ }, "vendorSub");
+
+ // "If the navigator compatibility mode is Gecko, then the user agent must
+ // also support the following partial interface" (taintEnabled() and oscpu)
+ // See https://www.w3.org/Bugs/Public/show_bug.cgi?id=22555 and
+ // https://www.w3.org/Bugs/Public/show_bug.cgi?id=27820
+
+ test(function() {
+ if ("window" in self && compatibilityMode == "Gecko") {
+ assert_false(navigator.taintEnabled());
+ } else {
+ assert_false("taintEnabled" in navigator);
+ }
+ }, "taintEnabled");
+
+ test(function() {
+ if ("window" in self && compatibilityMode == "Gecko") {
+ assert_equals(typeof navigator.oscpu, "string",
+ "navigator.oscpu should be a string");
+ } else {
+ assert_false("oscpu" in navigator);
+ }
+ }, "oscpu");
}
diff --git a/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/bitmaprenderer-as-imagesource.html b/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/bitmaprenderer-as-imagesource.html
new file mode 100644
index 00000000000..1dbfa2b46af
--- /dev/null
+++ b/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/bitmaprenderer-as-imagesource.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Canvas's ImageBitmapRenderingContext test</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/scripting.html#the-imagebitmap-rendering-context">
+<script>
+var width = 10;
+var height = 10;
+
+function testCanvas(ctx, x, y, r, g, b, a)
+{
+ var color = ctx.getImageData(x, y, 1, 1).data;
+ assert_array_equals(color, [r, g, b, a]);
+}
+
+function consumeImageBitmap(image, t)
+{
+ var myCanvas = document.createElement('canvas');
+ myCanvas.width = myCanvas.height = 20;
+ var myCtx = myCanvas.getContext('bitmaprenderer');
+ myCtx.transferFromImageBitmap(image);
+
+ createImageBitmap(myCanvas).then(t.step_func_done(function(imageBitmap) {
+ // Per spec, when transferFromImageBitmap happens, the transferred
+ // ImageBitmap (|image| here) should be the intrinsic size of
+ // myCanvas, and hence myCanvas.width/height is ignored. Therefore,
+ // this created |imageBitmap| should have the same size as the |image|.
+ assert_equals(imageBitmap.width, width);
+ assert_equals(imageBitmap.height, height);
+
+ var dstCanvas = document.createElement('canvas');
+ dstCanvas.width = dstCanvas.height = 20;
+ var dstCtx = dstCanvas.getContext('2d');
+ dstCtx.drawImage(myCanvas, 0, 0);
+ testCanvas(dstCtx, 5, 5, 0, 255, 0, 255);
+ testCanvas(dstCtx, 15, 15, 0, 0, 0, 0);
+ }));
+}
+
+async_test(function(t) {
+ var canvas = document.createElement("canvas");
+ canvas.width = width;
+ canvas.height = height;
+ var ctx = canvas.getContext('2d');
+ ctx.fillStyle = '#0f0';
+ ctx.fillRect(0, 0, width, height);
+ createImageBitmap(canvas).then(t.step_func(function(image) {
+ consumeImageBitmap(image, t);
+ }));
+}, 'Test that createImageBitmap from a bitmaprenderer canvas produces correct result');
+
+async_test(function(t) {
+ var canvas = document.createElement("canvas");
+ canvas.width = width;
+ canvas.height = height;
+ var ctx = canvas.getContext('bitmaprenderer');
+ createImageBitmap(canvas).then(t.step_func_done(function(image) {
+ assert_equals(image.width, width);
+ assert_equals(image.height, height);
+
+ var dstCanvas = document.createElement('canvas');
+ dstCanvas.width = width;
+ dstCanvas.height = height;
+ var dstCtx = dstCanvas.getContext('2d');
+ dstCtx.drawImage(canvas, 0, 0);
+ testCanvas(dstCtx, 5, 5, 0, 0, 0, 0);
+ }));
+}, 'Test that createImageBitmap on a bitmaprenderer canvas that never consumes any source produces correct result');
+
+
+async_test(function(t) {
+ var canvas = document.createElement("canvas");
+ canvas.width = width;
+ canvas.height = height;
+ var ctx = canvas.getContext('bitmaprenderer');
+ ctx.transferFromImageBitmap(null);
+ createImageBitmap(canvas).then(t.step_func_done(function(image) {
+ assert_equals(image.width, width);
+ assert_equals(image.height, height);
+
+ var dstCanvas = document.createElement('canvas');
+ dstCanvas.width = width;
+ dstCanvas.height = height;
+ var dstCtx = dstCanvas.getContext('2d');
+ dstCtx.drawImage(canvas, 0, 0);
+ testCanvas(dstCtx, 5, 5, 0, 0, 0, 0);
+ }));
+}, 'Test that createImageBitmap on a bitmaprenderer canvas that consumes null produces correct result');
+</script>
diff --git a/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/context-creation-with-alpha.html b/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/context-creation-with-alpha.html
new file mode 100644
index 00000000000..88d12d144c2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/context-creation-with-alpha.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Canvas's ImageBitmapRenderingContext test</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/scripting.html#the-imagebitmap-rendering-context">
+<script>
+var width = 10;
+var height = 10;
+
+function testCanvas(ctx, r, g, b, a)
+{
+ var color = ctx.getImageData(5, 5, 1, 1).data;
+ assert_array_equals(color, [r, g, b, a]);
+}
+
+function consumeImageBitmap(image, alphaVal, expectedR, expectedG, expectedB, expectedA)
+{
+ var dstCanvas = document.createElement('canvas');
+ dstCanvas.width = width;
+ dstCanvas.height = height;
+ var dstCtx;
+ if (alphaVal == 'true')
+ dstCtx = dstCanvas.getContext('bitmaprenderer', { alpha: true });
+ else if (alphaVal == 'false')
+ dstCtx = dstCanvas.getContext('bitmaprenderer', { alpha: false });
+ else
+ dstCtx = dstCanvas.getContext('bitmaprenderer');
+ dstCtx.transferFromImageBitmap(image);
+
+ var myCanvas = document.createElement('canvas');
+ myCanvas.width = width;
+ myCanvas.height = height;
+ var myCtx = myCanvas.getContext('2d');
+ myCtx.drawImage(dstCanvas, 0, 0);
+ testCanvas(myCtx, expectedR, expectedG, expectedB, expectedA);
+}
+
+promise_test(function() {
+ var srcCanvas = document.createElement('canvas');
+ srcCanvas.width = width;
+ srcCanvas.height = height;
+ var ctx = srcCanvas.getContext('2d');
+ ctx.fillStyle = 'rgba(0, 255, 0, 0.5)';
+ ctx.fillRect(0, 0, width, height);
+ createImageBitmap(srcCanvas).then(function(image) {
+ consumeImageBitmap(image, 'false', 0, 127, 0, 255);
+ });
+}, "Test that an ImageBitmapRenderingContext with alpha disabled makes the canvas opaque");
+
+promise_test(function() {
+ var srcCanvas = document.createElement('canvas');
+ srcCanvas.width = width;
+ srcCanvas.height = height;
+ var ctx = srcCanvas.getContext('2d');
+ ctx.fillStyle = 'rgba(0, 255, 0, 0.5)';
+ ctx.fillRect(0, 0, width, height);
+ createImageBitmap(srcCanvas).then(function(image) {
+ consumeImageBitmap(image, 'true', 0, 255, 0, 127);
+ });
+}, "Test that an ImageBitmapRenderingContext with alpha enabled preserves the alpha");
+
+promise_test(function() {
+ var srcCanvas = document.createElement('canvas');
+ srcCanvas.width = width;
+ srcCanvas.height = height;
+ var ctx = srcCanvas.getContext('2d');
+ ctx.fillStyle = 'rgba(0, 255, 0, 0.5)';
+ ctx.fillRect(0, 0, width, height);
+ createImageBitmap(srcCanvas).then(function(image) {
+ consumeImageBitmap(image, '', 0, 255, 0, 127);
+ });
+}, "Test that the 'alpha' context creation attribute is true by default");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/context-creation.html b/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/context-creation.html
new file mode 100644
index 00000000000..3daa3977898
--- /dev/null
+++ b/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/context-creation.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Canvas's ImageBitmapRenderingContext test</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/scripting.html#the-imagebitmap-rendering-context">
+<script>
+var width = 10;
+var height = 10;
+
+test(function() {
+ var canvas = document.createElement("canvas");
+ canvas.width = width;
+ canvas.height = height;
+ var ctx = canvas.getContext('bitmaprenderer');
+ assert_true(ctx instanceof ImageBitmapRenderingContext);
+}, "Test that canvas.getContext('bitmaprenderer') returns an instance of ImageBitmapRenderingContext");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/context-preserves-canvas.html b/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/context-preserves-canvas.html
new file mode 100644
index 00000000000..eca7afe9ddd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/context-preserves-canvas.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Canvas's ImageBitmapRenderingContext test</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/scripting.html#the-imagebitmap-rendering-context">
+<script>
+var width = 10;
+var height = 10;
+
+test(function() {
+ var canvas = document.createElement("canvas");
+ canvas.width = width;
+ canvas.height = height;
+ var ctx = canvas.getContext('bitmaprenderer');
+ var dstCanvas = ctx.canvas;
+ assert_equals(dstCanvas.width, width);
+ assert_equals(dstCanvas.height, height);
+}, "Test that ctx.canvas on a ImageBitmapRenderingContext returns the original canvas");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/tranferFromImageBitmap-null.html b/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/tranferFromImageBitmap-null.html
new file mode 100644
index 00000000000..c12a8c93fdb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/tranferFromImageBitmap-null.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Canvas's ImageBitmapRenderingContext test</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/scripting.html#the-imagebitmap-rendering-context">
+<script>
+var width = 10;
+var height = 10;
+
+function testCanvas(ctx, r, g, b, a)
+{
+ var color = ctx.getImageData(5, 5, 1, 1).data;
+ assert_array_equals(color, [r, g, b, a]);
+}
+
+promise_test(function() {
+ function testTransferFromImageBitmapNullability(greenImage, redImage) {
+ var bitmapCanvas = document.createElement('canvas');
+ bitmapCanvas.width = width;
+ bitmapCanvas.height = height;
+ var bitmapCtx = bitmapCanvas.getContext('bitmaprenderer');
+ bitmapCtx.transferFromImageBitmap(greenImage);
+
+ // Make sure the bitmap renderer canvas is filled correctly.
+ var myCanvas = document.createElement('canvas');
+ myCanvas.width = width;
+ myCanvas.height = height;
+ var myCtx = myCanvas.getContext('2d');
+ myCtx.drawImage(bitmapCanvas, 0, 0);
+ testCanvas(myCtx, 0, 255, 0, 255);
+
+ // Test if passing null resets the bitmap renderer canvas.
+ // Drawing the resetted canvas cannot change the destination canvas.
+ bitmapCtx.transferFromImageBitmap(null);
+ var myCanvas2 = document.createElement('canvas');
+ myCanvas2.width = width;
+ myCanvas2.height = height;
+ var myCtx2 = myCanvas2.getContext('2d');
+ myCtx2.drawImage(bitmapCanvas, 0, 0);
+ testCanvas(myCtx2, 0, 0, 0, 0);
+
+ // Test if we can redraw the bitmap canvas correctly after reset.
+ bitmapCtx.transferFromImageBitmap(redImage);
+ var myCanvas3 = document.createElement('canvas');
+ myCanvas3.width = width;
+ myCanvas3.height = height;
+ var myCtx3 = myCanvas3.getContext('2d');
+ myCtx3.drawImage(bitmapCanvas, 0, 0);
+ testCanvas(myCtx3, 255, 0, 0, 255);
+ }
+
+ var greenCanvas = document.createElement('canvas');
+ greenCanvas.width = width;
+ greenCanvas.height = height;
+ var greenCtx = greenCanvas.getContext('2d');
+ greenCtx.fillStyle = '#0f0';
+ greenCtx.fillRect(0, 0, width, height);
+
+ var redCanvas = document.createElement('canvas');
+ redCanvas.width = width;
+ redCanvas.height = height;
+ var redCtx = redCanvas.getContext('2d');
+ redCtx.fillStyle = '#f00';
+ redCtx.fillRect(0, 0, width, height);
+
+ return Promise.all([
+ createImageBitmap(greenCanvas),
+ createImageBitmap(redCanvas),
+ ]).then(([greenImage, redImage]) => {
+ testTransferFromImageBitmapNullability(greenImage, redImage);
+ });
+},'Test that transferFromImageBitmap(null) discards the previously transferred image');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/transferFromImageBitmap-detached.html b/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/transferFromImageBitmap-detached.html
new file mode 100644
index 00000000000..2c547ee63b5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/imagebitmap-renderingcontext/transferFromImageBitmap-detached.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Canvas's ImageBitmapRenderingContext test</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/scripting.html#the-imagebitmap-rendering-context">
+<script>
+var width = 10;
+var height = 10;
+
+promise_test(function() {
+ function testException(image) {
+ var dstCanvas = document.createElement('canvas');
+ dstCanvas.width = width;
+ dstCanvas.height = height;
+ var dstCtx = dstCanvas.getContext('bitmaprenderer');
+ dstCtx.transferFromImageBitmap(image);
+
+ // The image should be detached after transferFromImageBitmap.
+ assert_equals(image.width, 0);
+ assert_equals(image.height, 0);
+ assert_throws("InvalidStateError", function() { dstCtx.transferFromImageBitmap(image); });
+ }
+
+ var srcCanvas = document.createElement('canvas');
+ srcCanvas.width = width;
+ srcCanvas.height = height;
+ var ctx = srcCanvas.getContext('2d');
+ ctx.fillStyle = 'rgba(0, 255, 0, 0.5)';
+ ctx.fillRect(0, 0, width, height);
+ createImageBitmap(srcCanvas).then(testException);
+}, "Test transferFromImageBitmap(image) with a detached image should throw InvalidStateError");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/innerText/getter-tests.js b/tests/wpt/web-platform-tests/innerText/getter-tests.js
index d4511410b46..44be5267e55 100644
--- a/tests/wpt/web-platform-tests/innerText/getter-tests.js
+++ b/tests/wpt/web-platform-tests/innerText/getter-tests.js
@@ -126,10 +126,6 @@ testText("<fieldset>abc", "abc", "<fieldset> contents preserved");
testText("<fieldset><legend>abc", "abc", "<fieldset> <legend> contents preserved");
testText("<input type='text' value='abc'>", "", "<input> contents ignored");
testText("<textarea>abc", "", "<textarea> contents ignored");
-testText("<select size='1'><option>abc</option><option>def", "abc\ndef", "<select size='1'> contents of options preserved");
-testText("<select size='2'><option>abc</option><option>def", "abc\ndef", "<select size='2'> contents of options preserved");
-testText("<select size='1'><option id='target'>abc</option><option>def", "abc", "<select size='1'> contents of target option preserved");
-testText("<select size='2'><option id='target'>abc</option><option>def", "abc", "<select size='2'> contents of target option preserved");
testText("<iframe>abc", "", "<iframe> contents ignored");
testText("<iframe><div id='target'>abc", "", "<iframe> contents ignored");
testText("<iframe src='data:text/html,abc'>", "","<iframe> subdocument ignored");
@@ -144,6 +140,24 @@ testText("<canvas><div id='target'>abc", "", "<canvas><div id='target'> contents
testText("<img alt='abc'>", "", "<img> alt text ignored");
testText("<img src='about:blank' class='poke'>", "", "<img> contents ignored");
+/**** <select>, <optgroup> & <option> ****/
+
+testText("<select size='1'><option>abc</option><option>def", "abc\ndef", "<select size='1'> contents of options preserved");
+testText("<select size='2'><option>abc</option><option>def", "abc\ndef", "<select size='2'> contents of options preserved");
+testText("<select size='1'><option id='target'>abc</option><option>def", "abc", "<select size='1'> contents of target option preserved");
+testText("<select size='2'><option id='target'>abc</option><option>def", "abc", "<select size='2'> contents of target option preserved");
+testText("<div>a<select></select>bc", "abc", "empty <select>");
+testText("<div>a<select><optgroup></select>bc", "a\nbc", "empty <optgroup> in <select>");
+testText("<div>a<select><option></select>bc", "a\nbc", "empty <option> in <select>");
+testText("<select class='poke'></select>", "", "<select> containing text node child");
+testText("<select><optgroup class='poke-optgroup'></select>", "", "<optgroup> containing <optgroup>");
+testText("<select><optgroup><option>abc</select>", "abc", "<optgroup> containing <option>");
+testText("<select><option class='poke-div'>123</select>", "123\nabc", "<div> in <option>");
+testText("<div>a<optgroup></optgroup>bc", "a\nbc", "empty <optgroup> in <div>");
+testText("<div>a<optgroup>123</optgroup>bc", "a\nbc", "<optgroup> in <div>");
+testText("<div>a<option></option>bc", "a\nbc", "empty <option> in <div>");
+testText("<div>a<option>123</option>bc", "a\n123\nbc", "<option> in <div>");
+
/**** innerText on replaced element children ****/
testText("<div><button>abc", "abc", "<button> contents preserved");
diff --git a/tests/wpt/web-platform-tests/innerText/getter.html b/tests/wpt/web-platform-tests/innerText/getter.html
index 67f21ef9870..e6ba0db64b7 100644
--- a/tests/wpt/web-platform-tests/innerText/getter.html
+++ b/tests/wpt/web-platform-tests/innerText/getter.html
@@ -37,12 +37,14 @@ function textTextInContainer(cont, html, expectedPlain, msg) {
for (var i = 0; i < pokes.length; ++i) {
pokes[i].textContent = 'abc';
}
- pokes = document.getElementsByClassName('poke-rp');
- for (var i = 0; i < pokes.length; ++i) {
- var rp = document.createElement("rp");
- rp.textContent = "abc";
- pokes[i].appendChild(rp);
- }
+ ['rp', 'optgroup', 'div'].forEach(function(tag) {
+ pokes = document.getElementsByClassName('poke-' + tag);
+ for (var i = 0; i < pokes.length; ++i) {
+ var el = document.createElement(tag);
+ el.textContent = "abc";
+ pokes[i].appendChild(el);
+ }
+ });
var shadows = document.getElementsByClassName('shadow');
for (var i = 0; i < shadows.length; ++i) {
var s = shadows[i].createShadowRoot();
diff --git a/tests/wpt/web-platform-tests/lint.whitelist b/tests/wpt/web-platform-tests/lint.whitelist
index 9b358b0db15..ca2e21da7f7 100644
--- a/tests/wpt/web-platform-tests/lint.whitelist
+++ b/tests/wpt/web-platform-tests/lint.whitelist
@@ -133,6 +133,9 @@ TRAILING WHITESPACE:webgl/tools/*.patch
# The tests under this directory are not done by us
*:webgl/conformance-1.0.3/*
+# CI scripts
+PRINT STATEMENT:check_stability.py
+W3C-TEST.ORG:check_stability.py
# Git submodules are not currently scanned
*:tools/*
diff --git a/tests/wpt/web-platform-tests/mathml/README.md b/tests/wpt/web-platform-tests/mathml/README.md
new file mode 100644
index 00000000000..bab35474dd5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/README.md
@@ -0,0 +1,18 @@
+# MathML: Tests for the MathML in HTML5 implementation note
+
+This directory contains tests for the
+[MathML in HTML5 implementation note](http://www.mathml-association.org/MathMLinHTML5/)
+which is itself based on the
+[HTML5 W3C recommendation](https://www.w3.org/TR/html5/),
+on the [MathML3 W3C recommendation](https://www.w3.org/TR/MathML3/)
+and on the
+[Open Font Format 3](http://www.iso.org/iso/home/store/catalogue_ics/catalogue_detail_ics.htm?csnumber=66391) standard.
+
+Many of the tests verify OpenType features and require specific Web fonts for
+that purpose. WOFF fonts are generated by scripts in the `tools/` folder using
+the Python API of
+[fontforge](https://github.com/fontforge/fontforge/). A recent enough version
+of FontForge is necessary so that it includes fixes for
+[WOFF checkSumAdjustment](https://github.com/fontforge/fontforge/issues/926),
+[USE_TYPO_METRICS flag](https://github.com/fontforge/fontforge/pull/2274) and
+for other various bugs.
diff --git a/tests/wpt/web-platform-tests/mathml/presentation-markup/fractions/frac-1.html b/tests/wpt/web-platform-tests/mathml/presentation-markup/fractions/frac-1.html
new file mode 100644
index 00000000000..fc650eb4c4a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/presentation-markup/fractions/frac-1.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Fraction</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS3.SSS2">
+<meta name="assert" content="Verify fraction metrics for different sizes of numerator and denominator.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ math, mspace {
+ font-size: 10px;
+ }
+</style>
+<script>
+ /* This test does not use any specific fonts and so the exact rules are not
+ specified precisely. We assume reasonable values for numerator/denominator
+ shifts and spacing. */
+
+ function getBox(aId) {
+ var box = document.getElementById(aId).getBoundingClientRect();
+ box.middle = (box.bottom + box.top) / 2;
+ box.center = (box.left + box.right) / 2;
+ return box;
+ }
+
+ function getFractionAxis(aId) {
+ return (getBox(aId).top * den.height + getBox(aId).bottom * num.height) / (num.height + den.height);
+ }
+
+ setup({ explicit_done: true });
+ window.addEventListener("load", runTests);
+
+ function runTests() {
+ test(function() {
+ var e = 3;
+ var mathAxis = getBox("axis").middle;
+ // For stacks, nothing in the OpenType MATH specification seems to ensure
+ // that the gap is split symmetrically around the math axis so we only
+ // do the following verification for standard fractions.
+ for (var i = 0; i <= 4; i++) {
+ var frac = getBox("frac" + i);
+ var num = getBox("frac" + i + "num");
+ var den = getBox("frac" + i + "den");
+ // To estimate the fraction axis, we calculate barycenter between the
+ // top and bottom of the fraction, using the heights of numerator and
+ // denominator as weights.
+ var fracAxis = (frac.top * den.height + frac.bottom * num.height) / (num.height + den.height);
+ assert_approx_equals(fracAxis, mathAxis, e, "frac" + i + " fraction bar");
+ }
+ }, "Fraction axis is aligned on the math axis");
+
+ test(function() {
+ for (var i = 0; i < 10; i++) {
+ assert_less_than(getBox("frac" + i + "num").bottom, getBox("frac" + i + "den").top, "numerator is above denominator");
+ assert_less_than(getBox("frac" + i + "den").top - getBox("frac" + i + "num").bottom, 5, "The gap between numerator and denominator is not too large");
+ }
+ }, "Vertical positions of numerator and denominator");
+
+ test(function() {
+ var e = 3;
+ for (var i = 0; i < 10; i++)
+ assert_approx_equals(getBox("frac" + i + "num").center, getBox("frac" + i + "den").center, e, "numerator and denominator are horizontally centered");
+ }, "Horizontal alignments of numerator and denominator");
+
+ test(function() {
+ var e = 5;
+ for (var i = 0; i < 10; i++) {
+ var frac = getBox("frac" + i);
+ var num = getBox("frac" + i + "num");
+ var den = getBox("frac" + i + "den");
+ assert_approx_equals(frac.height, den.bottom - num.top, e, "height of frac " + i + " is determined by the bottom/top sides of the denominator/numerator");
+ assert_approx_equals(frac.width, Math.max(num.right, den.right) - Math.min(num.left, den.left), e, "width of frac " + i + " is determined by the left/right sides of the denominator/numerator (plus some spacing)");
+ }
+ }, "Dimension of mfrac elements");
+
+ done();
+ }
+</script>
+</head>
+<body>
+ <p>
+ <math>
+ <mo id="axis">−</mo>
+ <mfrac id="frac0">
+ <mspace id="frac0num" width="15px" height="15px" mathbackground="blue"/>
+ <mspace id="frac0den" width="15px" height="15px" mathbackground="green"/>
+ </mfrac>
+ <mfrac id="frac1">
+ <mspace id="frac1num" width="30px" height="15px" mathbackground="blue"/>
+ <mspace id="frac1den" width="15px" height="15px" mathbackground="green"/>
+ </mfrac>
+ <mfrac id="frac2">
+ <mspace id="frac2num" width="15px" height="15px" mathbackground="blue"/>
+ <mspace id="frac2den" width="30px" height="15px" mathbackground="green"/>
+ </mfrac>
+ <mfrac id="frac3">
+ <mspace id="frac3num" width="15px" height="30px" mathbackground="blue"/>
+ <mspace id="frac3den" width="15px" height="15px" mathbackground="green"/>
+ </mfrac>
+ <mfrac id="frac4">
+ <mspace id="frac4num" width="15px" height="15px" mathbackground="blue"/>
+ <mspace id="frac4den" width="15px" height="30px" mathbackground="green"/>
+ </mfrac>
+ <mfrac id="frac5" linethickness="0px">
+ <mspace id="frac5num" width="15px" height="15px" mathbackground="blue"/>
+ <mspace id="frac5den" width="15px" height="15px" mathbackground="green"/>
+ </mfrac>
+ <mfrac id="frac6" linethickness="0px">
+ <mspace id="frac6num" width="30px" height="15px" mathbackground="blue"/>
+ <mspace id="frac6den" width="15px" height="15px" mathbackground="green"/>
+ </mfrac>
+ <mfrac id="frac7" linethickness="0px">
+ <mspace id="frac7num" width="15px" height="15px" mathbackground="blue"/>
+ <mspace id="frac7den" width="30px" height="15px" mathbackground="green"/>
+ </mfrac>
+ <mfrac id="frac8" linethickness="0px">
+ <mspace id="frac8num" width="15px" height="30px" mathbackground="blue"/>
+ <mspace id="frac8den" width="15px" height="15px" mathbackground="green"/>
+ </mfrac>
+ <mfrac id="frac9" linethickness="0px">
+ <mspace id="frac9num" width="15px" height="15px" mathbackground="blue"/>
+ <mspace id="frac9den" width="15px" height="30px" mathbackground="green"/>
+ </mfrac>
+ </math>
+ </p>
+ <hr/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/presentation-markup/fractions/frac-parameters-1.html b/tests/wpt/web-platform-tests/mathml/presentation-markup/fractions/frac-parameters-1.html
new file mode 100644
index 00000000000..f2b32516475
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/presentation-markup/fractions/frac-parameters-1.html
@@ -0,0 +1,241 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Fraction parameters</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS3.SSS2">
+<meta name="assert" content="Element mfrac correctly uses the fraction parameters from the MATH table.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ math, mspace {
+ font-size: 10px;
+ }
+ @font-face {
+ font-family: axisheight7000-rulethickness1000;
+ src: url("/fonts/math/fraction-axisheight7000-rulethickness1000.woff");
+ }
+ @font-face {
+ font-family: denominatordisplaystylegapmin5000-rulethickness1000;
+ src: url("/fonts/math/fraction-denominatordisplaystylegapmin5000-rulethickness1000.woff");
+ }
+ @font-face {
+ font-family: denominatordisplaystyleshiftdown6000-rulethickness1000;
+ src: url("/fonts/math/fraction-denominatordisplaystyleshiftdown6000-rulethickness1000.woff");
+ }
+ @font-face {
+ font-family: denominatorgapmin4000-rulethickness1000;
+ src: url("/fonts/math/fraction-denominatorgapmin4000-rulethickness1000.woff");
+ }
+ @font-face {
+ font-family: denominatorshiftdown3000-rulethickness1000;
+ src: url("/fonts/math/fraction-denominatorshiftdown3000-rulethickness1000.woff");
+ }
+ @font-face {
+ font-family: numeratordisplaystylegapmin8000-rulethickness1000;
+ src: url("/fonts/math/fraction-numeratordisplaystylegapmin8000-rulethickness1000.woff");
+ }
+ @font-face {
+ font-family: numeratordisplaystyleshiftup2000-rulethickness1000;
+ src: url("/fonts/math/fraction-numeratordisplaystyleshiftup2000-rulethickness1000.woff");
+ }
+ @font-face {
+ font-family: numeratorgapmin9000-rulethickness1000;
+ src: url("/fonts/math/fraction-numeratorgapmin9000-rulethickness1000.woff");
+ }
+ @font-face {
+ font-family: numeratorshiftup11000-rulethickness1000;
+ src: url("/fonts/math/fraction-numeratorshiftup11000-rulethickness1000.woff");
+ }
+ @font-face {
+ font-family: rulethickness10000;
+ src: url("/fonts/math/fraction-rulethickness10000.woff");
+ }
+</style>
+<script>
+ var emToPx = 10 / 1000; // font-size: 10px, font.em = 1000
+ var epsilon = 1;
+
+ function getBox(aId) {
+ return document.getElementById(aId).getBoundingClientRect();
+ }
+
+ setup({ explicit_done: true });
+ window.addEventListener("load", function() {
+ document.fonts.ready.then(runTests);
+ });
+
+ function runTests() {
+ test(function() {
+ var v1 = 7000 * emToPx;
+ var v2 = 1000 * emToPx;
+ assert_approx_equals(getBox("ref0001").top - getBox("num0001").bottom,
+ v1 + v2 / 2, epsilon, "mfrac: axis height");
+ }, "AxisHeight");
+
+ test(function() {
+ var v1 = 5000 * emToPx;
+ assert_approx_equals(getBox("den0002").top - getBox("ref0002").bottom,
+ v1, epsilon, "mfrac: denominator gap");
+ }, "DenominatorDisplayStyleGapMin");
+
+ test(function() {
+ var v1 = 6000 * emToPx;
+ assert_approx_equals(getBox("den0003").top - getBox("ref0003").bottom,
+ v1, epsilon, "mfrac: denominator shift");
+ }, "DenominatorDisplayStyleShiftDown");
+
+ test(function() {
+ var v1 = 4000 * emToPx;
+ assert_approx_equals(getBox("den0004").top - getBox("ref0004").bottom,
+ v1, epsilon, "mfrac: denominator gap");
+ }, "DenominatorGapMin");
+
+ test(function() {
+ var v1 = 3000 * emToPx;
+ assert_approx_equals(getBox("den0005").top - getBox("ref0005").bottom,
+ v1, epsilon, "mfrac: denominator shift");
+ }, "DenominatorShiftDown");
+
+ test(function() {
+ var v1 = 8000 * emToPx;
+ assert_approx_equals(getBox("ref0006").top - getBox("num0006").bottom,
+ v1, epsilon, "mfrac: numerator gap");
+ }, "NumeratorDisplayStyleGapMin");
+
+ test(function() {
+ var v1 = 2000 * emToPx;
+ assert_approx_equals(getBox("ref0007").top - getBox("num0007").bottom,
+ v1, epsilon, "mfrac: numerator shift");
+ }, "NumeratorDisplayStyleShiftDown");
+
+ test(function() {
+ var v1 = 9000 * emToPx;
+ assert_approx_equals(getBox("ref0008").top - getBox("num0008").bottom,
+ v1, epsilon, "mfrac: numerator gap");
+ }, "NumeratorGapMin");
+
+ test(function() {
+ var v1 = 11000 * emToPx;
+ assert_approx_equals(getBox("ref0009").top - getBox("num0009").bottom,
+ v1, epsilon, "mfrac: numerator shift");
+ }, "NumeratorShiftDown");
+
+ test(function() {
+ var v1 = 10000 * emToPx;
+ assert_approx_equals(getBox("den0010").top - getBox("num0010").bottom,
+ v1, epsilon, "mfrac: rule thickness");
+ }, "FractionRuleThickness");
+
+ done();
+ }
+</script>
+</head>
+<body>
+ <p>
+ <math style="font-family: axisheight7000-rulethickness1000;">
+ <mspace id="ref0001" depth="1em" width="3em" mathbackground="green"/>
+ <mfrac>
+ <mspace width="3em" height="1em" id="num0001" mathbackground="blue"/>
+ <mspace width="3em"/>
+ </mfrac>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math display="block" style="font-family: denominatordisplaystylegapmin5000-rulethickness1000;">
+ <mspace id="ref0002" width="3em"
+ height=".5em" depth=".5em" mathbackground="green"/>
+ <mfrac>
+ <mspace width="3em"/>
+ <mspace width="3em" height="1em" id="den0002" mathbackground="blue"/>
+ </mfrac>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math display="block" style="font-family: denominatordisplaystyleshiftdown6000-rulethickness1000;">
+ <mspace id="ref0003" width="3em" height="1em" mathbackground="green"/>
+ <mfrac>
+ <mspace width="3em"/>
+ <mspace width="3em" depth="1em" id="den0003" mathbackground="blue"/>
+ </mfrac>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: denominatorgapmin4000-rulethickness1000;">
+ <mspace id="ref0004" width="3em"
+ height=".5em" depth=".5em" mathbackground="green"/>
+ <mfrac>
+ <mspace width="3em"/>
+ <mspace width="3em" height="1em" id="den0004" mathbackground="blue"/>
+ </mfrac>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: denominatorshiftdown3000-rulethickness1000;">
+ <mspace id="ref0005" width="3em" height="1em" mathbackground="green"/>
+ <mfrac>
+ <mspace width="3em"/>
+ <mspace width="3em" depth="1em" id="den0005" mathbackground="blue"/>
+ </mfrac>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math display="block" style="font-family: numeratordisplaystylegapmin8000-rulethickness1000;">
+ <mspace id="ref0006" width="3em"
+ height=".5em" depth=".5em" mathbackground="green"/>
+ <mfrac>
+ <mspace width="3em" depth="1em" id="num0006" mathbackground="blue"/>
+ <mspace width="3em"/>
+ </mfrac>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math display="block" style="font-family: numeratordisplaystyleshiftup2000-rulethickness1000;">
+ <mspace id="ref0007" width="3em"
+ depth="1em" mathbackground="green"/>
+ <mfrac>
+ <mspace width="3em" height="1em" id="num0007" mathbackground="blue"/>
+ <mspace width="3em"/>
+ </mfrac>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: numeratorgapmin9000-rulethickness1000;">
+ <mspace id="ref0008" width="3em"
+ height=".5em" depth=".5em" mathbackground="green"/>
+ <mfrac>
+ <mspace width="3em" depth="1em" id="num0008" mathbackground="blue"/>
+ <mspace width="3em"/>
+ </mfrac>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: numeratorshiftup11000-rulethickness1000;">
+ <mspace id="ref0009" width="3em"
+ depth="1em" mathbackground="green"/>
+ <mfrac>
+ <mspace width="3em" height="1em" id="num0009" mathbackground="blue"/>
+ <mspace width="3em"/>
+ </mfrac>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: rulethickness10000">
+ <mfrac>
+ <mspace width="3em" height="1em" id="num0010" mathbackground="blue"/>
+ <mspace width="3em" depth="1em" id="den0010" mathbackground="green"/>
+ </mfrac>
+ </math>
+ </p>
+ <hr/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/presentation-markup/fractions/frac-parameters-2.html b/tests/wpt/web-platform-tests/mathml/presentation-markup/fractions/frac-parameters-2.html
new file mode 100644
index 00000000000..08d639dd488
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/presentation-markup/fractions/frac-parameters-2.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Stack parameters</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS3.SSS2">
+<meta name="assert" content="Element mfrac correctly uses the stack parameters from the MATH table.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ math, mspace {
+ font-size: 10px;
+ }
+ @font-face {
+ font-family: axisheight7000;
+ src: url("/fonts/math/stack-axisheight7000.woff");
+ }
+ @font-face {
+ font-family: bottomdisplaystyleshiftdown5000;
+ src: url("/fonts/math/stack-bottomdisplaystyleshiftdown5000.woff");
+ }
+ @font-face {
+ font-family: bottomshiftdown6000;
+ src: url("/fonts/math/stack-bottomshiftdown6000.woff");
+ }
+ @font-face {
+ font-family: displaystylegapmin4000;
+ src: url("/fonts/math/stack-displaystylegapmin4000.woff");
+ }
+ @font-face {
+ font-family: gapmin8000;
+ src: url("/fonts/math/stack-gapmin8000.woff");
+ }
+ @font-face {
+ font-family: topdisplaystyleshiftup3000;
+ src: url("/fonts/math/stack-topdisplaystyleshiftup3000.woff");
+ }
+ @font-face {
+ font-family: topshiftup9000;
+ src: url("/fonts/math/stack-topshiftup9000.woff");
+ }
+</style>
+<script>
+ var emToPx = 10 / 1000; // font-size: 10px, font.em = 1000
+ var epsilon = 1;
+
+ function getBox(aId) {
+ return document.getElementById(aId).getBoundingClientRect();
+ }
+
+ setup({ explicit_done: true });
+ window.addEventListener("load", function() {
+ document.fonts.ready.then(runTests);
+ });
+
+ function runTests() {
+ test(function() {
+ var v = 7000 * emToPx;
+ assert_approx_equals(getBox("ref0001").top - getBox("num0001").bottom,
+ v, epsilon, "mfrac: axis height");
+ }, "AxisHeight");
+
+ test(function() {
+ var v = 5000 * emToPx;
+ assert_approx_equals(getBox("den0002").top - getBox("ref0002").bottom,
+ v, epsilon, "mfrac: denominator shift");
+ }, "BottomDisplayStyleShiftDown");
+
+ test(function() {
+ var v = 6000 * emToPx;
+ assert_approx_equals(getBox("den0003").top - getBox("ref0003").bottom,
+ v, epsilon, "mfrac: denominator shift");
+ }, "BottomShiftDown");
+
+ test(function() {
+ var v = 4000 * emToPx;
+ assert_approx_equals(getBox("den0004").top - getBox("num0004").bottom,
+ v, epsilon, "mfrac: gap");
+ }, "DisplayStyleGapMin");
+
+ test(function() {
+ var v = 8000 * emToPx;
+ assert_approx_equals(getBox("den0005").top - getBox("num0005").bottom,
+ v, epsilon, "mfrac: gap");
+ }, "GapMin");
+
+ test(function() {
+ var v = 3000 * emToPx;
+ assert_approx_equals(getBox("ref0006").top - getBox("num0006").bottom,
+ v, epsilon, "mfrac: numerator shift");
+ }, "TopDisplayStyleShiftUp");
+
+ test(function() {
+ var v = 9000 * emToPx;
+ assert_approx_equals(getBox("ref0007").top - getBox("num0007").bottom,
+ v, epsilon, "mfrac: numerator shift");
+ }, "ToShiftUp");
+
+ done();
+ }
+</script>
+</head>
+<body>
+ <p>
+ <math style="font-family: axisheight7000;">
+ <mspace id="ref0001" depth="1em" width="3em" mathbackground="green"/>
+ <mfrac linethickness="0px">
+ <mspace width="3em" height="1em" id="num0001" mathbackground="blue"/>
+ <mspace width="3em"/>
+ </mfrac>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math display="block" style="font-family: bottomdisplaystyleshiftdown5000;">
+ <mspace id="ref0002" width="3em" height="1em" mathbackground="green"/>
+ <mfrac linethickness="0px">
+ <mspace width="3em"/>
+ <mspace width="3em" depth="1em" id="den0002" mathbackground="blue"/>
+ </mfrac>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: bottomshiftdown6000;">
+ <mspace id="ref0003" width="3em" height="1em" mathbackground="green"/>
+ <mfrac linethickness="0px">
+ <mspace width="3em"/>
+ <mspace width="3em" depth="1em" id="den0003" mathbackground="blue"/>
+ </mfrac>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math display="block" style="font-family: displaystylegapmin4000;">
+ <mfrac linethickness="0px">
+ <mspace width="3em" height="1em" id="num0004" mathbackground="blue"/>
+ <mspace width="3em" depth="1em" id="den0004" mathbackground="green"/>
+ </mfrac>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: gapmin8000;">
+ <mfrac linethickness="0px">
+ <mspace width="3em" height="1em" id="num0005" mathbackground="blue"/>
+ <mspace width="3em" depth="1em" id="den0005" mathbackground="green"/>
+ </mfrac>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math display="block" style="font-family: topdisplaystyleshiftup3000;">
+ <mspace id="ref0006" width="3em" depth="1em" mathbackground="green"/>
+ <mfrac linethickness="0px">
+ <mspace width="3em" height="1em" id="num0006" mathbackground="blue"/>
+ <mspace width="3em"/>
+ </mfrac>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: topshiftup9000;">
+ <mspace id="ref0007" width="3em" depth="1em" mathbackground="green"/>
+ <mfrac linethickness="0px">
+ <mspace width="3em" height="1em" id="num0007" mathbackground="blue"/>
+ <mspace width="3em"/>
+ </mfrac>
+ </math>
+ </p>
+ <hr/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/presentation-markup/operators/mo-axis-height-1.html b/tests/wpt/web-platform-tests/mathml/presentation-markup/operators/mo-axis-height-1.html
new file mode 100644
index 00000000000..ee06e19fd57
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/presentation-markup/operators/mo-axis-height-1.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>mo axis height</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS2.SSS4">
+<meta name="assert" content="Element mo correctly uses the axis height parameter from the MATH table.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ math, mspace {
+ font-size: 10px;
+ }
+ @font-face {
+ font-family: axisheight5000-verticalarrow14000;
+ src: url("/fonts/math/axisheight5000-verticalarrow14000.woff");
+ }
+</style>
+<script>
+ var emToPx = 10 / 1000; // font-size: 10px, font.em = 1000
+ var epsilon = 5;
+
+ function getBox(aId) {
+ return document.getElementById(aId).getBoundingClientRect();
+ }
+
+ setup({ explicit_done: true });
+ window.addEventListener("load", function() {
+ document.fonts.ready.then(runTests);
+ });
+
+ function runTests() {
+ test(function() {
+ var v1 = 5000 * emToPx;
+ var moMiddle = (getBox("mo1").bottom + getBox("mo1").top) / 2;
+ assert_approx_equals(getBox("mo1").height,
+ 14000 * emToPx, epsilon, "mo: size");
+ assert_approx_equals(getBox("baseline1").bottom - moMiddle,
+ v1, epsilon, "mo: axis height");
+ }, "AxisHeight (size variant)");
+
+ test(function() {
+ var v1 = 5000 * emToPx;
+ var moMiddle = (getBox("mo2").bottom + getBox("mo2").top) / 2;
+ assert_approx_equals(getBox("mo2").height,
+ 2 * (getBox("target2").height - v1),
+ epsilon, "mo: size");
+ assert_approx_equals(getBox("baseline2").bottom - moMiddle,
+ v1, epsilon, "mo: axis height");
+ }, "AxisHeight (glyph assembly)");
+
+ done();
+ }
+</script>
+</head>
+<body>
+ <p>
+ <math style="font-family: axisheight5000-verticalarrow14000;">
+ <mrow>
+ <mspace id="baseline1" mathbackground="blue" width="50px" height="1px"/>
+ <mpadded voffset="50px"><mspace mathbackground="cyan" width="50px" height="1px"/></mpadded>
+ <mo id="mo1" symmetric="true" mathcolor="green">&#x21A8;</mo>
+ <mspace mathbackground="gray" width="10px" height="50px"/>
+ </mrow>
+ </math>
+ <math style="font-family: axisheight5000-verticalarrow14000;">
+ <mrow>
+ <mspace id="baseline2" mathbackground="blue" width="50px" height="1px"/>
+ <mpadded voffset="50px"><mspace mathbackground="cyan" width="50px" height="1px"/></mpadded>
+ <mo id="mo2" symmetric="true" mathcolor="green">&#x21A8;</mo>
+ <mspace id="target2" mathbackground="gray" width="10px" height="200px"/>
+ </mrow>
+ </math>
+ </p>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/presentation-markup/radicals/root-parameters-1.html b/tests/wpt/web-platform-tests/mathml/presentation-markup/radicals/root-parameters-1.html
new file mode 100644
index 00000000000..beddc512a77
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/presentation-markup/radicals/root-parameters-1.html
@@ -0,0 +1,208 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Radical parameters</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS3.SSS3">
+<meta name="assert" content="Elements msqrt and mroot correctly use the radical parameters from the MATH table.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ math, mspace {
+ font-size: 10px;
+ }
+ @font-face {
+ font-family: degreebottomraisepercent25-rulethickness1000;
+ src: url("/fonts/math/radical-degreebottomraisepercent25-rulethickness1000.woff");
+ }
+ @font-face {
+ font-family: displaystyleverticalgap7000-rulethickness1000;
+ src: url("/fonts/math/radical-displaystyleverticalgap7000-rulethickness1000.woff");
+ }
+ @font-face {
+ font-family: extraascender3000-rulethickness1000;
+ src: url("/fonts/math/radical-extraascender3000-rulethickness1000.woff");
+ }
+ @font-face {
+ font-family: kernafterdegreeminus5000-rulethickness1000;
+ src: url("/fonts/math/radical-kernafterdegreeminus5000-rulethickness1000.woff");
+ }
+ @font-face {
+ font-family: kernbeforedegree4000-rulethickness1000;
+ src: url("/fonts/math/radical-kernbeforedegree4000-rulethickness1000.woff");
+ }
+ @font-face {
+ font-family: verticalgap6000-rulethickness1000;
+ src: url("/fonts/math/radical-verticalgap6000-rulethickness1000.woff");
+ }
+ @font-face {
+ font-family: rulethickness8000;
+ src: url("/fonts/math/radical-rulethickness8000.woff");
+ }
+</style>
+<script>
+ var emToPx = 10 / 1000; // font-size: 10px, font.em = 1000
+ var epsilon = 1;
+
+ function getBox(aId) {
+ return document.getElementById(aId).getBoundingClientRect();
+ }
+
+ setup({ explicit_done: true });
+ window.addEventListener("load", function() {
+ document.fonts.ready.then(runTests);
+ });
+
+ function runTests() {
+ test(function() {
+ var v1 = 25;
+ var v2 = 1000 * emToPx;
+ var radicalHeight = getBox("base001").height + v2;
+ assert_approx_equals(getBox("ref001").top - getBox("index001").bottom,
+ v1 * radicalHeight / 100, epsilon,
+ "mroot: vertical position of index");
+ }, "RadicalDegreeBottomRaisePercent");
+
+ test(function() {
+ var v1 = 7000 * emToPx;
+ var v2 = 1000 * emToPx;
+ assert_approx_equals(getBox("base0021").top - getBox("radical0021").top,
+ v1 + v2, epsilon,
+ "msqrt: vertical gap");
+ assert_approx_equals(getBox("base0022").top - getBox("radical0022").top,
+ v1 + v2, epsilon,
+ "mroot: vertical gap");
+ }, "RadicalDisplayStyleVerticalGap");
+
+ test(function() {
+ var v1 = 3000 * emToPx;
+ var v2 = 1000 * emToPx;
+ assert_approx_equals(getBox("base0031").top - getBox("radical0031").top,
+ v1 + v2, epsilon,
+ "msqrt: vertical gap");
+ assert_approx_equals(getBox("base0032").top - getBox("radical0032").top,
+ v1 + v2, epsilon,
+ "mroot: vertical gap");
+ }, "RadicalExtraAscender");
+
+ test(function() {
+ // Note: the size variants of U+221A in this font have width 1000.
+ var v1 = 5000 * emToPx;
+ var radicalSymbolWidth = 1000 * emToPx;
+ var radicalLeft = getBox("base004").left - radicalSymbolWidth;
+ assert_approx_equals(getBox("index004").right - radicalLeft,
+ v1, epsilon,
+ "mroot: kern after degree");
+ }, "RadicalKernAfterDegree");
+
+ test(function() {
+ var v1 = 4000 * emToPx;
+ assert_approx_equals(getBox("index005").left - getBox("radical005").left,
+ v1, epsilon,
+ "mroot: kern before degree");
+ }, "RadicalKernBeforeDegree");
+
+ test(function() {
+ var v = 8000 * emToPx;
+ assert_approx_equals(getBox("base0061").top - getBox("radical0061").top,
+ v, epsilon,
+ "msqrt: vertical gap");
+ assert_approx_equals(getBox("base0062").top - getBox("radical0062").top,
+ v, epsilon,
+ "msqrt: vertical gap");
+ }, "RadicalRuleThickness");
+
+ test(function() {
+ var v1 = 6000 * emToPx;
+ var v2 = 1000 * emToPx;
+ assert_approx_equals(getBox("base0071").top - getBox("radical0071").top,
+ v1 + v2, epsilon,
+ "msqrt: vertical gap");
+ assert_approx_equals(getBox("base0072").top - getBox("radical0072").top,
+ v1 + v2, epsilon,
+ "msqrt: vertical gap");
+ }, "RadicalVerticalGap");
+
+ done();
+ }
+</script>
+</head>
+<body>
+ <p>
+ <math style="font-family: degreebottomraisepercent25-rulethickness1000;">
+ <mspace id="ref001" width="3em" depth="1em" mathbackground="green"/>
+ <mroot>
+ <mspace id="base001" width="3em" height="10em" mathbackground="green"/>
+ <mspace id="index001" width="3em" height="1em" mathbackground="blue"/>
+ </mroot>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math display="block"
+ style="font-family: displaystyleverticalgap7000-rulethickness1000;">
+ <msqrt mathbackground="green" id="radical0021">
+ <mspace id="base0021" width="3em" height="1em" mathbackground="blue"/>
+ </msqrt>
+ <mroot mathbackground="green" id="radical0022">
+ <mspace id="base0022" width="3em" height="1em" mathbackground="blue"/>
+ <mspace width="3em" height="1em" mathbackground="black"/>
+ </mroot>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: extraascender3000-rulethickness1000;">
+ <msqrt mathbackground="green" id="radical0031">
+ <mspace id="base0031" width="3em" height="1em" mathbackground="blue"/>
+ </msqrt>
+ <mroot mathbackground="green" id="radical0032">
+ <mspace id="base0032" width="3em" height="1em" mathbackground="blue"/>
+ <mspace width="3em" height="1em" mathbackground="black"/>
+ </mroot>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: kernafterdegreeminus5000-rulethickness1000;">
+ <mroot>
+ <mspace id="base004" width="3em" height="2em" mathbackground="blue"/>
+ <mspace id="index004" width="7em" height="1em" mathbackground="green"/>
+ </mroot>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: kernbeforedegree4000-rulethickness1000;">
+ <mroot id="radical005" mathbackground="blue">
+ <mspace width="3em" height="1em"/>
+ <mspace id="index005" width="3em" height="1em" mathbackground="green"/>
+ </mroot>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: rulethickness8000;">
+ <msqrt mathbackground="green" id="radical0061">
+ <mspace id="base0061" width="3em" height="1em" mathbackground="blue"/>
+ </msqrt>
+ <mroot mathbackground="green" id="radical0062">
+ <mspace id="base0062" width="3em" height="1em" mathbackground="blue"/>
+ <mspace width="3em" height="1em" mathbackground="black"/>
+ </mroot>
+ </math>
+ </p>
+ <p>
+ <math style="font-family: verticalgap6000-rulethickness1000;">
+ <msqrt mathbackground="green" id="radical0071">
+ <mspace id="base0071" width="3em" height="1em" mathbackground="blue"/>
+ </msqrt>
+ <mroot mathbackground="green" id="radical0072">
+ <mspace id="base0072" width="3em" height="1em" mathbackground="blue"/>
+ <mspace width="3em" height="1em" mathbackground="black"/>
+ </mroot>
+ </math>
+ </p>
+ <hr/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-1.html b/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-1.html
new file mode 100644
index 00000000000..2ff14a694c9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-1.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Subscripts and Superscripts metrics</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS4">
+<meta name="assert" content="Basic metrics for elements msub, msup and msubsup.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ math, mspace {
+ font-size: 10px;
+ }
+</style>
+<script>
+ /* This test does not use any specific fonts and so the exact rules are not
+ specified precisely. We assume reasonable values for script shifts and
+ spacing. */
+
+ function getBox(aId) {
+ var box = document.getElementById(aId).getBoundingClientRect();
+ box.middle = (box.bottom + box.top) / 2;
+ return box;
+ }
+
+ setup({ explicit_done: true });
+ window.addEventListener("load", runTests);
+
+ function runTests() {
+ test(function() {
+ var e = 1;
+ assert_less_than_equal(getBox("msubBase").right, getBox("msubSub").left, e, "msub: subscript is after base");
+ assert_less_than_equal(getBox("msupBase").right, getBox("msupSup").left, e, "msup: superscript is after base");
+ assert_less_than_equal(getBox("msubsupBase").right, getBox("msubsupSub").left, e, "msubsup: subscript is after base");
+ assert_less_than_equal(getBox("msubsupBase").right, getBox("msubsupSup").left, e, "msubsup: superscript is after base");
+
+ e = 3;
+ assert_approx_equals(getBox("msubBase").right, getBox("msubSub").left, e, "msub: space between base and subscript is small");
+ assert_approx_equals(getBox("msubBase").right, getBox("msubSub").left, e, "msub: subscript is after base");
+ assert_approx_equals(getBox("msupBase").right, getBox("msupSup").left, e, "msup: superscript is after base");
+ assert_approx_equals(getBox("msubsupBase").right, getBox("msubsupSub").left, e, "msubsup: subscript is after base");
+ assert_approx_equals(getBox("msubsupBase").right, getBox("msubsupSup").left, e, "msubsup: superscript is after base");
+ }, "Respective horizontal positions");
+
+ test(function() {
+ var e = 1;
+ assert_approx_equals(getBox("msubBase").middle, getBox("baseline").bottom, e, "msub: base is placed on the baseline");
+ assert_approx_equals(getBox("msupBase").middle, getBox("baseline").bottom, e, "msup: base is placed on the baseline");
+ assert_approx_equals(getBox("msubsupBase").middle, getBox("baseline").bottom, e, "msubsup: base is placed on the baseline");
+ }, "Alignment of the base on the baseline");
+
+ test(function() {
+ var e = 3;
+ assert_approx_equals(getBox("msubSub").middle, getBox("msubBase").bottom, e, "msub: script is placed at the bottom of the base");
+ assert_approx_equals(getBox("msupSup").middle, getBox("msupBase").top, e, "msup: script is placed at the top of the base");
+ assert_approx_equals(getBox("msubsupSub").middle, getBox("msubsupBase").bottom, e, "msubsup: script is placed at the bottom of the base");
+ assert_approx_equals(getBox("msubsupSup").middle, getBox("msubsupBase").top, e, "msubsup: script is placed at the top of the base");
+ }, "Vertical position of scripts");
+
+ test(function() {
+ var e = 3;
+ assert_approx_equals(getBox("msub").width, getBox("msubSub").right - getBox("msubBase").left, e, "msub: width is determined by the left/right sides of base/script (+ some space after script)");
+ assert_approx_equals(getBox("msup").width, getBox("msupSup").right - getBox("msupBase").left, e, "msup: width is determined by the left/right sides of base/script (+ some space after script)");
+ assert_approx_equals(getBox("msubsup").width, Math.max(getBox("msubsupSub").right, getBox("msubsupSup").right) - getBox("msubsupBase").left, e, "msubsup: width is determined by the left/right sides of base/scripts (+ some space after script)");
+ }, "Width of scripted elements");
+
+ test(function() {
+ var e = 1;
+ assert_greater_than_equal(getBox("msub").height, getBox("msubBase").height, e, "msub: height is at least the one of the base");
+ assert_greater_than_equal(getBox("msup").height, getBox("msupBase").height, e, "msup: height is at least the one of the base");
+ assert_greater_than_equal(getBox("msubsup").height, getBox("msubsupBase").height, e, "msubsup: height is at least the one of the base");
+
+ e = 3;
+ assert_approx_equals(getBox("msub").height, Math.max(getBox("msubSub").bottom, getBox("msubBase").bottom) - getBox("msubBase").top, e, "msub: height is determined by the top/bottom sides of base/scripts");
+ assert_approx_equals(getBox("msup").height, getBox("msupBase").bottom - Math.min(getBox("msupSup").top, getBox("msupBase").top), e, "msup: height is determined by the top/bottom sides of base/scripts");
+ assert_approx_equals(getBox("msubsup").height, Math.max(getBox("msubSub").bottom, getBox("msubBase").bottom) - Math.min(getBox("msupSup").top, getBox("msupBase").top), e, "msubsup: height is determined by the top/bottom sides of base/scripts");
+ }, "Height of scripted elements");
+
+ done();
+ }
+</script>
+</head>
+<body>
+ <p>
+ <math>
+ <mspace id="baseline" width="30px" height="2px" depth="0px" mathbackground="blue"/>
+ <msub id="msub" mathbackground="green">
+ <mspace id="msubBase" width="30px" height="15px" depth="15px" mathbackground="black"/>
+ <mspace id="msubSub" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </msub>
+ <msup id="msup" mathbackground="blue">
+ <mspace id="msupBase" width="30px" height="15px" depth="15px" mathbackground="black"/>
+ <mspace id="msupSup" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </msup>
+ <msubsup id="msubsup" mathbackground="green">
+ <mspace id="msubsupBase" width="30px" height="15px" depth="15px" mathbackground="black"/>
+ <mspace id="msubsupSub" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="msubsupSup" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </msubsup>
+ </math>
+ </p>
+ <hr/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-2.html b/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-2.html
new file mode 100644
index 00000000000..abef28d12df
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-2.html
@@ -0,0 +1,163 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Subscripts and Superscripts metrics</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS4">
+<meta name="assert" content="Basic metrics for the mmultiscript element.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ math, mspace {
+ font-size: 10px;
+ }
+</style>
+<script>
+ /* This test does not use any specific fonts and so the exact rules are not
+ specified precisely. We assume reasonable values for script shifts and
+ spacing. */
+
+ function getBox(aId) {
+ var box = document.getElementById(aId).getBoundingClientRect();
+ box.middle = (box.bottom + box.top) / 2;
+ return box;
+ }
+
+ setup({ explicit_done: true });
+ window.addEventListener("load", runTests);
+
+ function runTests() {
+ test(function() {
+ var e = 1;
+ assert_less_than_equal(getBox("msubBase").right, getBox("msubSub").left, e, "subscript is after base");
+ assert_less_than_equal(getBox("msupBase").right, getBox("msupSup").left, e, "superscript is after base");
+ assert_less_than_equal(getBox("msubsupBase").right, getBox("msubsupSub").left, e, "subscript is after base");
+ assert_less_than_equal(getBox("msubsupBase").right, getBox("msubsupSup").left, e, "superscript is after base");
+
+ assert_greater_than_equal(getBox("premsubBase").right, getBox("premsubSub").left, e, "subscript is before base");
+ assert_greater_than_equal(getBox("premsupBase").right, getBox("premsupSup").left, e, "superscript is before base");
+ assert_greater_than_equal(getBox("premsubsupBase").right, getBox("premsubsupSub").left, e, "subscript is before base");
+ assert_greater_than_equal(getBox("premsubsupBase").right, getBox("premsubsupSup").left, e, "superscript is before base");
+
+ e = 3;
+ assert_approx_equals(getBox("msubBase").right, getBox("msubSub").left, e, "msub: space between base and subscript is small");
+ assert_approx_equals(getBox("msubBase").right, getBox("msubSub").left, e, "msub: subscript is after base");
+ assert_approx_equals(getBox("msupBase").right, getBox("msupSup").left, e, "msup: superscript is after base");
+ assert_approx_equals(getBox("msubsupBase").right, getBox("msubsupSub").left, e, "msubsup: subscript is after base");
+ assert_approx_equals(getBox("msubsupBase").right, getBox("msubsupSup").left, e, "msubsup: superscript is after base");
+
+ assert_approx_equals(getBox("premsubBase").left, getBox("premsubSub").right, e, "msub: space between base and subscript is small");
+ assert_approx_equals(getBox("premsubBase").left, getBox("premsubSub").right, e, "msub: subscript is after base");
+ assert_approx_equals(getBox("premsupBase").left, getBox("premsupSup").right, e, "msup: superscript is after base");
+ assert_approx_equals(getBox("premsubsupBase").left, getBox("premsubsupSub").right, e, "msubsup: subscript is after base");
+ assert_approx_equals(getBox("premsubsupBase").left, getBox("premsubsupSup").right, e, "msubsup: superscript is after base");
+ }, "Respective horizontal positions");
+
+ test(function() {
+ var e = 1;
+ assert_approx_equals(getBox("msubBase").middle, getBox("baseline").bottom, e, "base is placed on the baseline");
+ assert_approx_equals(getBox("msupBase").middle, getBox("baseline").bottom, e, "base is placed on the baseline");
+ assert_approx_equals(getBox("msubsupBase").middle, getBox("baseline").bottom, e, "base is placed on the baseline");
+ assert_approx_equals(getBox("premsubBase").middle, getBox("baseline").bottom, e, "base is placed on the baseline");
+ assert_approx_equals(getBox("premsupBase").middle, getBox("baseline").bottom, e, "base is placed on the baseline");
+ assert_approx_equals(getBox("premsubsupBase").middle, getBox("baseline").bottom, e, "base is placed on the baseline");
+ }, "Alignment of the base on the baseline");
+
+ test(function() {
+ var e = 3;
+ assert_approx_equals(getBox("msubSub").middle, getBox("msubBase").bottom, e, "script is placed at the bottom of the base");
+ assert_approx_equals(getBox("msupSup").middle, getBox("msupBase").top, e, "script is placed at the top of the base");
+ assert_approx_equals(getBox("msubsupSub").middle, getBox("msubsupBase").bottom, e, "script is placed at the bottom of the base");
+ assert_approx_equals(getBox("msubsupSup").middle, getBox("msubsupBase").top, e, "script is placed at the top of the base");
+
+ assert_approx_equals(getBox("premsubSub").middle, getBox("premsubBase").bottom, e, "script is placed at the bottom of the base");
+ assert_approx_equals(getBox("premsupSup").middle, getBox("premsupBase").top, e, "script is placed at the top of the base");
+ assert_approx_equals(getBox("premsubsupSub").middle, getBox("premsubsupBase").bottom, e, "script is placed at the bottom of the base");
+ assert_approx_equals(getBox("premsubsupSup").middle, getBox("premsubsupBase").top, e, "script is placed at the top of the base");
+ }, "Vertical position of scripts");
+
+ test(function() {
+ var e = 3;
+ assert_approx_equals(getBox("msub").width, getBox("msubSub").right - getBox("msubBase").left, e, "width is determined by the left/right sides of base/script (+ some space after script)");
+ assert_approx_equals(getBox("msup").width, getBox("msupSup").right - getBox("msupBase").left, e, "width is determined by the left/right sides of base/script (+ some space after script)");
+ assert_approx_equals(getBox("msubsup").width, Math.max(getBox("msubsupSub").right, getBox("msubsupSup").right) - getBox("msubsupBase").left, e, "width is determined by the left/right sides of base/scripts (+ some space after script)");
+
+ assert_approx_equals(getBox("premsub").width, getBox("premsubBase").right - getBox("premsubSub").left, e, "width is determined by the right/left sides of base/script (+ some space after script)");
+ assert_approx_equals(getBox("premsup").width, getBox("premsupBase").right - getBox("premsupSup").left, e, "width is determined by the right/left sides of base/script (+ some space after script)");
+ assert_approx_equals(getBox("premsubsup").width, getBox("premsubsupBase").right - Math.min(getBox("premsubsupSub").left, getBox("premsubsupSup").left), e, "width is determined by the right/left sides of base/scripts (+ some space after script)");
+ }, "Width of scripted elements");
+
+ test(function() {
+ var e = 1;
+ assert_greater_than_equal(getBox("msub").height, getBox("msubBase").height, e, "height is at least the one of the base");
+ assert_greater_than_equal(getBox("msup").height, getBox("msupBase").height, e, "height is at least the one of the base");
+ assert_greater_than_equal(getBox("msubsup").height, getBox("msubsupBase").height, e, "height is at least the one of the base");
+ assert_greater_than_equal(getBox("premsub").height, getBox("premsubBase").height, e, "height is at least the one of the base");
+ assert_greater_than_equal(getBox("premsup").height, getBox("premsupBase").height, e, "height is at least the one of the base");
+ assert_greater_than_equal(getBox("premsubsup").height, getBox("premsubsupBase").height, e, "height is at least the one of the base");
+
+ e = 3;
+ assert_approx_equals(getBox("msub").height, Math.max(getBox("msubSub").bottom, getBox("msubBase").bottom) - getBox("msubBase").top, e, "msub height is determined by the top/bottom sides of base/scripts");
+ assert_approx_equals(getBox("msup").height, getBox("msupBase").bottom - Math.min(getBox("msupSup").top, getBox("msupBase").top), e, "msup height is determined by the top/bottom sides of base/scripts");
+ assert_approx_equals(getBox("msubsup").height, Math.max(getBox("msubSub").bottom, getBox("msubBase").bottom) - Math.min(getBox("msupSup").top, getBox("msupBase").top), e, "msubsup height is determined by the top/bottom sides of base/scripts");
+ assert_approx_equals(getBox("premsub").height, Math.max(getBox("premsubSub").bottom, getBox("premsubBase").bottom) - getBox("premsubBase").top, e, "msub height is determined by the top/bottom sides of base/scripts");
+ assert_approx_equals(getBox("premsup").height, getBox("premsupBase").bottom - Math.min(getBox("premsupSup").top, getBox("premsupBase").top), e, "msup height is determined by the top/bottom sides of base/scripts");
+ assert_approx_equals(getBox("premsubsup").height, Math.max(getBox("premsubSub").bottom, getBox("premsubBase").bottom) - Math.min(getBox("premsupSup").top, getBox("premsupBase").top), e, "msubsup height is determined by the top/bottom sides of base/scripts");
+ }, "Height of scripted elements");
+
+ test(function() {
+ ["none", "mprescripts"].forEach(function(name) {
+ var elements = document.getElementsByTagName(name);
+ for (var i = 0; i < elements.length; i++) {
+ var box = elements[i].getBoundingClientRect();
+ assert_equals(box.height * box.width, 0, "<" + name + "> " + i + " has zero is empty");
+ }
+ });
+ }, "Size of empty elements");
+
+ done();
+ }
+</script>
+</head>
+<body>
+ <p>
+ <math>
+ <mspace id="baseline" width="30px" height="2px" depth="0px" mathbackground="blue"/>
+ <mmultiscripts id="msub" mathbackground="green">
+ <mspace id="msubBase" width="30px" height="15px" depth="15px" mathbackground="black"/>
+ <mspace id="msubSub" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <none/>
+ </mmultiscripts>
+ <mmultiscripts id="msup" mathbackground="green">
+ <mspace id="msupBase" width="30px" height="15px" depth="15px" mathbackground="black"/>
+ <none/>
+ <mspace id="msupSup" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </mmultiscripts>
+ <mmultiscripts id="msubsup" mathbackground="green">
+ <mspace id="msubsupBase" width="30px" height="15px" depth="15px" mathbackground="black"/>
+ <mspace id="msubsupSub" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="msubsupSup" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </mmultiscripts>
+ <mmultiscripts id="premsub" mathbackground="green">
+ <mspace id="premsubBase" width="30px" height="15px" depth="15px" mathbackground="black"/>
+ <mprescripts/>
+ <mspace id="premsubSub" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <none/>
+ </mmultiscripts>
+ <mmultiscripts id="premsup" mathbackground="green">
+ <mspace id="premsupBase" width="30px" height="15px" depth="15px" mathbackground="black"/>
+ <mprescripts/>
+ <none/>
+ <mspace id="premsupSup" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </mmultiscripts>
+ <mmultiscripts id="premsubsup" mathbackground="green">
+ <mspace id="premsubsupBase" width="30px" height="15px" depth="15px" mathbackground="black"/>
+ <mprescripts/>
+ <mspace id="premsubsupSub" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="premsubsupSup" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </mmultiscripts>
+ </math>
+ </p>
+ <hr/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-3.html b/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-3.html
new file mode 100644
index 00000000000..c49718979c3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-3.html
@@ -0,0 +1,180 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Subscripts and Superscripts metrics</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS4">
+<meta name="assert" content="Basic metrics for the mmultiscript element with many scripts.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ math, mspace {
+ font-size: 10px;
+ }
+</style>
+<script>
+ /* This test does not use any specific fonts and so the exact rules are not
+ specified precisely. We assume reasonable values for script shifts and
+ spacing. */
+
+ function getBox(aId) {
+ var box = document.getElementById(aId).getBoundingClientRect();
+ box.middle = (box.bottom + box.top) / 2;
+ return box;
+ }
+
+ setup({ explicit_done: true });
+ window.addEventListener("load", runTests);
+
+ function runTests() {
+ test(function() {
+ var e = 1;
+ for (var i = 0; i < 5; i++)
+ assert_approx_equals(getBox("multi" + i + "base").middle, getBox("baseline").bottom, e, "base " + i + "is placed on the baseline");
+ }, "Alignment of the base on the baseline");
+
+ test(function() {
+ var e = 5;
+ assert_approx_equals(getBox("multi0").width, 30, e, "width of multi0");
+ assert_approx_equals(getBox("multi0").height, 30, e, "height of multi0");
+ assert_approx_equals(getBox("multi1").width, 30, e, "width of multi1");
+ assert_approx_equals(getBox("multi1").height, 30, e, "height of multi1");
+ for (i = 2; i <= 4; i++) {
+ var scriptedBox = getBox("multi" + i);
+ var lastPostScript = getBox("multi" + i + "postsup" + (i - 1));
+ var firstPreScript = getBox("multi" + i + "presub1");
+ assert_approx_equals(scriptedBox.height, firstPreScript.bottom - lastPostScript.top, e, "height of multiscript" + i);
+ assert_approx_equals(scriptedBox.width, lastPostScript.right - firstPreScript.left, e, "width of multiscript" + i);
+ }
+ }, "Dimensions of the scripted elements");
+
+ test(function() {
+ var e = 3;
+ for (var i = 2; i <= 4; i++) {
+ var base = getBox("multi" + i + "base");
+ for (var j = 1; j < i; j++) {
+ var presup = getBox("multi" + i + "presup" + j);
+ var postsup = getBox("multi" + i + "postsup" + j);
+ var presub = getBox("multi" + i + "presub" + j);
+ var postsub = getBox("multi" + i + "postsub" + j);
+ assert_approx_equals(base.top, presup.middle, e, "multi" + i + " " + j + " presup script");
+ assert_approx_equals(base.top, postsup.middle, e, "multi" + i + " " + j + " postsup script");
+ assert_approx_equals(base.bottom, presub.middle, e, "multi" + i + " " + j + " presub script");
+ assert_approx_equals(base.bottom, postsub.middle, e, "multi" + i + " " + j + " postsub script");
+ }
+ }
+ }, "Vertical positions of scripts");
+
+ test(function() {
+ var e = 1;
+ for (var i = 2; i <= 4; i++) {
+ var base = getBox("multi" + i + "base");
+ for (var j = 1; j < i; j++) {
+ var presup = getBox("multi" + i + "presup" + j);
+ var postsup = getBox("multi" + i + "postsup" + j);
+ var presub = getBox("multi" + i + "presub" + j);
+ var postsub = getBox("multi" + i + "postsub" + j);
+ assert_approx_equals(presup.right, presub.right, e, "multi" + i + "pre");
+ assert_approx_equals(postsup.left, postsub.left, e, "multi" + i + "post");
+ }
+ }
+ }, "Horizontal alignment of scripts");
+
+ test(function() {
+ for (var i = 2; i <= 4; i++) {
+ var base = getBox("multi" + i + "base");
+ var firstPostScript = getBox("multi" + i + "postsub1");
+ var lastPreScript = getBox("multi" + i + "presup" + (i - 1));
+ assert_less_than_equal(base.right, firstPostScript.left, 1, "postcripts are after base");
+ assert_less_than_equal(lastPreScript.right, base.left, 1, "prescripts are before base");
+ assert_approx_equals(base.right, firstPostScript.left, 5, "spacing after base is not too large");
+ assert_approx_equals(lastPreScript.right, base.left, 5, "spacing before base is not too large");
+ for (var j = 1; j < i - 1; j++) {
+ var post = getBox("multi" + i + "postsub" + j);
+ var postNext = getBox("multi" + i + "postsub" + (j + 1));
+ var pre = getBox("multi" + i + "presup" + j);
+ var preNext = getBox("multi" + i + "presup" + (j + 1));
+ assert_less_than_equal(post.right, postNext.left, 1, "multi" + i + "order post" + j + " is before its successor");
+ assert_less_than_equal(pre.right, preNext.left, 1, "multi" + i + "order pre" + j + " is before its successor");
+ assert_approx_equals(post.right, postNext.left, 5, "multi" + i + "space after post" + j + " is not too large");
+ assert_approx_equals(pre.right, preNext.left, 5, "multi" + i + "space after pre" + j + " is not too large");
+ }
+ }
+ }, "Horizontal positions of scripts");
+
+ done();
+ }
+</script>
+</head>
+<body>
+ <p>
+ <math>
+ <mspace id="baseline" width="30px" height="2px" depth="0px" mathbackground="blue"/>
+ <mmultiscripts id="multi0" mathbackground="green">
+ <mspace id="multi0base" width="30px" height="15px" depth="15px" mathbackground="black"/>
+ </mmultiscripts>
+ <mmultiscripts id="multi1" mathbackground="green">
+ <mspace id="multi1base" width="30px" height="15px" depth="15px" mathbackground="black"/>
+ <mprescripts/>
+ </mmultiscripts>
+ <mmultiscripts id="multi2" mathbackground="green">
+ <mspace id="multi2base" width="30px" height="15px" depth="15px" mathbackground="black"/>
+ <mspace id="multi2postsub1" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi2postsup1" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mprescripts/>
+ <mspace id="multi2presub1" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi2presup1" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </mmultiscripts>
+ <mmultiscripts id="multi3" mathbackground="green">
+ <mspace id="multi3base" width="30px" height="15px" depth="15px" mathbackground="black"/>
+ <mspace id="multi3postsub1" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi3postsup1" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi3postsub2" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi3postsup2" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mprescripts/>
+ <mspace id="multi3presub1" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi3presup1" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi3presub2" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi3presup2" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </mmultiscripts>
+ <mmultiscripts id="multi4" mathbackground="green">
+ <mspace id="multi4base" width="30px" height="15px" depth="15px" mathbackground="black"/>
+ <mspace id="multi4postsub1" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi4postsup1" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi4postsub2" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi4postsup2" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi4postsub3" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi4postsup3" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mprescripts/>
+ <mspace id="multi4presub1" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi4presup1" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi4presub2" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi4presup2" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi4presub3" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi4presup3" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </mmultiscripts>
+ <mmultiscripts id="multi5" mathbackground="green">
+ <mspace id="multi5base" width="30px" height="15px" depth="15px" mathbackground="black"/>
+ <mspace id="multi5postsub1" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi5postsup1" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi5postsub2" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi5postsup2" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi5postsub3" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi5postsup3" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi5postsub4" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi5postsup4" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mprescripts/>
+ <mspace id="multi5presub1" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi5presup1" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi5presub2" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi5presup2" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi5presub3" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi5presup3" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi5presub4" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi5presup4" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </mmultiscripts>
+ </math>
+ </p>
+ <hr/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-4.html b/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-4.html
new file mode 100644
index 00000000000..2acc7746c4f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-4.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Subscripts and Superscripts metrics</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS4">
+<meta name="assert" content="Verify metrics of scripted elements for bases of different heights.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ math, mspace {
+ font-size: 10px;
+ }
+</style>
+<script>
+ /* This test does not use any specific fonts and so the exact rules are not
+ specified precisely. We assume reasonable values for script shifts and
+ spacing. */
+
+ function getBox(aId) {
+ var box = document.getElementById(aId).getBoundingClientRect();
+ box.middle = (box.bottom + box.top) / 2;
+ return box;
+ }
+
+ setup({ explicit_done: true });
+ window.addEventListener("load", runTests);
+
+ var sizeArray = [50, 75, 100];
+
+ function runTests() {
+ test(function() {
+ var e = 1;
+ sizeArray.forEach(function(size) {
+ assert_approx_equals(getBox("msub" + size + "base").middle, getBox("baseline").bottom, e, "msub base " + size + "is placed on the baseline");
+ assert_approx_equals(getBox("msup" + size + "base").middle, getBox("baseline").bottom, e, "msup base " + size + "is placed on the baseline");
+ assert_approx_equals(getBox("msubsup" + size + "base").middle, getBox("baseline").bottom, e, "msubsup base " + size + "is placed on the baseline");
+ assert_approx_equals(getBox("multi" + size + "base").middle, getBox("baseline").bottom, e, "mmultiscripts base " + size + "is placed on the baseline");
+ });
+ }, "Alignment on the baseline for bases of different heights");
+
+ test(function() {
+ var e = 5;
+ sizeArray.forEach(function(size) {
+ assert_approx_equals(getBox("msub" + size + "sub").middle, getBox("msub" + size + "base").bottom, e, "msub script " + size + "is placed at the top of of the base");
+ });
+ }, "Vertical position of the scripts for bases of different heights");
+
+ done();
+ }
+</script>
+</head>
+<body>
+ <p>
+ <math>
+ <mspace id="baseline" width="30px" height="2px" depth="0px" mathbackground="blue"/>
+ <msub id="msub50">
+ <mspace id="msub50base" width="30px" height="50px" depth="50px" mathbackground="black"/>
+ <mspace id="msub50sub" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </msub>
+ <msup id="msup50">
+ <mspace id="msup50base" width="30px" height="50px" depth="50px" mathbackground="black"/>
+ <mspace id="msup50sup" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </msup>
+ <msubsup id="msubsup50">
+ <mspace id="msubsup50base" width="30px" height="50px" depth="50px" mathbackground="black"/>
+ <mspace id="msubsup50sub" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="msubsup50sup" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </msubsup>
+ <mmultiscripts id="multi50">
+ <mspace id="multi50base" width="30px" height="50px" depth="50px" mathbackground="black"/>
+ <mspace id="multi50postsub" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi50postsup" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mprescripts/>
+ <mspace id="multi50presub" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi50presup" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </mmultiscripts>
+ <msub id="msub75">
+ <mspace id="msub75base" width="30px" height="75px" depth="75px" mathbackground="black"/>
+ <mspace id="msub75sub" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </msub>
+ <msup id="msup75">
+ <mspace id="msup75base" width="30px" height="75px" depth="75px" mathbackground="black"/>
+ <mspace id="msup75sup" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </msup>
+ <msubsup id="msubsup75">
+ <mspace id="msubsup75base" width="30px" height="75px" depth="75px" mathbackground="black"/>
+ <mspace id="msubsup75sub" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="msubsup75sup" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </msubsup>
+ <mmultiscripts id="multi75">
+ <mspace id="multi75base" width="30px" height="75px" depth="75px" mathbackground="black"/>
+ <mspace id="multi75postsub" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi75postsup" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mprescripts/>
+ <mspace id="multi75presub" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi75presub" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </mmultiscripts>
+ <msub id="msub100">
+ <mspace id="msub100base" width="30px" height="100px" depth="100px" mathbackground="black"/>
+ <mspace id="msub100sub" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </msub>
+ <msup id="msup100">
+ <mspace id="msup100base" width="30px" height="100px" depth="100px" mathbackground="black"/>
+ <mspace id="msup100sup" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </msup>
+ <msubsup id="msubsup100">
+ <mspace id="msubsup100base" width="30px" height="100px" depth="100px" mathbackground="black"/>
+ <mspace id="msubsup100sub" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="msubsup100sup" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </msubsup>
+ <mmultiscripts id="multi100">
+ <mspace id="multi100base" width="30px" height="100px" depth="100px" mathbackground="black"/>
+ <mspace id="multi100postsub" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi100postsup" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mprescripts/>
+ <mspace id="multi100presub" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="multi100presup" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </mmultiscripts>
+ </math>
+ </p>
+ <hr/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-5.html b/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-5.html
new file mode 100644
index 00000000000..19b6eee6674
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-5.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Subscripts and Superscripts metrics</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS4">
+<meta name="assert" content="Verify metrics of scripted elements with tall scripts.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ math, mspace {
+ font-size: 10px;
+ }
+</style>
+<script>
+ /* This test does not use any specific fonts and so the exact rules are not
+ specified precisely. We assume reasonable values for script shifts and
+ spacing. */
+
+ function getBox(aId) {
+ var box = document.getElementById(aId).getBoundingClientRect();
+ box.middle = (box.bottom + box.top) / 2;
+ return box;
+ }
+
+ setup({ explicit_done: true });
+ window.addEventListener("load", runTests);
+
+ var sizeArray = [50, 75, 100];
+
+ function runTests() {
+ test(function() {
+ var e = 1;
+ assert_approx_equals(getBox("msubbase").middle, getBox("baseline").bottom, e, "msub base is placed on the baseline");
+ assert_approx_equals(getBox("msupbase").middle, getBox("baseline").bottom, e, "msup base is placed on the baseline");
+ assert_approx_equals(getBox("msubsupbase").middle, getBox("baseline").bottom, e, "msubsup base is placed on the baseline");
+ assert_approx_equals(getBox("multibase").middle, getBox("baseline").bottom, e, "mmultiscripts baseis placed on the baseline");
+ }, "Alignment on the baseline with different and large script heights");
+
+ test(function() {
+ assert_greater_than(getBox("msubsub").top, getBox("msubbase").top, "msub: subscript is below the top of the base");
+ assert_less_than(getBox("msupsup").bottom, getBox("msupbase").bottom, "msup: supscript is above the bottom of the base");
+ assert_greater_than(getBox("msubsupsub").top, getBox("msubsupbase").top, "msubsup: subscript is below the top of the base");
+ assert_less_than(getBox("msubsupsup").bottom, getBox("msubsupbase").bottom, "msubsup: supscript is above the bottom of the base");
+ assert_greater_than(getBox("multipostsub").top, getBox("multibase").top, "mmultiscripts: postsubscript is below the top of the base");
+ assert_less_than(getBox("multipostsup").bottom, getBox("multibase").bottom, "mmultiscripts: postsupscript is above the bottom of the base");
+ assert_greater_than(getBox("multipresub").top, getBox("multibase").top, "mmultiscripts: presubscript is below the top of the base");
+ assert_less_than(getBox("multipresup").bottom, getBox("multibase").bottom, "mmultiscripts: presupscript is above the bottom of the base");
+ }, "Tall subscripts/superscripts are not placed too high/low");
+
+ test(function() {
+ assert_greater_than(getBox("msubsupsub").top, getBox("msubsupsup").bottom, "msubsup: subscript is below the superscript");
+ assert_greater_than(getBox("multipresub").top, getBox("multipresup").bottom, "mmultiscripts: presubscript is below the presuperscript");
+ assert_greater_than(getBox("multipostsub").top, getBox("multipostsup").bottom, "mmultiscripts: postsubscript is below the postsuperscript");
+ }, "No collisions for tall subscripts and superscripts");
+
+ done();
+ }
+</script>
+</head>
+<body>
+ <p>
+ <math>
+ <mspace id="baseline" width="30px" height="2px" depth="0px" mathbackground="blue"/>
+ <msub id="msub">
+ <mspace id="msubbase" width="30px" height="15px" depth="15px" mathbackground="black"/>
+ <mspace id="msubsub" width="10px" height="50px" depth="50px" mathbackground="black"/>
+ </msub>
+ <msup id="msup">
+ <mspace id="msupbase" width="30px" height="15px" depth="15px" mathbackground="black"/>
+ <mspace id="msupsup" width="10px" height="75px" depth="75px" mathbackground="black"/>
+ </msup>
+ <msubsup id="msubsup">
+ <mspace id="msubsupbase" width="30px" height="15px" depth="15px" mathbackground="black"/>
+ <mspace id="msubsupsub" width="10px" height="50px" depth="50px" mathbackground="black"/>
+ <mspace id="msubsupsup" width="10px" height="75px" depth="75px" mathbackground="black"/>
+ </msubsup>
+ <mmultiscripts id="multi">
+ <mspace id="multibase" width="30px" height="15px" depth="15px" mathbackground="black"/>
+ <mspace id="multipostsub" width="10px" height="50px" depth="50px" mathbackground="black"/>
+ <mspace id="multipostsup" width="10px" height="75px" depth="75px" mathbackground="black"/>
+ <mprescripts/>
+ <mspace id="multipresub" width="10px" height="50px" depth="50px" mathbackground="black"/>
+ <mspace id="multipresup" width="10px" height="75px" depth="75px" mathbackground="black"/>
+ </mmultiscripts>
+ </math>
+ </p>
+ <hr/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-parameters-1.html b/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-parameters-1.html
new file mode 100644
index 00000000000..bc710f302f6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/subsup-parameters-1.html
@@ -0,0 +1,334 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Subscripts and Superscripts parameters</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS4">
+<meta name="assert" content="Elements msub, msup, subsup and msubsup correctly use the subscript and superscript parameters from the MATH table.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ math, mspace {
+ font-size: 10px;
+ }
+ @font-face {
+ font-family: spaceafterscript3000;
+ src: url("/fonts/math/scripts-spaceafterscript3000.woff");
+ }
+ @font-face {
+ font-family: superscriptshiftup7000;
+ src: url("/fonts/math/scripts-superscriptshiftup7000.woff");
+ }
+ @font-face {
+ font-family: superscriptshiftupcramped5000;
+ src: url("/fonts/math/scripts-superscriptshiftupcramped5000.woff");
+ }
+ @font-face {
+ font-family: subscriptshiftdown6000;
+ src: url("/fonts/math/scripts-subscriptshiftdown6000.woff");
+ }
+ @font-face {
+ font-family: subsuperscriptgapmin11000;
+ src: url("/fonts/math/scripts-subsuperscriptgapmin11000.woff");
+ }
+ @font-face {
+ font-family: subsuperscriptgapmin11000superscriptbottommaxwithsubscript3000;
+ src: url("/fonts/math/scripts-subsuperscriptgapmin11000-superscriptbottommaxwithsubscript3000.woff");
+ }
+ @font-face {
+ font-family: subscripttopmax4000;
+ src: url("/fonts/math/scripts-subscripttopmax4000.woff");
+ }
+ @font-face {
+ font-family: superscriptbottommin8000;
+ src: url("/fonts/math/scripts-superscriptbottommin8000.woff");
+ }
+ @font-face {
+ font-family: subscriptbaselinedropmin9000;
+ src: url("/fonts/math/scripts-subscriptbaselinedropmin9000.woff");
+ }
+ @font-face {
+ font-family: superscriptbaselinedropmax10000;
+ src: url("/fonts/math/scripts-superscriptbaselinedropmax10000.woff");
+ }
+</style>
+<script>
+ var emToPx = 10 / 1000; // font-size: 10px, font.em = 1000
+ var epsilon = 1;
+
+ function getBox(aId) {
+ return document.getElementById(aId).getBoundingClientRect();
+ }
+
+ setup({ explicit_done: true });
+ window.addEventListener("load", function() {
+ document.fonts.ready.then(runTests);
+ });
+
+ function runTests() {
+ test(function() {
+ var v = 3000 * emToPx;
+ assert_approx_equals(getBox("ref001").left - getBox("sub001").right, v, epsilon, "msub: Space after subscript");
+ assert_approx_equals(getBox("ref002").left - getBox("sup002").right, v, epsilon, "msup: Space after superscript");
+ assert_approx_equals(getBox("ref003").left - getBox("sup003").right, v, epsilon, "msubsup: Space after superscript");
+ assert_approx_equals(getBox("sup0042").left - getBox("sup0041").right, v, epsilon, "mmultiscripts: Space after first superscript");
+ assert_approx_equals(getBox("sup0043").left - getBox("sup0042").right, v, epsilon, "mmultiscripts: Space after second superscript");
+ assert_approx_equals(getBox("ref004").left - getBox("sup0043").right, v, epsilon, "mmultiscripts: Space after last superscript");
+ }, "SpaceAfterScript");
+
+ test(function() {
+ var v = 7000 * emToPx;
+ assert_approx_equals(getBox("ref101").bottom - getBox("sup102").bottom, v, epsilon, "msup: Superscript shift");
+ assert_approx_equals(getBox("ref101").bottom - getBox("sup103").bottom, v, epsilon, "msubsup: Superscript shift");
+ assert_approx_equals(getBox("ref101").bottom - getBox("sup1041").bottom, v, epsilon, "mmultiscripts: First superscript shift");
+ assert_approx_equals(getBox("ref101").bottom - getBox("sup1042").bottom, v, epsilon, "mmultiscripts: Second superscript shift");
+ assert_approx_equals(getBox("ref101").bottom - getBox("sup1043").bottom, v, epsilon, "mmultiscripts: Last superscript shift");
+ }, "SuperscriptShiftUp");
+
+ test(function() {
+ var v = 5000 * emToPx;
+ assert_approx_equals(getBox("ref201").bottom - getBox("sup202").bottom, v, epsilon, "msup: Superscript shift");
+ assert_approx_equals(getBox("ref201").bottom - getBox("sup203").bottom, v, epsilon, "msubsup: Superscript shift");
+ assert_approx_equals(getBox("ref201").bottom - getBox("sup2041").bottom, v, epsilon, "mmultiscripts: First superscript shift");
+ assert_approx_equals(getBox("ref201").bottom - getBox("sup2042").bottom, v, epsilon, "mmultiscripts: Second superscript shift");
+ assert_approx_equals(getBox("ref201").bottom - getBox("sup2043").bottom, v, epsilon, "mmultiscripts: Last superscript shift");
+ }, "SuperscriptShiftUpCramped");
+
+ test(function() {
+ var v = 6000 * emToPx;
+ assert_approx_equals(getBox("sub301").bottom - getBox("ref300").bottom, v, epsilon, "msup: Subscript shift");
+ assert_approx_equals(getBox("sub302").bottom - getBox("ref300").bottom, v, epsilon, "msubsup: Subscript shift");
+ assert_approx_equals(getBox("sub303").bottom - getBox("ref300").bottom, v, epsilon, "mmultiscripts: First subscript shift");
+ assert_approx_equals(getBox("sub304").bottom - getBox("ref300").bottom, v, epsilon, "mmultiscripts: Second subscript shift");
+ }, "SubscriptShiftDown");
+
+ test(function() {
+ var v = 11000 * emToPx;
+ assert_approx_equals(getBox("sub4011").top - getBox("sup4012").bottom, v, epsilon, "msubsup: SubSuperscript gap");
+ assert_approx_equals(getBox("sub4021").top - getBox("sup4022").bottom, v, epsilon, "mmultiscripts: SubSuperscript gap");
+ }, "SubSuperscriptGapMin");
+
+ test(function() {
+ var v1 = 11000 * emToPx;
+ var v2 = 3000 * emToPx;
+ assert_approx_equals(getBox("sub501").top - getBox("sup501").bottom, v1, epsilon, "msubsup: SubSuperscript gap");
+ assert_approx_equals(getBox("ref500").bottom - getBox("sup501").bottom, v2, epsilon, "msubsup: Superscript bottom");
+ assert_approx_equals(getBox("sub502").top - getBox("sup502").bottom, v1, epsilon, "mmultiscripts: SubSuperscript gap");
+ assert_approx_equals(getBox("ref500").bottom - getBox("sup502").bottom, v2, epsilon, "mmultiscripts: Superscript bottom");
+ }, "SuperscriptBottomMaxWithSubscript");
+
+ test(function() {
+ var v = 4000 * emToPx;
+ assert_approx_equals(getBox("ref600").bottom - getBox("sub601").top, v, epsilon, "msub: Subscript top");
+ }, "SubscriptTopMax");
+
+ test(function() {
+ var v = 8000 * emToPx;
+ assert_approx_equals(getBox("ref700").bottom - getBox("sub701").bottom, v, epsilon, "msub: Superscript bottom");
+ }, "SuperscriptBottomMin");
+
+ test(function() {
+ var v = 9000 * emToPx;
+ assert_approx_equals(getBox("sub801").bottom - getBox("base801").bottom, v, epsilon, "msub: Superscript drop");
+ }, "SubscriptBaselineDrop");
+
+ test(function() {
+ var v = 10000 * emToPx;
+ assert_approx_equals(getBox("sup901").bottom - getBox("base901").top, v, epsilon, "msup: Superscript drop");
+ }, "SuperscriptBaselineDrop");
+
+ done();
+ }
+</script>
+</head>
+<body>
+ <p>
+ <math style="font-family: spaceafterscript3000;">
+ <msub>
+ <mspace height="2em" width="2em" mathbackground="blue"/>
+ <mspace id="sub001" height="1em" width="1em" mathbackground="red"/>
+ </msub>
+ <mspace id="ref001" height="1em" width="1em" mathbackground="green"/>
+ </math>
+ <math style="font-family: spaceafterscript3000;">
+ <msup>
+ <mspace height="2em" width="2em" mathbackground="blue"/>
+ <mspace id="sup002" height="1em" width="1em" mathbackground="red"/>
+ </msup>
+ <mspace id="ref002" height="1em" width="1em" mathbackground="green"/>
+ </math>
+ <math style="font-family: spaceafterscript3000;">
+ <msubsup>
+ <mspace height="2em" width="2em" mathbackground="blue"/>
+ <mspace/>
+ <mspace id="sup003" height="1em" width="1em" mathbackground="red"/>
+ </msubsup>
+ <mspace id="ref003" height="1em" width="1em" mathbackground="green"/>
+ </math>
+ <math style="font-family: spaceafterscript3000;">
+ <mmultiscripts>
+ <mspace height="2em" width="2em" mathbackground="blue"/>
+ <none/>
+ <mspace id="sup0041" height="1em" width="1em" mathbackground="red"/>
+ <none/>
+ <mspace id="sup0042" height="1em" width="1em" mathbackground="red"/>
+ <none/>
+ <mspace id="sup0043" height="1em" width="1em" mathbackground="red"/>
+ </mmultiscripts>
+ <mspace id="ref004" height="1em" width="1em" mathbackground="green"/>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: superscriptshiftup7000;">
+ <mspace id="ref101" height="1em" width="1em" mathbackground="green"/>
+ <msup>
+ <mspace height="2em" width="2em" mathbackground="blue"/>
+ <mspace id="sup102" height="1em" width="1em" mathbackground="red"/>
+ </msup>
+ <msubsup>
+ <mspace height="2em" width="2em" mathbackground="blue"/>
+ <mspace height="1em" width="1em" mathbackground="red"/>
+ <mspace id="sup103" height="1em" width="1em" mathbackground="red"/>
+ </msubsup>
+ <mmultiscripts>
+ <mspace height="2em" width="2em" mathbackground="blue"/>
+ <none/>
+ <mspace id="sup1041" height="1em" width="1em" mathbackground="red"/>
+ <none/>
+ <mspace id="sup1042" height="1em" width="1em" mathbackground="red"/>
+ <none/>
+ <mspace id="sup1043" height="1em" width="1em" mathbackground="red"/>
+ </mmultiscripts>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: superscriptshiftupcramped5000;">
+ <msqrt>
+ <mspace id="ref201" height="1em" width="1em" mathbackground="green"/>
+ <msup>
+ <mspace height="2em" width="2em" mathbackground="blue"/>
+ <mspace id="sup202" height="1em" width="1em" mathbackground="red"/>
+ </msup>
+ <msubsup>
+ <mspace height="2em" width="2em" mathbackground="blue"/>
+ <mspace height="1em" width="1em" mathbackground="blue"/>
+ <mspace id="sup203" height="1em" width="1em" mathbackground="red"/>
+ </msubsup>
+ <mmultiscripts>
+ <mspace height="2em" width="2em" mathbackground="blue"/>
+ <none/>
+ <mspace id="sup2041" height="1em" width="1em" mathbackground="red"/>
+ <none/>
+ <mspace id="sup2042" height="1em" width="1em" mathbackground="red"/>
+ <none/>
+ <mspace id="sup2043" height="1em" width="1em" mathbackground="red"/>
+ </mmultiscripts>
+ </msqrt>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: subscriptshiftdown6000;">
+ <mspace id="ref300" height="1em" width="1em" mathbackground="green"/>
+ <msub>
+ <mspace height="2em" width="2em" mathbackground="blue"/>
+ <mspace id="sub301" height="1em" width="1em" mathbackground="red"/>
+ </msub>
+ <msubsup>
+ <mspace height="2em" width="2em" mathbackground="blue"/>
+ <mspace id="sub302" height="1em" width="1em" mathbackground="red"/>
+ <mspace height="1em" width="1em" mathbackground="blue"/>
+ </msubsup>
+ <mmultiscripts>
+ <mspace height="2em" width="2em" mathbackground="blue"/>
+ <mspace id="sub303" height="1em" width="1em" mathbackground="red"/>
+ <none/>
+ <mspace id="sub304" height="1em" width="1em" mathbackground="red"/>
+ <none/>
+ </mmultiscripts>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: subsuperscriptgapmin11000;">
+ <msubsup>
+ <mspace height="2em" width="2em" mathbackground="blue"/>
+ <mspace id="sub4011" height="1em" width="1em" mathbackground="red"/>
+ <mspace id="sup4012" height="1em" width="1em" mathbackground="red"/>
+ </msubsup>
+ <mmultiscripts>
+ <mspace height="2em" width="2em" mathbackground="blue"/>
+ <none/>
+ <none/>
+ <mspace id="sub4021" height="1em" width="1em" mathbackground="red"/>
+ <mspace id="sup4022" height="1em" width="1em" mathbackground="red"/>
+ </mmultiscripts>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: subsuperscriptgapmin11000superscriptbottommaxwithsubscript3000;">
+ <mspace id="ref500" height="1em" width="1em" mathbackground="green"/>
+ <msubsup>
+ <mspace height="2em" width="2em" mathbackground="blue"/>
+ <mspace id="sub501" height="1em" width="1em" mathbackground="red"/>
+ <mspace id="sup501" height="1em" width="1em" mathbackground="red"/>
+ </msubsup>
+ <mmultiscripts>
+ <mspace height="2em" width="2em" mathbackground="blue"/>
+ <none/>
+ <none/>
+ <mspace id="sub502" height="1em" width="1em" mathbackground="red"/>
+ <mspace id="sup502" height="1em" width="1em" mathbackground="red"/>
+ </mmultiscripts>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: subscripttopmax4000;">
+ <mspace id="ref600" height="1em"
+ width="1em" mathbackground="green"/>
+ <msub>
+ <mspace height="2em" width="2em" mathbackground="blue"/>
+ <mspace id="sub601" height="10em"
+ width="1em" mathbackground="red"/>
+ </msub>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: superscriptbottommin8000;">
+ <mspace id="ref700" height="1em"
+ width="1em" mathbackground="green"/>
+ <msup>
+ <mspace height="2em" width="2em" mathbackground="blue"/>
+ <mspace id="sub701" depth="1em"
+ width="1em" mathbackground="red"/>
+ </msup>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: subscriptbaselinedropmin9000;">
+ <msub>
+ <mspace id="base801" height="2em" width="2em" mathbackground="blue"/>
+ <mspace id="sub801" height="1em"
+ width="1em" mathbackground="red"/>
+ </msub>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: superscriptbaselinedropmax10000;">
+ <msup>
+ <mspace id="base901" height="15em" width="2em" mathbackground="blue"/>
+ <mspace id="sup901" height="1em"
+ width="1em" mathbackground="red"/>
+ </msup>
+ </math>
+ </p>
+ <hr/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/underover-1.html b/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/underover-1.html
new file mode 100644
index 00000000000..25e087971da
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/underover-1.html
@@ -0,0 +1,161 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Underscripts and Overscripts parameters</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS4">
+<meta name="assert" content="Elements munder, mover, munderover correctly .">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ math, mspace, mo {
+ font-size: 10px;
+ }
+</style>
+<script>
+ /* This test does not use any specific fonts and so the exact rules are not
+ specified precisely. We assume reasonable values for script shifts and
+ spacing. */
+
+ function getBox(aId) {
+ var box = document.getElementById(aId).getBoundingClientRect();
+ box.middle = (box.bottom + box.top) / 2;
+ box.center = (box.left + box.right) / 2;
+ return box;
+ }
+
+ setup({ explicit_done: true });
+ window.addEventListener("load", runTests);
+
+ function runTests() {
+ test(function() {
+ var e = 1;
+ for (var i = 0; i <= 3; i++) {
+ assert_approx_equals(getBox("under" + i + "base").middle, getBox("baseline").bottom, e, "munder " + i + ": base is placed on the baseline");
+ assert_approx_equals(getBox("over" + i + "base").middle, getBox("baseline").bottom, e, "mover " + i + ": base is placed on the baseline");
+ }
+ for (var i = 0; i <= 5; i++) {
+ assert_approx_equals(getBox("underover" + i + "base").middle, getBox("baseline").bottom, e, "munderover " + i + ": base is placed on the baseline");
+ }
+ }, "Alignment of the base on the baseline");
+
+ test(function() {
+ var e = 1;
+ for (var i = 0; i <= 3; i++) {
+ assert_approx_equals(getBox("under" + i + "under").center, getBox("under" + i + "base").center, e, "munder " + i + ": base and script are horizontally centered");
+ assert_approx_equals(getBox("over" + i + "over").center, getBox("over" + i + "base").center, e, "mover " + i + ": base and script are horizontally centered");
+ }
+ for (var i = 0; i <= 5; i++) {
+ assert_approx_equals(getBox("underover" + i + "under").center, getBox("underover" + i + "base").center, e, "munderover " + i + ": base and underscript are horizontally centered");
+ assert_approx_equals(getBox("underover" + i + "over").center, getBox("underover" + i + "base").center, e, "munderover " + i + ": base and overscript are horizontally centered");
+ }
+ }, "Horizontal alignments of base and scripts");
+
+ test(function() {
+ for (var i = 0; i <= 3; i++) {
+ assert_greater_than_equal(getBox("under" + i + "under").top, getBox("under" + i + "base").bottom, "munder " + i + ": script is under base");
+ assert_less_than_equal(getBox("over" + i + "over").bottom, getBox("over" + i + "base").top, "mover " + i + ": script is over base");
+ }
+ for (var i = 0; i <= 5; i++) {
+ assert_greater_than_equal(getBox("underover" + i + "under").top, getBox("underover" + i + "base").bottom, "munderover " + i + ": underscript is under base");
+ assert_less_than_equal(getBox("underover" + i + "over").bottom, getBox("underover" + i + "base").top, "munderover " + i + ": overscript is over base");
+ }
+ }, "Relative vertical positions of base and scripts");
+
+ test(function() {
+ var e = 1;
+ for (var i = 0; i <= 3; i++) {
+ assert_approx_equals(getBox("under" + i).width, Math.max(getBox("under" + i + "base").width, getBox("under" + i + "under").width), e, "munder " + i + ": width is determined by the maximum of width of base and script");
+ assert_approx_equals(getBox("over" + i).width, Math.max(getBox("over" + i + "base").width, getBox("over" + i + "over").width), e, "mover " + i + ": width is determined by the maximum of width of base and script");
+ }
+ for (var i = 0; i <= 5; i++) {
+ assert_approx_equals(getBox("underover" + i).width, Math.max(getBox("underover" + i + "base").width, getBox("underover" + i + "under").width, getBox("underover" + i + "over").width), e, "munderover " + i + ": width is determined by the maximum of width of base and scripts");
+ }
+ }, "Width of scripted elements");
+
+ test(function() {
+ var e = 3;
+ for (var i = 0; i <= 3; i++) {
+ assert_approx_equals(getBox("under" + i).height, getBox("under" + i + "base").height + getBox("under" + i + "under").height + e, e, "munder " + i + ": height is determined by the sum of heights of base and script plus some spacing.");
+ assert_approx_equals(getBox("over" + i).height, getBox("over" + i + "base").height + getBox("over" + i + "over").height + e, e, "mover " + i + ": height is determined by the sum of heights of base and script plus some spacing.");
+ }
+ for (var i = 0; i <= 5; i++) {
+ assert_approx_equals(getBox("underover" + i).height, getBox("underover" + i + "base").height + getBox("underover" + i + "under").height + getBox("underover" + i + "over").height + e, e, "munderover " + i + ": height is determined by the sum heights of base and scripts");
+ }
+ }, "Height of scripted elements");
+
+ done();
+ }
+</script>
+</head>
+<body>
+ <p>
+ <math>
+ <mspace id="baseline" width="30px" height="2px" depth="0px" mathbackground="blue"/>
+ <munder id="under0">
+ <mspace id="under0base" width="30px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="under0under" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </munder>
+ <munder id="under1">
+ <mspace id="under1base" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="under1under" width="30px" height="5px" depth="5px" mathbackground="black"/>
+ </munder>
+ <munder id="under2">
+ <mspace id="under2base" width="10px" height="15px" depth="15px" mathbackground="black"/>
+ <mspace id="under2under" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </munder>
+ <munder id="under3">
+ <mspace id="under3base" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="under3under" width="10px" height="15px" depth="15px" mathbackground="black"/>
+ </munder>
+ <mover id="over0">
+ <mspace id="over0base" width="30px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="over0over" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </mover>
+ <mover id="over1">
+ <mspace id="over1base" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="over1over" width="30px" height="5px" depth="5px" mathbackground="black"/>
+ </mover>
+ <mover id="over2">
+ <mspace id="over2base" width="10px" height="15px" depth="15px" mathbackground="black"/>
+ <mspace id="over2over" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </mover>
+ <mover id="over3">
+ <mspace id="over3base" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="over3over" width="10px" height="15px" depth="15px" mathbackground="black"/>
+ </mover>
+ <munderover id="underover0">
+ <mspace id="underover0base" width="30px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="underover0under" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="underover0over" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </munderover>
+ <munderover id="underover1">
+ <mspace id="underover1base" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="underover1under" width="30px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="underover1over" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </munderover>
+ <munderover id="underover2">
+ <mspace id="underover2base" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="underover2under" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="underover2over" width="30px" height="5px" depth="5px" mathbackground="black"/>
+ </munderover>
+ <munderover id="underover3">
+ <mspace id="underover3base" width="10px" height="15px" depth="15px" mathbackground="black"/>
+ <mspace id="underover3under" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="underover3over" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </munderover>
+ <munderover id="underover4">
+ <mspace id="underover4base" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="underover4under" width="10px" height="15px" depth="15px" mathbackground="black"/>
+ <mspace id="underover4over" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ </munderover>
+ <munderover id="underover5">
+ <mspace id="underover5base" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="underover5under" width="10px" height="5px" depth="5px" mathbackground="black"/>
+ <mspace id="underover5over" width="10px" height="15px" depth="15px" mathbackground="black"/>
+ </munderover>
+ </math>
+ </p>
+ <hr/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/underover-parameters-1.html b/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/underover-parameters-1.html
new file mode 100644
index 00000000000..462c8193374
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/underover-parameters-1.html
@@ -0,0 +1,143 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Underscripts and Overscripts parameters</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS4">
+<meta name="assert" content="Elements munder, mover, munderover correctly use the limit parameters from the MATH table.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ math, mspace, mo {
+ font-size: 10px;
+ }
+ @font-face {
+ font-family: lowerlimitbaselinedropmin3000;
+ src: url("/fonts/math/limits-lowerlimitbaselinedropmin3000.woff");
+ }
+ @font-face {
+ font-family: lowerlimitgapmin11000;
+ src: url("/fonts/math/limits-lowerlimitgapmin11000.woff");
+ }
+ @font-face {
+ font-family: upperlimitbaselinerisemin5000;
+ src: url("/fonts/math/limits-upperlimitbaselinerisemin5000.woff");
+ }
+ @font-face {
+ font-family: upperlimitgapmin7000;
+ src: url("/fonts/math/limits-upperlimitgapmin7000.woff");
+ }
+</style>
+<script>
+ var emToPx = 10 / 1000; // font-size: 10px, font.em = 1000
+ var epsilon = 1;
+
+ function getBox(aId) {
+ return document.getElementById(aId).getBoundingClientRect();
+ }
+
+ setup({ explicit_done: true });
+ window.addEventListener("load", function() {
+ document.fonts.ready.then(runTests);
+ });
+
+ function runTests() {
+ test(function() {
+ var v = 3000 * emToPx;
+ assert_approx_equals(getBox("under00011").top - getBox("ref0001").bottom,
+ v, epsilon, "munder: under shift");
+ assert_approx_equals(getBox("under00012").top - getBox("ref0001").bottom,
+ v, epsilon, "munderover: under shift");
+ }, "LowerLimitBaselineDropMin");
+
+ test(function() {
+ var v = 11000 * emToPx;
+ assert_approx_equals(getBox("under00021").top - getBox("ref0002").bottom,
+ v, epsilon, "munder: under gap");
+ assert_approx_equals(getBox("under00022").top - getBox("ref0002").bottom,
+ v, epsilon, "munderover: under gap");
+ }, "LowerLimitGapMin");
+
+ test(function() {
+ var v = 5000 * emToPx;
+ assert_approx_equals(getBox("ref0003").top - getBox("over00031").bottom,
+ v, epsilon, "mover: over shift");
+ assert_approx_equals(getBox("ref0003").top - getBox("over00032").bottom,
+ v, epsilon, "munderover: over shift");
+ }, "UpperLimitBaselineRiseMin");
+
+ test(function() {
+ var v = 7000 * emToPx;
+ assert_approx_equals(getBox("ref0004").top - getBox("over00041").bottom,
+ v, epsilon, "mover: over shift");
+ assert_approx_equals(getBox("ref0004").top - getBox("over00042").bottom,
+ v, epsilon, "munderover: over shift");
+ }, "UpperLimitGapMin");
+
+ done();
+ }
+</script>
+</head>
+<body>
+ <p>
+ <math style="font-family: lowerlimitbaselinedropmin3000;">
+ <mspace id="ref0001" height="1em" width="3em" mathbackground="green"/>
+ <munder>
+ <mo movablelimits="false">&#x2211;</mo>
+ <mspace id="under00011" depth="1em" width="3em" mathbackground="blue"/>
+ </munder>
+ <munderover>
+ <mo movablelimits="false">&#x2211;</mo>
+ <mspace id="under00012" depth="1em" width="3em" mathbackground="blue"/>
+ <mspace height="1em" width="3em" mathbackground="black"/>
+ </munderover>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: lowerlimitgapmin11000;">
+ <mspace id="ref0002" height="1em" width="3em" mathbackground="green"/>
+ <munder>
+ <mo movablelimits="false">&#x2211;</mo>
+ <mspace id="under00021" depth="1em" width="3em" mathbackground="blue"/>
+ </munder>
+ <munderover>
+ <mo movablelimits="false">&#x2211;</mo>
+ <mspace id="under00022" depth="1em" width="3em" mathbackground="blue"/>
+ <mspace height="1em" width="3em" mathbackground="black"/>
+ </munderover>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: upperlimitbaselinerisemin5000;">
+ <mspace id="ref0003" height="1em" width="3em" mathbackground="green"/>
+ <mover>
+ <mo movablelimits="false">&#x2211;</mo>
+ <mspace id="over00031" height="1em" width="3em" mathbackground="blue"/>
+ </mover>
+ <munderover>
+ <mo movablelimits="false">&#x2211;</mo>
+ <mspace height="1em" width="3em" mathbackground="black"/>
+ <mspace id="over00032" height="1em" width="3em" mathbackground="blue"/>
+ </munderover>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: upperlimitgapmin7000;">
+ <mspace id="ref0004" height="1em" width="3em" mathbackground="green"/>
+ <mover>
+ <mo movablelimits="false">&#x2211;</mo>
+ <mspace id="over00041" depth="1em" width="3em" mathbackground="blue"/>
+ </mover>
+ <munderover>
+ <mo movablelimits="false">&#x2211;</mo>
+ <mspace height="1em" width="3em" mathbackground="black"/>
+ <mspace id="over00042" depth="1em" width="3em" mathbackground="blue"/>
+ </munderover>
+ </math>
+ </p>
+ <hr/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/underover-parameters-2.html b/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/underover-parameters-2.html
new file mode 100644
index 00000000000..afd5b8e77a9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/underover-parameters-2.html
@@ -0,0 +1,143 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Underscripts and Overscripts parameters</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS4">
+<meta name="assert" content="Elements munder, mover, munderover correctly use the stretch stack parameters from the MATH table.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ math, mspace, mo {
+ font-size: 10px;
+ }
+ @font-face {
+ font-family: bottomshiftdown3000;
+ src: url("/fonts/math/stretchstack-bottomshiftdown3000.woff");
+ }
+ @font-face {
+ font-family: gapbelowmin11000;
+ src: url("/fonts/math/stretchstack-gapbelowmin11000.woff");
+ }
+ @font-face {
+ font-family: topshiftup5000;
+ src: url("/fonts/math/stretchstack-topshiftup5000.woff");
+ }
+ @font-face {
+ font-family: gapabovemin7000;
+ src: url("/fonts/math/stretchstack-gapabovemin7000.woff");
+ }
+</style>
+<script>
+ var emToPx = 10 / 1000; // font-size: 10px, font.em = 1000
+ var epsilon = 1;
+
+ function getBox(aId) {
+ return document.getElementById(aId).getBoundingClientRect();
+ }
+
+ setup({ explicit_done: true });
+ window.addEventListener("load", function() {
+ document.fonts.ready.then(runTests);
+ });
+
+ function runTests() {
+ test(function() {
+ var v = 3000 * emToPx;
+ assert_approx_equals(getBox("under00011").top - getBox("ref0001").bottom,
+ v, epsilon, "munder: under shift");
+ assert_approx_equals(getBox("under00012").top - getBox("ref0001").bottom,
+ v, epsilon, "munderover: under shift");
+ }, "StretchStackBottomShiftDown");
+
+ test(function() {
+ var v = 11000 * emToPx;
+ assert_approx_equals(getBox("under00021").top - getBox("ref0002").bottom,
+ v, epsilon, "munder: under gap");
+ assert_approx_equals(getBox("under00022").top - getBox("ref0002").bottom,
+ v, epsilon, "munderover: under gap");
+ }, "StretchStackGapBelowMin");
+
+ test(function() {
+ var v = 5000 * emToPx;
+ assert_approx_equals(getBox("ref0003").top - getBox("over00031").bottom,
+ v, epsilon, "mover: over shift");
+ assert_approx_equals(getBox("ref0003").top - getBox("over00032").bottom,
+ v, epsilon, "munderover: over shift");
+ }, "StretchStackTopShiftUp");
+
+ test(function() {
+ var v = 7000 * emToPx;
+ assert_approx_equals(getBox("ref0004").top - getBox("over00041").bottom,
+ v, epsilon, "mover: over shift");
+ assert_approx_equals(getBox("ref0004").top - getBox("over00042").bottom,
+ v, epsilon, "munderover: over shift");
+ }, "StretchStackGapAboveMin");
+
+ done();
+ }
+</script>
+</head>
+<body>
+ <p>
+ <math style="font-family: bottomshiftdown3000;">
+ <mspace id="ref0001" height="1em" width="3em" mathbackground="green"/>
+ <munder>
+ <mo>&#x2192;</mo>
+ <mspace id="under00011" depth="1em" width="3em" mathbackground="blue"/>
+ </munder>
+ <munderover>
+ <mo>&#x2192;</mo>
+ <mspace id="under00012" depth="1em" width="3em" mathbackground="blue"/>
+ <mspace height="1em" width="3em" mathbackground="black"/>
+ </munderover>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: gapbelowmin11000;">
+ <mspace id="ref0002" height="1em" width="3em" mathbackground="green"/>
+ <munder>
+ <mo>&#x2192;</mo>
+ <mspace id="under00021" depth="1em" width="3em" mathbackground="blue"/>
+ </munder>
+ <munderover>
+ <mo>&#x2192;</mo>
+ <mspace id="under00022" depth="1em" width="3em" mathbackground="blue"/>
+ <mspace height="1em" width="3em" mathbackground="black"/>
+ </munderover>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: topshiftup5000;">
+ <mspace id="ref0003" height="1em" width="3em" mathbackground="green"/>
+ <mover>
+ <mo>&#x2192;</mo>
+ <mspace id="over00031" height="1em" width="3em" mathbackground="blue"/>
+ </mover>
+ <munderover>
+ <mo>&#x2192;</mo>
+ <mspace height="1em" width="3em" mathbackground="black"/>
+ <mspace id="over00032" height="1em" width="3em" mathbackground="blue"/>
+ </munderover>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: gapabovemin7000;">
+ <mspace id="ref0004" height="1em" width="3em" mathbackground="green"/>
+ <mover>
+ <mo>&#x2192;</mo>
+ <mspace id="over00041" depth="1em" width="3em" mathbackground="blue"/>
+ </mover>
+ <munderover>
+ <mo>&#x2192;</mo>
+ <mspace height="1em" width="3em" mathbackground="black"/>
+ <mspace id="over00042" depth="1em" width="3em" mathbackground="blue"/>
+ </munderover>
+ </math>
+ </p>
+ <hr/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/underover-parameters-3.html b/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/underover-parameters-3.html
new file mode 100644
index 00000000000..29b023b3051
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/underover-parameters-3.html
@@ -0,0 +1,322 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Underscripts and Overscripts parameters</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS4">
+<meta name="assert" content="Elements munder, mover, munderover correctly use underbar/overbar and AccentBaseHeight parameters from the MATH table.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ math, mspace, mo {
+ font-size: 10px;
+ }
+ @font-face {
+ font-family: accentbaseheight4000underbarextradescender5000;
+ src: url("/fonts/math/underover-accentbaseheight4000-underbarextradescender5000.woff");
+ }
+ @font-face {
+ font-family: accentbaseheight4000underbarverticalgap7000;
+ src: url("/fonts/math/underover-accentbaseheight4000-underbarverticalgap7000.woff");
+ }
+ @font-face {
+ font-family: accentbaseheight4000overbarextraascender3000;
+ src: url("/fonts/math/underover-accentbaseheight4000-overbarextraascender3000.woff");
+ }
+ @font-face {
+ font-family: accentbaseheight4000overbarverticalgap11000;
+ src: url("/fonts/math/underover-accentbaseheight4000-overbarverticalgap11000.woff");
+ }
+</style>
+<script>
+ var emToPx = 10 / 1000; // font-size: 10px, font.em = 1000
+ var epsilon = 2;
+ var axisBaseHeight = 4000 * emToPx;
+ var shortBaseHeight = 3000 * emToPx; // shortBaseHeight < axisBaseHeight
+ var tallBaseHeight = 5000 * emToPx; // tallBaseHeight > axisBaseHeight
+
+ function getBox(aId) {
+ return document.getElementById(aId).getBoundingClientRect();
+ }
+
+ setup({ explicit_done: true });
+ window.addEventListener("load", function() {
+ document.fonts.ready.then(runTests);
+ });
+
+ function runTests() {
+ test(function() {
+ for (var i = 1; i <= 4; i++) {
+ for (var j = 1; j <= 6; j++) {
+ var baseId = ("base00" + i) + j;
+ assert_approx_equals(getBox("ref00" + i).bottom,
+ getBox(baseId).bottom,
+ epsilon,
+ "alignment of " + baseId);
+ }
+ }
+ }, "Baseline alignment");
+
+ test(function() {
+ for (var i = 1; i <= 4; i++) {
+ for (var j = 1; j <= 6; j++) {
+ var baseId = ("base00" + i) + j;
+ assert_approx_equals(getBox(baseId).height,
+ j == 2 || j == 5 ?
+ tallBaseHeight :shortBaseHeight,
+ epsilon,
+ "height of " + baseId);
+ }
+ }
+ }, "Heights of bases");
+
+ test(function() {
+ var v = 5000 * emToPx;
+ assert_approx_equals(getBox("ref001").bottom - getBox("over0014").bottom,
+ shortBaseHeight, epsilon,
+ "munderover: nonaccent over short base");
+ assert_approx_equals(getBox("ref001").bottom - getBox("over0015").bottom,
+ tallBaseHeight, epsilon,
+ "munderover: accent over tall base");
+ assert_approx_equals(getBox("ref001").bottom - getBox("over0016").bottom,
+ axisBaseHeight, epsilon,
+ "munderover: accent over short base");
+ for (var j = 1; j <= 6; j++) {
+ var elId = "el001" + j;
+ var baseId = "base001" + j;
+ var underId = "under001" + j;
+ assert_approx_equals(getBox(underId).top - getBox(baseId).bottom,
+ 0, epsilon,
+ "gap between " + baseId + " and " + underId);
+ assert_approx_equals(getBox(elId).bottom - getBox(underId).bottom,
+ v, epsilon,
+ "extra descender below " + underId);
+ }
+ }, "AccentBaseHeight, UnderbarExtraDescender");
+
+ test(function() {
+ var v = 7000 * emToPx;
+ assert_approx_equals(getBox("ref002").bottom - getBox("over0024").bottom,
+ shortBaseHeight, epsilon,
+ "munderover: nonaccent over short base");
+ assert_approx_equals(getBox("ref002").bottom - getBox("over0025").bottom,
+ tallBaseHeight, epsilon,
+ "munderover: accent over tall base");
+ assert_approx_equals(getBox("ref002").bottom - getBox("over0026").bottom,
+ axisBaseHeight, epsilon,
+ "munderover: accent over short base");
+ for (var j = 1; j <= 6; j++) {
+ var elId = "el002" + j;
+ var baseId = "base002" + j;
+ var underId = "under002" + j;
+ var gap = (j == 2 || j == 3 ? 0 : v);
+ assert_approx_equals(getBox(underId).top - getBox(baseId).bottom,
+ gap, epsilon,
+ "gap between " + baseId + " and " + underId);
+ }
+ }, "AccentBaseHeight, UnderbarVerticalGap");
+
+ test(function() {
+ var v = 3000 * emToPx;
+ assert_approx_equals(getBox("ref003").bottom - getBox("over0031").bottom,
+ shortBaseHeight, epsilon,
+ "mover: nonaccent over short base");
+ assert_approx_equals(getBox("ref003").bottom - getBox("over0032").bottom,
+ tallBaseHeight, epsilon,
+ "mover: accent over tall base");
+ assert_approx_equals(getBox("ref003").bottom - getBox("over0033").bottom,
+ axisBaseHeight, epsilon,
+ "mover: accent over short base");
+ assert_approx_equals(getBox("ref003").bottom - getBox("over0034").bottom,
+ shortBaseHeight, epsilon,
+ "munderover: nonaccent over short base");
+ assert_approx_equals(getBox("ref003").bottom - getBox("over0035").bottom,
+ tallBaseHeight, epsilon,
+ "munderover: accent over tall base");
+ assert_approx_equals(getBox("ref003").bottom - getBox("over0036").bottom,
+ axisBaseHeight, epsilon,
+ "munderover: accent over short base");
+ for (var j = 1; j <= 6; j++) {
+ var elId = "el003" + j;
+ var baseId = "base003" + j;
+ if (j >= 4) {
+ var underId = "under003" + j;
+ assert_approx_equals(getBox(underId).top - getBox(baseId).bottom,
+ 0, epsilon,
+ "gap between " + baseId + " and " + underId);
+ }
+ var overId = "over003" + j;
+ assert_approx_equals(getBox(overId).top - getBox(elId).top,
+ v, epsilon,
+ "extra ascender below " + overId);
+ }
+ }, "AccentBaseHeight, OverbarExtraAscender");
+
+ test(function() {
+ v = 11000 * emToPx;
+ assert_approx_equals(getBox("ref004").bottom - getBox("over0041").bottom,
+ shortBaseHeight + v, epsilon,
+ "mover: nonaccent over short base");
+ assert_approx_equals(getBox("ref004").bottom - getBox("over0042").bottom,
+ tallBaseHeight, epsilon,
+ "mover: accent over tall base");
+ assert_approx_equals(getBox("ref004").bottom - getBox("over0043").bottom,
+ axisBaseHeight, epsilon,
+ "mover: accent over short base");
+ assert_approx_equals(getBox("ref004").bottom - getBox("over0044").bottom,
+ shortBaseHeight + v, epsilon,
+ "munderover: nonaccent over short base");
+ assert_approx_equals(getBox("ref004").bottom - getBox("over0045").bottom,
+ tallBaseHeight, epsilon,
+ "munderover: accent over tall base");
+ assert_approx_equals(getBox("ref004").bottom - getBox("over0046").bottom,
+ axisBaseHeight, epsilon,
+ "munderover: accent over short base");
+ for (var j = 4; j <= 6; j++) {
+ var baseId = "base004" + j;
+ var underId = "under004" + j;
+ assert_approx_equals(getBox(underId).top - getBox(baseId).bottom,
+ 0, epsilon,
+ "gap between " + baseId + " and " + underId);
+ }
+ }, "AccentBaseHeight, OverbarVerticalGap");
+
+ done();
+ }
+</script>
+</head>
+<body>
+ <p>
+ <math style="font-family: accentbaseheight4000underbarextradescender5000;">
+ <mspace id="ref001" height="1em" width="3em" mathbackground="green"/>
+ <munder mathbackground="cyan" id="el0011">
+ <mspace id="base0011" height="3em" width="1em" mathbackground="black"/>
+ <mspace id="under0011" height="1em" width="3em" mathbackground="blue"/>
+ </munder>
+ <munder mathbackground="cyan" id="el0012" accentunder="true">
+ <mspace id="base0012" height="5em" width="1em" mathbackground="black"/>
+ <mspace id="under0012" height="1em" width="3em" mathbackground="blue"/>
+ </munder>
+ <munder mathbackground="cyan" id="el0013" accentunder="true">
+ <mspace id="base0013" height="3em" width="1em" mathbackground="black"/>
+ <mspace id="under0013" height="1em" width="3em" mathbackground="blue"/>
+ </munder>
+ <munderover mathbackground="cyan" id="el0014">
+ <mspace id="base0014" height="3em" width="1em" mathbackground="black"/>
+ <mspace id="under0014" height="1em" width="3em" mathbackground="blue"/>
+ <mspace id="over0014" height="1em" width="3em" mathbackground="red"/>
+ </munderover>
+ <munderover mathbackground="cyan" id="el0015" accent="true">
+ <mspace id="base0015" height="5em" width="1em" mathbackground="black"/>
+ <mspace id="under0015" height="1em" width="3em" mathbackground="blue"/>
+ <mspace id="over0015" height="1em" width="3em" mathbackground="red"/>
+ </munderover>
+ <munderover mathbackground="cyan" id="el0016" accent="true">
+ <mspace id="base0016" height="3em" width="1em" mathbackground="black"/>
+ <mspace id="under0016" height="1em" width="3em" mathbackground="blue"/>
+ <mspace id="over0016" height="1em" width="3em" mathbackground="red"/>
+ </munderover>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: accentbaseheight4000underbarverticalgap7000;">
+ <mspace id="ref002" height="1em" width="3em" mathbackground="green"/>
+ <munder mathbackground="cyan" id="el0021">
+ <mspace id="base0021" height="3em" width="1em" mathbackground="black"/>
+ <mspace id="under0021" height="1em" width="3em" mathbackground="blue"/>
+ </munder>
+ <munder mathbackground="cyan" id="el0022" accentunder="true">
+ <mspace id="base0022" height="5em" width="1em" mathbackground="black"/>
+ <mspace id="under0022" height="1em" width="3em" mathbackground="blue"/>
+ </munder>
+ <munder mathbackground="cyan" id="el0023" accentunder="true">
+ <mspace id="base0023" height="3em" width="1em" mathbackground="black"/>
+ <mspace id="under0023" height="1em" width="3em" mathbackground="blue"/>
+ </munder>
+ <munderover mathbackground="cyan" id="el0024">
+ <mspace id="base0024" height="3em" width="1em" mathbackground="black"/>
+ <mspace id="under0024" height="1em" width="3em" mathbackground="blue"/>
+ <mspace id="over0024" height="1em" width="3em" mathbackground="red"/>
+ </munderover>
+ <munderover mathbackground="cyan" id="el0025" accent="true">
+ <mspace id="base0025" height="5em" width="1em" mathbackground="black"/>
+ <mspace id="under0025" height="1em" width="3em" mathbackground="blue"/>
+ <mspace id="over0025" height="1em" width="3em" mathbackground="red"/>
+ </munderover>
+ <munderover mathbackground="cyan" id="el0026" accent="true">
+ <mspace id="base0026" height="3em" width="1em" mathbackground="black"/>
+ <mspace id="under0026" height="1em" width="3em" mathbackground="blue"/>
+ <mspace id="over0026" height="1em" width="3em" mathbackground="red"/>
+ </munderover>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: accentbaseheight4000overbarextraascender3000;">
+ <mspace id="ref003" height="1em" width="3em" mathbackground="green"/>
+ <mover mathbackground="cyan" id="el0031">
+ <mspace id="base0031" height="3em" width="1em" mathbackground="black"/>
+ <mspace id="over0031" height="1em" width="3em" mathbackground="red"/>
+ </mover>
+ <mover mathbackground="cyan" id="el0032" accent="true">
+ <mspace id="base0032" height="5em" width="1em" mathbackground="black"/>
+ <mspace id="over0032" height="1em" width="3em" mathbackground="red"/>
+ </mover>
+ <mover mathbackground="cyan" id="el0033" accent="true">
+ <mspace id="base0033" height="3em" width="1em" mathbackground="black"/>
+ <mspace id="over0033" height="1em" width="3em" mathbackground="red"/>
+ </mover>
+ <munderover mathbackground="cyan" id="el0034">
+ <mspace id="base0034" height="3em" width="1em" mathbackground="black"/>
+ <mspace id="under0034" height="1em" width="3em" mathbackground="blue"/>
+ <mspace id="over0034" height="1em" width="3em" mathbackground="red"/>
+ </munderover>
+ <munderover mathbackground="cyan" id="el0035" accent="true">
+ <mspace id="base0035" height="5em" width="1em" mathbackground="black"/>
+ <mspace id="under0035" height="1em" width="3em" mathbackground="blue"/>
+ <mspace id="over0035" height="1em" width="3em" mathbackground="red"/>
+ </munderover>
+ <munderover mathbackground="cyan" id="el0036" accent="true">
+ <mspace id="base0036" height="3em" width="1em" mathbackground="black"/>
+ <mspace id="under0036" height="1em" width="3em" mathbackground="blue"/>
+ <mspace id="over0036" height="1em" width="3em" mathbackground="red"/>
+ </munderover>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: accentbaseheight4000overbarverticalgap11000;">
+ <mspace id="ref004" height="1em" width="3em" mathbackground="green"/>
+ <mover mathbackground="cyan" id="el0041">
+ <mspace id="base0041" height="3em" width="1em" mathbackground="black"/>
+ <mspace id="over0041" height="1em" width="3em" mathbackground="red"/>
+ </mover>
+ <mover mathbackground="cyan" id="el0042" accent="true">
+ <mspace id="base0042" height="5em" width="1em" mathbackground="black"/>
+ <mspace id="over0042" height="1em" width="3em" mathbackground="red"/>
+ </mover>
+ <mover mathbackground="cyan" id="el0043" accent="true">
+ <mspace id="base0043" height="3em" width="1em" mathbackground="black"/>
+ <mspace id="over0043" height="1em" width="3em" mathbackground="red"/>
+ </mover>
+ <munderover mathbackground="cyan" id="el0044">
+ <mspace id="base0044" height="3em" width="1em" mathbackground="black"/>
+ <mspace id="under0044" height="1em" width="3em" mathbackground="blue"/>
+ <mspace id="over0044" height="1em" width="3em" mathbackground="red"/>
+ </munderover>
+ <munderover mathbackground="cyan" id="el0045" accent="true">
+ <mspace id="base0045" height="5em" width="1em" mathbackground="black"/>
+ <mspace id="under0045" height="1em" width="3em" mathbackground="blue"/>
+ <mspace id="over0045" height="1em" width="3em" mathbackground="red"/>
+ </munderover>
+ <munderover mathbackground="cyan" id="el0046" accent="true">
+ <mspace id="base0046" height="3em" width="1em" mathbackground="black"/>
+ <mspace id="under0046" height="1em" width="3em" mathbackground="blue"/>
+ <mspace id="over0046" height="1em" width="3em" mathbackground="red"/>
+ </munderover>
+ </math>
+ </p>
+ <hr/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/underover-parameters-4.html b/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/underover-parameters-4.html
new file mode 100644
index 00000000000..4dfe2eae975
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/presentation-markup/scripts/underover-parameters-4.html
@@ -0,0 +1,322 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Underscripts and Overscripts parameters</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS4">
+<meta name="assert" content="Elements munder, mover, munderover correctly use underbar/overbar and AccentBaseHeight parameters from the MATH table.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ math, mspace, mo {
+ font-size: 10px;
+ }
+ @font-face {
+ font-family: accentbaseheight4000underbarextradescender5000;
+ src: url("/fonts/math/underover-accentbaseheight4000-underbarextradescender5000.woff");
+ }
+ @font-face {
+ font-family: accentbaseheight4000underbarverticalgap7000;
+ src: url("/fonts/math/underover-accentbaseheight4000-underbarverticalgap7000.woff");
+ }
+ @font-face {
+ font-family: accentbaseheight4000overbarextraascender3000;
+ src: url("/fonts/math/underover-accentbaseheight4000-overbarextraascender3000.woff");
+ }
+ @font-face {
+ font-family: accentbaseheight4000overbarverticalgap11000;
+ src: url("/fonts/math/underover-accentbaseheight4000-overbarverticalgap11000.woff");
+ }
+</style>
+<script>
+ var emToPx = 10 / 1000; // font-size: 10px, font.em = 1000
+ var epsilon = 2;
+ var axisBaseHeight = 4000 * emToPx;
+ var shortBaseHeight = 3000 * emToPx; // shortBaseHeight < axisBaseHeight
+ var tallBaseHeight = 5000 * emToPx; // tallBaseHeight > axisBaseHeight
+
+ function getBox(aId) {
+ return document.getElementById(aId).getBoundingClientRect();
+ }
+
+ setup({ explicit_done: true });
+ window.addEventListener("load", function() {
+ document.fonts.ready.then(runTests);
+ });
+
+ function runTests() {
+ test(function() {
+ for (var i = 1; i <= 4; i++) {
+ for (var j = 1; j <= 6; j++) {
+ var baseId = ("base00" + i) + j;
+ assert_approx_equals(getBox("ref00" + i).bottom,
+ getBox(baseId).bottom,
+ epsilon,
+ "alignment of " + baseId);
+ }
+ }
+ }, "Baseline alignment");
+
+ test(function() {
+ for (var i = 1; i <= 4; i++) {
+ for (var j = 1; j <= 6; j++) {
+ var baseId = ("base00" + i) + j;
+ assert_approx_equals(getBox(baseId).height,
+ j == 2 || j == 5 ?
+ tallBaseHeight :shortBaseHeight,
+ epsilon,
+ "height of " + baseId);
+ }
+ }
+ }, "Heights of bases");
+
+ test(function() {
+ var v = 5000 * emToPx;
+ assert_approx_equals(getBox("ref001").bottom - getBox("over0014").bottom,
+ shortBaseHeight, epsilon,
+ "munderover: nonaccent over short base");
+ assert_approx_equals(getBox("ref001").bottom - getBox("over0015").bottom,
+ tallBaseHeight, epsilon,
+ "munderover: accent over tall base");
+ assert_approx_equals(getBox("ref001").bottom - getBox("over0016").bottom,
+ axisBaseHeight, epsilon,
+ "munderover: accent over short base");
+ for (var j = 1; j <= 6; j++) {
+ var elId = "el001" + j;
+ var baseId = "base001" + j;
+ var underId = "under001" + j;
+ assert_approx_equals(getBox(underId).top - getBox(baseId).bottom,
+ 0, epsilon,
+ "gap between " + baseId + " and " + underId);
+ assert_approx_equals(getBox(elId).bottom - getBox(underId).bottom,
+ v, epsilon,
+ "extra descender below " + underId);
+ }
+ }, "AccentBaseHeight, UnderbarExtraDescender");
+
+ test(function() {
+ var v = 7000 * emToPx;
+ assert_approx_equals(getBox("ref002").bottom - getBox("over0024").bottom,
+ shortBaseHeight, epsilon,
+ "munderover: nonaccent over short base");
+ assert_approx_equals(getBox("ref002").bottom - getBox("over0025").bottom,
+ tallBaseHeight, epsilon,
+ "munderover: accent over tall base");
+ assert_approx_equals(getBox("ref002").bottom - getBox("over0026").bottom,
+ axisBaseHeight, epsilon,
+ "munderover: accent over short base");
+ for (var j = 1; j <= 6; j++) {
+ var elId = "el002" + j;
+ var baseId = "base002" + j;
+ var underId = "under002" + j;
+ var gap = (j == 2 || j == 3 ? 0 : v);
+ assert_approx_equals(getBox(underId).top - getBox(baseId).bottom,
+ gap, epsilon,
+ "gap between " + baseId + " and " + underId);
+ }
+ }, "AccentBaseHeight, UnderbarVerticalGap");
+
+ test(function() {
+ var v = 3000 * emToPx;
+ assert_approx_equals(getBox("ref003").bottom - getBox("over0031").bottom,
+ shortBaseHeight, epsilon,
+ "mover: nonaccent over short base");
+ assert_approx_equals(getBox("ref003").bottom - getBox("over0032").bottom,
+ tallBaseHeight, epsilon,
+ "mover: accent over tall base");
+ assert_approx_equals(getBox("ref003").bottom - getBox("over0033").bottom,
+ axisBaseHeight, epsilon,
+ "mover: accent over short base");
+ assert_approx_equals(getBox("ref003").bottom - getBox("over0034").bottom,
+ shortBaseHeight, epsilon,
+ "munderover: nonaccent over short base");
+ assert_approx_equals(getBox("ref003").bottom - getBox("over0035").bottom,
+ tallBaseHeight, epsilon,
+ "munderover: accent over tall base");
+ assert_approx_equals(getBox("ref003").bottom - getBox("over0036").bottom,
+ axisBaseHeight, epsilon,
+ "munderover: accent over short base");
+ for (var j = 1; j <= 6; j++) {
+ var elId = "el003" + j;
+ var baseId = "base003" + j;
+ if (j >= 4) {
+ var underId = "under003" + j;
+ assert_approx_equals(getBox(underId).top - getBox(baseId).bottom,
+ 0, epsilon,
+ "gap between " + baseId + " and " + underId);
+ }
+ var overId = "over003" + j;
+ assert_approx_equals(getBox(overId).top - getBox(elId).top,
+ v, epsilon,
+ "extra ascender below " + overId);
+ }
+ }, "AccentBaseHeight, OverbarExtraAscender");
+
+ test(function() {
+ v = 11000 * emToPx;
+ assert_approx_equals(getBox("ref004").bottom - getBox("over0041").bottom,
+ shortBaseHeight + v, epsilon,
+ "mover: nonaccent over short base");
+ assert_approx_equals(getBox("ref004").bottom - getBox("over0042").bottom,
+ tallBaseHeight, epsilon,
+ "mover: accent over tall base");
+ assert_approx_equals(getBox("ref004").bottom - getBox("over0043").bottom,
+ axisBaseHeight, epsilon,
+ "mover: accent over short base");
+ assert_approx_equals(getBox("ref004").bottom - getBox("over0044").bottom,
+ shortBaseHeight + v, epsilon,
+ "munderover: nonaccent over short base");
+ assert_approx_equals(getBox("ref004").bottom - getBox("over0045").bottom,
+ tallBaseHeight, epsilon,
+ "munderover: accent over tall base");
+ assert_approx_equals(getBox("ref004").bottom - getBox("over0046").bottom,
+ axisBaseHeight, epsilon,
+ "munderover: accent over short base");
+ for (var j = 4; j <= 6; j++) {
+ var baseId = "base004" + j;
+ var underId = "under004" + j;
+ assert_approx_equals(getBox(underId).top - getBox(baseId).bottom,
+ 0, epsilon,
+ "gap between " + baseId + " and " + underId);
+ }
+ }, "AccentBaseHeight, OverbarVerticalGap");
+
+ done();
+ }
+</script>
+</head>
+<body>
+ <p>
+ <math style="font-family: accentbaseheight4000underbarextradescender5000;">
+ <mspace id="ref001" height="1em" width="3em" mathbackground="green"/>
+ <munder mathbackground="cyan" id="el0011">
+ <mspace id="base0011" height="3em" width="1em" mathbackground="black"/>
+ <mo id="under0011" mathcolor="blue">&#xB0;</mo>
+ </munder>
+ <munder mathbackground="cyan" id="el0012">
+ <mspace id="base0012" height="5em" width="1em" mathbackground="black"/>
+ <mo id="under0012" mathcolor="blue">&#x2D8;</mo>
+ </munder>
+ <munder mathbackground="cyan" id="el0013">
+ <mspace id="base0013" height="3em" width="1em" mathbackground="black"/>
+ <mo id="under0013" mathcolor="blue">&#x2D8;</mo>
+ </munder>
+ <munderover mathbackground="cyan" id="el0014">
+ <mspace id="base0014" height="3em" width="1em" mathbackground="black"/>
+ <mo id="under0014" mathcolor="blue">&#xB0;</mo>
+ <mo id="over0014" mathcolor="red">&#xB0;</mo>
+ </munderover>
+ <munderover mathbackground="cyan" id="el0015" accent="true">
+ <mspace id="base0015" height="5em" width="1em" mathbackground="black"/>
+ <mo id="under0015" mathcolor="blue">&#x2D8;</mo>
+ <mo id="over0015" mathcolor="red">&#x2D8;</mo>
+ </munderover>
+ <munderover mathbackground="cyan" id="el0016" accent="true">
+ <mspace id="base0016" height="3em" width="1em" mathbackground="black"/>
+ <mo id="under0016" mathcolor="blue">&#x2D8;</mo>
+ <mo id="over0016" mathcolor="red">&#x2D8;</mo>
+ </munderover>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: accentbaseheight4000underbarverticalgap7000;">
+ <mspace id="ref002" height="1em" width="3em" mathbackground="green"/>
+ <munder mathbackground="cyan" id="el0021" accentunder="false">
+ <mspace id="base0021" height="3em" width="1em" mathbackground="black"/>
+ <mo id="under0021" mathcolor="blue">&#x2D8;</mo>
+ </munder>
+ <munder mathbackground="cyan" id="el0022">
+ <mspace id="base0022" height="5em" width="1em" mathbackground="black"/>
+ <mo id="under0022" mathcolor="blue" accent="true">&#x2D8;</mo>
+ </munder>
+ <munder mathbackground="cyan" id="el0023">
+ <mspace id="base0023" height="3em" width="1em" mathbackground="black"/>
+ <mo id="under0023" mathcolor="blue" accent="true">&#xB0;</mo>
+ </munder>
+ <munderover mathbackground="cyan" id="el0024">
+ <mspace id="base0024" height="3em" width="1em" mathbackground="black"/>
+ <mo id="under0024" mathcolor="blue" accent="false">&#x2D8;</mo>
+ <mo id="over0024" mathcolor="red" accent="false">&#x2D8;</mo>
+ </munderover>
+ <munderover mathbackground="cyan" id="el0025">
+ <mspace id="base0025" height="5em" width="1em" mathbackground="black"/>
+ <mo id="under0025" mathcolor="blue" accent="false">&#x2D8;</mo>
+ <mo id="over0025" mathcolor="red">&#x2D8;</mo>
+ </munderover>
+ <munderover mathbackground="cyan" id="el0026">
+ <mspace id="base0026" height="3em" width="1em" mathbackground="black"/>
+ <mo id="under0026" mathcolor="blue" accent="false">&#x2D8;</mo>
+ <mo id="over0026" mathcolor="red">&#x2D8;</mo>
+ </munderover>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: accentbaseheight4000overbarextraascender3000;">
+ <mspace id="ref003" height="1em" width="3em" mathbackground="green"/>
+ <mover mathbackground="cyan" id="el0031">
+ <mspace id="base0031" height="3em" width="1em" mathbackground="black"/>
+ <mo id="over0031" mathcolor="red">&#xB0;</mo>
+ </mover>
+ <mover mathbackground="cyan" id="el0032" accent="true">
+ <mspace id="base0032" height="5em" width="1em" mathbackground="black"/>
+ <mo id="over0032" mathcolor="red">&#xB0;</mo>
+ </mover>
+ <mover mathbackground="cyan" id="el0033">
+ <mspace id="base0033" height="3em" width="1em" mathbackground="black"/>
+ <mo id="over0033" mathcolor="red">&#x2D8;</mo>
+ </mover>
+ <munderover mathbackground="cyan" id="el0034">
+ <mspace id="base0034" height="3em" width="1em" mathbackground="black"/>
+ <mo id="under0034" mathcolor="blue">&#xB0;</mo>
+ <mo id="over0034" mathcolor="red" accent="false">&#x2D8;</mo>
+ </munderover>
+ <munderover mathbackground="cyan" id="el0035" accent="true">
+ <mspace id="base0035" height="5em" width="1em" mathbackground="black"/>
+ <mo id="under0035" mathcolor="blue">&#x2D8;</mo>
+ <mo id="over0035" mathcolor="red">&#x2D8;</mo>
+ </munderover>
+ <munderover mathbackground="cyan" id="el0036" accent="true">
+ <mspace id="base0036" height="3em" width="1em" mathbackground="black"/>
+ <mo id="under0036" mathcolor="blue">&#x2D8;</mo>
+ <mo id="over0036" mathcolor="red">&#x2D8;</mo>
+ </munderover>
+ </math>
+ </p>
+ <hr/>
+ <p>
+ <math style="font-family: accentbaseheight4000overbarverticalgap11000;">
+ <mspace id="ref004" height="1em" width="3em" mathbackground="green"/>
+ <mover mathbackground="cyan" id="el0041">
+ <mspace id="base0041" height="3em" width="1em" mathbackground="black"/>
+ <mo id="over0041" mathcolor="red">&#xB0;</mo>
+ </mover>
+ <mover mathbackground="cyan" id="el0042" accent="true">
+ <mspace id="base0042" height="5em" width="1em" mathbackground="black"/>
+ <mo id="over0042" mathcolor="red">&#xB0;</mo>
+ </mover>
+ <mover mathbackground="cyan" id="el0043">
+ <mspace id="base0043" height="3em" width="1em" mathbackground="black"/>
+ <mo id="over0043" mathcolor="red">&#x2D8;</mo>
+ </mover>
+ <munderover mathbackground="cyan" id="el0044">
+ <mspace id="base0044" height="3em" width="1em" mathbackground="black"/>
+ <mo id="under0044" mathcolor="blue">&#xB0;</mo>
+ <mo id="over0044" mathcolor="red" accent="false">&#x2D8;</mo>
+ </munderover>
+ <munderover mathbackground="cyan" id="el0045" accent="true">
+ <mspace id="base0045" height="5em" width="1em" mathbackground="black"/>
+ <mo id="under0045" mathcolor="blue">&#x2D8;</mo>
+ <mo id="over0045" mathcolor="red">&#x2D8;</mo>
+ </munderover>
+ <munderover mathbackground="cyan" id="el0046" accent="true">
+ <mspace id="base0046" height="3em" width="1em" mathbackground="black"/>
+ <mo id="under0046" mathcolor="blue">&#x2D8;</mo>
+ <mo id="over0046" mathcolor="red">&#x2D8;</mo>
+ </munderover>
+ </math>
+ </p>
+ <hr/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/presentation-markup/spaces/space-1.html b/tests/wpt/web-platform-tests/mathml/presentation-markup/spaces/space-1.html
new file mode 100644
index 00000000000..adb36377842
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/presentation-markup/spaces/space-1.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Space</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS2.SSS6">
+<meta name="assert" content="Verify mspace metrics for different values of height, depth and width">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ var epsilon = 1;
+ function getBox(aId) {
+ var box = document.getElementById(aId).getBoundingClientRect();
+ box.middle = (box.bottom + box.top) / 2;
+ box.center = (box.left + box.right) / 2;
+ return box;
+ }
+
+ setup({ explicit_done: true });
+ window.addEventListener("load", runTests);
+
+ function runTests() {
+ test(function() {
+ var empty = getBox("empty");
+ assert_equals(empty.width, 0, "zero width");
+ assert_approx_equals(getBox("baseline").bottom - empty.top, 0, epsilon, "zero depth");
+ assert_approx_equals(empty.bottom - getBox("baseline").bottom, 0, epsilon, "zero depth");
+ }, "Empty mspace");
+
+ test(function() {
+ for (var i = 0; i <= 2; i++) {
+ var space = getBox("width" + i);
+ assert_approx_equals(space.width, 25*(i+1), epsilon, "width " + i);
+ assert_approx_equals(getBox("baseline").bottom - space.top, 0, epsilon, "height" + i);
+ assert_approx_equals(space.bottom - getBox("baseline").bottom, 0, epsilon, "depth" + i);
+ }
+ }, "Different widths");
+
+ test(function() {
+ for (var i = 0; i <= 2; i++) {
+ var space = getBox("height" + i);
+ assert_equals(space.width, 0, "width" + i);
+ assert_approx_equals(getBox("baseline").bottom - space.top, 25*(i+1), epsilon, "height" + i);
+ assert_approx_equals(space.bottom - getBox("baseline").bottom, 0, epsilon, "depth" + i);
+ }
+ }, "Different heights");
+
+ test(function() {
+ for (var i = 0; i <= 2; i++) {
+ var space = getBox("depth" + i);
+ assert_equals(space.width, 0, "width" + i);
+ assert_approx_equals(getBox("baseline").bottom - space.top, 0, epsilon, "height" + i);
+ assert_approx_equals(space.bottom - getBox("baseline").bottom, 25*(i+1), epsilon, "depth" + i);
+ }
+ }, "Different depths");
+
+ test(function() {
+ for (var i = 0; i <= 2; i++) {
+ var space = getBox("mspace" + i);
+ assert_approx_equals(space.width, 25*(1+i%3), epsilon, "width" + i);
+ assert_approx_equals(getBox("baseline").bottom - space.top, 25*(1+(i+1)%3), epsilon, "height" + i);
+ assert_approx_equals(space.bottom - getBox("baseline").bottom, 25*(1+(i+2)%3), epsilon, "depth" + i);
+ }
+ }, "Various combinations of height, depth and width.");
+
+ done();
+ }
+</script>
+</head>
+<body>
+ <p>
+ <span id="baseline" style="display: inline-block; width: 30px; height: 5px; background: blue"></span>
+ <math>
+ <mspace id="empty"/>
+ <mspace id="width0" width="25px"/>
+ <mspace id="width1" width="50px"/>
+ <mspace id="width2" width="75px"/>
+ <mspace id="height0" height="25px"/>
+ <mspace id="height1" height="50px"/>
+ <mspace id="height2" height="75px"/>
+ <mspace id="depth0" depth="25px"/>
+ <mspace id="depth1" depth="50px"/>
+ <mspace id="depth2" depth="75px"/>
+ <mspace id="mspace0" width="25px" height="50px" depth="75px" mathbackground="green"/>
+ <mspace id="mspace1" width="50px" height="75px" depth="25px" mathbackground="blue"/>
+ <mspace id="mspace2" width="75px" height="25px" depth="50px" mathbackground="green"/>
+ </math>
+ </p>
+ <hr/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/presentation-markup/spaces/space-2-ref.html b/tests/wpt/web-platform-tests/mathml/presentation-markup/spaces/space-2-ref.html
new file mode 100644
index 00000000000..5a8b39e1898
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/presentation-markup/spaces/space-2-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>space (reference)</title>
+</head>
+<body>
+ <p>Test passes if you see a green square and no red.</p>
+ <div style="position: relative;">
+ <div style="position: absolute; top: 0px; left: 0px;
+ background: green; width: 200px; height: 200px;">
+ </div>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/presentation-markup/spaces/space-2.html b/tests/wpt/web-platform-tests/mathml/presentation-markup/spaces/space-2.html
new file mode 100644
index 00000000000..544cfb1f668
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/presentation-markup/spaces/space-2.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>space</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS2.SSS6">
+<link rel="match" href="space-2-ref.html"/>
+<meta name="assert" content="Verify mspace visual rendering for different values of height, depth and width">
+</head>
+<body>
+ <p>Test passes if you see a green square and no red.</p>
+ <div style="position: relative;">
+ <!-- Some green and red mspaces to draw a square -->
+ <div style="position: absolute; top: 0px; left: 0px;
+ width: 200px; height: 200px;">
+ <math style="position: absolute; top: 0px; left: 0px">
+ <mspace width="50px" height="100px" depth="100px" mathbackground="green"/>
+ <mspace width="50px" height="100px" depth="100px" mathbackground="green"/>
+ <mspace width="25px" depth="100px" mathbackground="green"/>
+ <mspace width="25px" depth="100px" mathbackground="green"/>
+ <mspace width="25px" height="100px" mathbackground="green"/>
+ <mspace width="25px" height="100px" mathbackground="green"/>
+ </math>
+ <math style="position: absolute; top: 0px; left: 0px">
+ <mspace width="100px" height="20px" depth="20px" mathbackground="red"/>
+ <mspace width="50px" height="100px" mathbackground="red"/>
+ <mspace width="50px" depth="100px" mathbackground="red"/>
+ </math>
+ </div>
+ <!-- These green divs should cover the red mspace elements -->
+ <div style="position: absolute; top: 0px; left: 0px;
+ width: 200px; height: 200px;">
+ <div style="position: absolute; top: 80px; left: 0px;
+ width: 100px; height: 40px; background: green"></div>
+ <div style="position: absolute; top: 0px; left: 100px;
+ width: 50px; height: 100px; background: green"></div>
+ <div style="position: absolute; top: 100px; left: 150px;
+ width: 50px; height: 100px; background: green"></div>
+ </div>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/presentation-markup/tables/table-axis-height.html b/tests/wpt/web-platform-tests/mathml/presentation-markup/tables/table-axis-height.html
new file mode 100644
index 00000000000..f68f13df77d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/presentation-markup/tables/table-axis-height.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>table axis height</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S3.html#SS5">
+<meta name="assert" content="Element mtable correctly uses the axis height parameter from the MATH table.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ math, mspace {
+ font-size: 10px;
+ }
+ @font-face {
+ font-family: axisheight5000-verticalarrow14000;
+ src: url("/fonts/math/axisheight5000-verticalarrow14000.woff");
+ }
+</style>
+<script>
+ var emToPx = 10 / 1000; // font-size: 10px, font.em = 1000
+ var epsilon = 1;
+
+ function getBox(aId) {
+ return document.getElementById(aId).getBoundingClientRect();
+ }
+
+ setup({ explicit_done: true });
+ window.addEventListener("load", function() {
+ document.fonts.ready.then(runTests);
+ });
+
+ function runTests() {
+ test(function() {
+ var v1 = 5000 * emToPx;
+ var tableMiddle = (getBox("table").bottom + getBox("table").top) / 2;
+ assert_approx_equals(getBox("baseline").bottom - tableMiddle,
+ v1, epsilon, "mtable: axis height");
+ }, "AxisHeight");
+
+ done();
+ }
+</script>
+</head>
+<body>
+ <p>
+ <math style="font-family: axisheight5000-verticalarrow14000">
+ <mspace id="baseline" mathbackground="green" width="50px" height="1px"/>
+ <mtable id="table" mathbackground="blue"><mtr><mtd><mspace width="100px" height="1px"/></mtd></mtr></mtable>
+ </math>
+ </p>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/color-1-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/color-1-ref.html
new file mode 100644
index 00000000000..0efca480eec
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/color-1-ref.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>color (reference)</title>
+</head>
+<body>
+ <p>Test passes if you see a green square.</p>
+ <div style="background: green; width: 200px; height: 200px; padding: 1px;">
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/color-1.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/color-1.html
new file mode 100644
index 00000000000..4ef821340d2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/color-1.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>color</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1">
+<link rel="match" href="color-1-ref.html"/>
+<meta name="assert" content="Verify that the color is used for text and graphical elements.">
+</head>
+<body>
+ <p>Test passes if you see a green square.</p>
+ <div style="background: green; color: red; width: 200px; height: 200px; padding: 1px;">
+ <math><mfrac style="color: green"><mn>1</mn><mn>2</mn></mfrac></math>
+ <math><msqrt style="color: green"><mn>3</mn></msqrt></math>
+ <math><mroot style="color: green"><mn>4</mn><mn>5</mn></mroot></math>
+ <math><menclose notation="left" style="color: green"><mn>6</mn></menclose></math>
+ <math><menclose notation="right" style="color: green"><mn>7</mn></menclose></math>
+ <math><menclose notation="top" style="color: green"><mn>8</mn></menclose></math>
+ <math><menclose notation="bottom" style="color: green"><mn>9</mn></menclose></math>
+ <math><menclose notation="box" style="color: green"><mn>10</mn></menclose></math>
+ <math><menclose notation="roundedbox" style="color: green"><mn>11</mn></menclose></math>
+ <math><menclose notation="actuarial" style="color: green"><mn>12</mn></menclose></math>
+ <math><menclose notation="madruwb" style="color: green"><mn>13</mn></menclose></math>
+ <math><menclose notation="horizontalstrike" style="color: green"><mn>14</mn></menclose></math>
+ <math><menclose notation="verticalstrike" style="color: green"><mn>15</mn></menclose></math>
+ <math><menclose notation="updiagonalstrike" style="color: green"><mn>16</mn></menclose></math>
+ <math><menclose notation="downdiagonalstrike" style="color: green"><mn>17</mn></menclose></math>
+ <math><menclose notation="longdiv" style="color: green"><mn>18</mn></menclose></math>
+ <math><menclose notation="circle" style="color: green"><mn>19</mn></menclose></math>
+ <math><mi style="color: green">20</mi></math>
+ <math><mn style="color: green">21</mn></math>
+ <math><mo style="color: green">22</mo></math>
+ <math><mtext style="color: green">23</mtext></math>
+ <math><ms style="color: green">24</ms></math>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/display-1-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/display-1-ref.html
new file mode 100644
index 00000000000..ce65aba18c9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/display-1-ref.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>display (reference)</title>
+</head>
+<body>
+ <p>Test passes if you see a green square.</p>
+ <div style="background: green; width: 200px; height: 200px;">
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/display-1.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/display-1.html
new file mode 100644
index 00000000000..551f6402d85
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/display-1.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>display</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1">
+<link rel="match" href="display-1-ref.html"/>
+<meta name="assert" content="Verify that the 'display: none' property works on MathML elements.">
+</head>
+<body>
+ <p>Test passes if you see a green square.</p>
+ <div style="background: green; color: red; width: 200px; height: 200px;">
+ <math style="display: none;"><mspace width="200px" height="200px" mathbackground="red"/></math>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-1.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-1.html
new file mode 100644
index 00000000000..a616e7f2336
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/displaystyle-1.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>displaystyle</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1">
+<meta name="assert" content="Verify that the correct inheritance of the displaystyle value by measuring the size of large operators.">
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/largeop-displayoperatorminheight5000.woff");
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ setup({ explicit_done: true });
+ var emToPx = 10 / 1000; // font-size: 10px, font.em = 1000
+ var epsilon = 5;
+ function verify_displaystyle(element, displaystyle, description) {
+ if (typeof element === "string")
+ element = document.getElementById(element);
+ var elementSize = element.getBoundingClientRect().height;
+ if (displaystyle)
+ assert_approx_equals(elementSize, 5000 * emToPx, epsilon, description);
+ else
+ assert_approx_equals(elementSize, 1000 * emToPx, epsilon, description);
+ }
+
+ window.addEventListener("load", function() {
+ document.fonts.ready.then(runTests);
+ });
+
+ function runTests() {
+ test(function() {
+ verify_displaystyle("math_default", false, "default");
+ verify_displaystyle("math_inline", false, "explicit display inline");
+ verify_displaystyle("math_block", true, "explicit display block");
+ verify_displaystyle("math_false", false, "explicit displaystyle false");
+ verify_displaystyle("math_true", true, "explicit displaystyle true");
+ }, "math element");
+ test(function() {
+ verify_displaystyle("mstyle_false", false, "explicit displaystyle false");
+ verify_displaystyle("mstyle_true", true, "explicit displaystyle true");
+ }, "mstyle element");
+ test(function() {
+ verify_displaystyle("mtable_default", false, "default");
+ verify_displaystyle("mtable_false", false, "explicit displaystyle false");
+ verify_displaystyle("mtable_true", true, "explicit displaystyle true");
+ }, "mtable element");
+ test(function() {
+ verify_displaystyle("mfrac_numerator", false, "numerator");
+ verify_displaystyle("mfrac_denominator", false, "denominator");
+ }, "mfrac element");
+ test(function() {
+ verify_displaystyle("mroot_base", true, "base");
+ verify_displaystyle("mroot_index", false, "index");
+ }, "mroot element");
+ test(function() {
+ verify_displaystyle("msub_base", true, "base");
+ verify_displaystyle("msub_subscript", false, "subscript");
+ }, "msub element");
+ test(function() {
+ verify_displaystyle("msup_base", true, "base");
+ verify_displaystyle("msup_supscript", false, "supscript");
+ }, "msup element");
+ test(function() {
+ verify_displaystyle("msubsup_base", true, "base");
+ verify_displaystyle("msubsup_subscript", false, "subscript");
+ verify_displaystyle("msubsup_supscript", false, "supscript");
+ }, "msubsup element");
+ test(function() {
+ verify_displaystyle("munder_base", true, "base");
+ verify_displaystyle("munder_underscript", false, "underscript");
+ }, "munder element");
+ test(function() {
+ verify_displaystyle("mover_base", true, "base");
+ verify_displaystyle("mover_overscript", false, "overscript");
+ }, "mover element");
+ test(function() {
+ verify_displaystyle("munderover_base", true, "base");
+ verify_displaystyle("munderover_underscript", false, "underscript");
+ verify_displaystyle("munderover_overscript", false, "overscript");
+ }, "munderover element");
+ done();
+ }
+</script>
+</head>
+<body>
+ <math><mo id="math_default">&#x2AFF;</mo></math>
+ <math display="inline"><mo id="math_inline">&#x2AFF;</mo></math>
+ <math display="block"><mo id="math_block">&#x2AFF;</mo></math>
+ <math displaystyle="false"><mo id="math_false">&#x2AFF;</mo></math>
+ <math displaystyle="true"><mo id="math_true">&#x2AFF;</mo></math>
+ <math><mstyle displaystyle="false"><mo id="mstyle_false">&#x2AFF;</mo></mstyle></math>
+ <math><mstyle displaystyle="true"><mo id="mstyle_true">&#x2AFF;</mo></mstyle></math>
+ <math displaystyle="true"><mtable><mtr><mtd><mo id="mtable_default">&#x2AFF;</mo></mtd></mtr></mtable></math>
+ <math><mtable displaystyle="true"><mtr><mtd><mo id="mtable_true">&#x2AFF;</mo></mtd></mtr></mtable></math>
+ <math displaystyle="true"><mtable displaystyle="false"><mtr><mtd><mo id="mtable_false">&#x2AFF;</mo></mtd></mtr></mtable></math>
+ <math displaystyle="true"><mfrac><mo id="mfrac_numerator">&#x2AFF;</mo><mo id="mfrac_denominator">&#x2AFF;</mo></mfrac></math>
+ <math displaystyle="true"><mroot><mo id="mroot_base">&#x2AFF;</mo><mo id="mroot_index">&#x2AFF;</mo></mroot></math>
+ <math displaystyle="true"><msub><mo id="msub_base">&#x2AFF;</mo><mo id="msub_subscript">&#x2AFF;</mo></msub></math>
+ <math displaystyle="true"><msup><mo id="msup_base">&#x2AFF;</mo><mo id="msup_supscript">&#x2AFF;</mo></msup></math>
+ <math displaystyle="true"><msubsup><mo id="msubsup_base">&#x2AFF;</mo><mo id="msubsup_subscript">&#x2AFF;</mo><mo id="msubsup_supscript">&#x2AFF;</mo></msubsup></math>
+ <math displaystyle="true"><mmultiscripts><mo id="mmultiscripts_base">&#x2AFF;</mo><mo id="mmultiscripts_subscript">&#x2AFF;</mo><mo id="mmultiscripts_supscript">&#x2AFF;</mo><mprescripts/><mo id="mmultiscripts_presubscript">&#x2AFF;</mo><mo id="mmultiscripts_presupscript">&#x2AFF;</mo></mmultiscripts></math>
+ <math displaystyle="true"><munder><mo id="munder_base">&#x2AFF;</mo><mo id="munder_underscript">&#x2AFF;</mo></munder></math>
+ <math displaystyle="true"><mover><mo id="mover_base">&#x2AFF;</mo><mo id="mover_overscript">&#x2AFF;</mo></mover></math>
+ <math displaystyle="true"><munderover><mo id="munderover_base">&#x2AFF;</mo><mo id="munderover_underscript">&#x2AFF;</mo><mo id="munderover_overscript">&#x2AFF;</mo></munderover></math>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-1-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-1-ref.html
new file mode 100644
index 00000000000..0500148d636
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-1-ref.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>MathML lengths (reference)</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1"/>
+<link rel="match" href="lengths-1-ref.html"/>
+<meta name="assert" content="Verify that the syntax for MathML lengths is supported.">
+</head>
+<body>
+ <p>Test passes if there is a green square and no red.</p>
+ <div>
+ <div id="red" style="position: absolute; width: 200px; height: 200px; background: green;">
+ </div>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-1.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-1.html
new file mode 100644
index 00000000000..e5864ccc2ac
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-1.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>MathML lengths</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1"/>
+<link rel="match" href="lengths-1-ref.html"/>
+<meta name="assert" content="Verify whether the different units are accepted for MathML lengths.">
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/xheight500.woff");
+ }
+ span, math {
+ font-family: TestFont;
+ font-size: 10px; /* 1em = 10px, 1ex is about 5px */
+ }
+ span {
+ position: absolute;
+ display: inline-block;
+ height: 10px;
+ }
+ #red > span {
+ background: red;
+ }
+ #green > span {
+ background: green;
+ }
+</style>
+</head>
+<body>
+ <p>Test passes if there is a green square and no red.</p>
+ <div>
+ <div id="red" style="position: absolute; width: 200px; height: 200px; background: green;">
+ <!-- px -->
+ <span style="top: 0px"><math><mspace width="200px"/></math></span>
+ <span style="top: 10px; width: 200px"></span>
+
+ <!-- cm -->
+ <span style="top: 20px"><math><mspace width="5.08cm"/></math></span>
+ <span style="top: 30px; width: 192px"></span>
+
+ <!-- em -->
+ <span style="top: 40px"><math><mspace width="20em"/></math></span>
+ <span style="top: 50px; width: 200px"></span>
+
+ <!-- ex -->
+ <span style="top: 60px"><math><mspace width="30ex"/></math></span>
+ <span style="top: 70px; width: 30ex"></span>
+
+ <!-- in -->
+ <span style="top: 80px"><math><mspace width="2in"/></math></span>
+ <span style="top: 90px; width: 192px"></span>
+
+ <!-- mm -->
+ <span style="top: 100px"><math><mspace width="50.8mm"/></math></span>
+ <span style="top: 110px; width: 192px"></span>
+
+ <!-- pc -->
+ <span style="top: 120px"><math><mspace width="12.5pc"/></math></span>
+ <span style="top: 130px; width: 200px"></span>
+
+ <!-- pt -->
+ <span style="top: 140px"><math><mspace width="150pt"/></math></span>
+ <span style="top: 150px; width: 200px"></span>
+
+ <!-- % -->
+ <span style="top: 160px"><math><mstyle mathsize="2000%"><mspace width="1em"/></mstyle></math></span>
+ <span style="top: 170px; width: 200px"></span>
+
+ <!-- unitless -->
+ <span style="top: 180px"><math><mstyle mathsize="20.0"><mspace width="1em"/></mstyle></math></span>
+ <span style="top: 190px; width: 200px"></span>
+ </div>
+
+ <div id="green" style="position: absolute; width: 200px; height: 200px;">
+ <!-- px -->
+ <span style="top: 10px"><math><mspace width="200px"/></math></span>
+ <span style="top: 0px; width: 200px"></span>
+
+ <!-- cm -->
+ <span style="top: 30px"><math><mspace width="5.08cm"/></math></span>
+ <span style="top: 20px; width: 192px"></span>
+
+ <!-- em -->
+ <span title="em" style="top: 50px"><math><mspace width="20em"/></math></span>
+ <span title="em" style="top: 40px; width: 200px"></span>
+
+ <!-- ex -->
+ <span title="ex" style="top: 70px"><math><mspace width="30ex"/></math></span>
+ <span title="ex" style="top: 60px; width: 30ex"></span>
+
+ <!-- in -->
+ <span style="top: 90px"><math><mspace width="2in"/></math></span>
+ <span style="top: 80px; width: 192px"></span>
+
+ <!-- mm -->
+ <span style="top: 110px"><math><mspace width="50.8mm"/></math></span>
+ <span style="top: 100px; width: 192px"></span>
+
+ <!-- pc -->
+ <span style="top: 130px"><math><mspace width="12.5pc"/></math></span>
+ <span style="top: 120px; width: 200px"></span>
+
+ <!-- pt -->
+ <span style="top: 150px"><math><mspace width="150pt"/></math></span>
+ <span style="top: 140px; width: 200px"></span>
+
+ <!-- % -->
+ <span style="top: 170px"><math><mstyle mathsize="2000%"><mspace width="1em"/></mstyle></math></span>
+ <span style="top: 160px; width: 200px"></span>
+
+ <!-- unitless -->
+ <span style="top: 190px"><math><mstyle mathsize="20.0"><mspace width="1em"/></mstyle></math></span>
+ <span style="top: 180px; width: 200px"></span>
+ </div>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-2-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-2-ref.html
new file mode 100644
index 00000000000..9fca6f49632
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-2-ref.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>MathML lengths (reference)</title>
+</head>
+<body>
+ <p>Test passes if there is a green square and no red.</p>
+ <div>
+ <div id="red" style="position: absolute; width: 200px; height: 200px; background: green;">
+ </div>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-2.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-2.html
new file mode 100644
index 00000000000..e88111aa537
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-2.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>MathML lengths</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1"/>
+<link rel="match" href="lengths-2-ref.html"/>
+<meta name="assert" content="Verify whether the different namedspaces are accepted for MathML lengths.">
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/xheight500.woff");
+ }
+ mpadded {
+ font-family: TestFont;
+ font-size: 200px; /* 1em = 200px */
+ }
+ div {
+ position: absolute;
+ }
+ #red mspace {
+ background: red;
+ }
+ #green mspace {
+ background: green;
+ }
+</style>
+</head>
+<body>
+ <p>Test passes if there is a green square and no red.</p>
+ <div>
+ <div id="red" style="position: absolute; width: 200px; height: 200px; background: green;">
+ <!-- veryverythinmathspace -->
+ <div style="left: 0px;"><math><mpadded height="100px" depth="100px" voffset="1veryverythinmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 10px;"><math><mpadded height="100px" depth="100px" voffset="0.05555555555555556em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- verythinmathspace -->
+ <div style="left: 20px;"><math><mpadded height="100px" depth="100px" voffset="1verythinmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 30px;"><math><mpadded height="100px" depth="100px" voffset="0.1111111111111111em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- thinmathspace -->
+ <div style="left: 40px;"><math><mpadded height="100px" depth="100px" voffset="1thinmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 50px;"><math><mpadded height="100px" depth="100px" voffset="0.1666666666666667em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- mediummathspace -->
+ <div style="left: 60px;"><math><mpadded height="100px" depth="100px" voffset="1mediummathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 70px;"><math><mpadded height="100px" depth="100px" voffset="0.2222222222222222em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- thickmathspace -->
+ <div style="left: 80px;"><math><mpadded height="100px" depth="100px" voffset="1thickmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 90px;"><math><mpadded height="100px" depth="100px" voffset="0.2777777777777778em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- verythickmathspace -->
+ <div style="left: 100px;"><math><mpadded height="100px" depth="100px" voffset="1verythickmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 110px;"><math><mpadded height="100px" depth="100px" voffset="0.3333333333333333em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- veryverythickmathspace -->
+ <div style="left: 120px;"><math><mpadded height="100px" depth="100px" voffset="1veryverythickmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 130px;"><math><mpadded height="100px" depth="100px" voffset="0.3888888888888889em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- negativeveryverythinmathspace -->
+ <div style="left: 0px;"><math><mpadded height="100px" depth="100px" voffset="1negativeveryverythinmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 10px;"><math><mpadded height="100px" depth="100px" voffset="-0.05555555555555556em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- negativeverythinmathspace -->
+ <div style="left: 20px;"><math><mpadded height="100px" depth="100px" voffset="1negativeverythinmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 30px;"><math><mpadded height="100px" depth="100px" voffset="-0.1111111111111111em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- negativethinmathspace -->
+ <div style="left: 40px;"><math><mpadded height="100px" depth="100px" voffset="1negativethinmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 50px;"><math><mpadded height="100px" depth="100px" voffset="-0.1666666666666667em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- negativemediummathspace -->
+ <div style="left: 60px;"><math><mpadded height="100px" depth="100px" voffset="1negativemediummathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 70px;"><math><mpadded height="100px" depth="100px" voffset="-0.2222222222222222em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- negativethickmathspace -->
+ <div style="left: 80px;"><math><mpadded height="100px" depth="100px" voffset="1negativethickmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 90px;"><math><mpadded height="100px" depth="100px" voffset="-0.2777777777777778em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- negativeverythickmathspace -->
+ <div style="left: 100px;"><math><mpadded height="100px" depth="100px" voffset="1negativeverythickmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 110px;"><math><mpadded height="100px" depth="100px" voffset="-0.3333333333333333em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- negativeveryverythickmathspace -->
+ <div style="left: 120px;"><math><mpadded height="100px" depth="100px" voffset="1negativeveryverythickmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 130px;"><math><mpadded height="100px" depth="100px" voffset="-0.3888888888888889em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ </div>
+ <div id="green" style="position: absolute; width: 200px; height: 200px;">
+ <!-- veryverythinmathspace -->
+ <div style="left: 10px;"><math><mpadded height="100px" depth="100px" voffset="1veryverythinmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 0px;"><math><mpadded height="100px" depth="100px" voffset="0.05555555555555556em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- verythinmathspace -->
+ <div style="left: 30px;"><math><mpadded height="100px" depth="100px" voffset="1verythinmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 20px;"><math><mpadded height="100px" depth="100px" voffset="0.1111111111111111em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- thinmathspace -->
+ <div style="left: 50px;"><math><mpadded height="100px" depth="100px" voffset="1thinmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 40px;"><math><mpadded height="100px" depth="100px" voffset="0.1666666666666667em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- mediummathspace -->
+ <div style="left: 70px;"><math><mpadded height="100px" depth="100px" voffset="1mediummathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 60px;"><math><mpadded height="100px" depth="100px" voffset="0.2222222222222222em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- thickmathspace -->
+ <div style="left: 90px;"><math><mpadded height="100px" depth="100px" voffset="1thickmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 80px;"><math><mpadded height="100px" depth="100px" voffset="0.2777777777777778em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- verythickmathspace -->
+ <div style="left: 110px;"><math><mpadded height="100px" depth="100px" voffset="1verythickmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 100px;"><math><mpadded height="100px" depth="100px" voffset="0.3333333333333333em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- veryverythickmathspace -->
+ <div style="left: 130px;"><math><mpadded height="100px" depth="100px" voffset="1veryverythickmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 120px;"><math><mpadded height="100px" depth="100px" voffset="0.3888888888888889em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- negativeveryverythinmathspace -->
+ <div style="left: 10px;"><math><mpadded height="100px" depth="100px" voffset="1negativeveryverythinmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 0px;"><math><mpadded height="100px" depth="100px" voffset="-0.05555555555555556em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- negativeverythinmathspace -->
+ <div style="left: 30px;"><math><mpadded height="100px" depth="100px" voffset="1negativeverythinmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 20px;"><math><mpadded height="100px" depth="100px" voffset="-0.1111111111111111em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- negativethinmathspace -->
+ <div style="left: 50px;"><math><mpadded height="100px" depth="100px" voffset="1negativethinmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 40px;"><math><mpadded height="100px" depth="100px" voffset="-0.1666666666666667em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- negativemediummathspace -->
+ <div style="left: 70px;"><math><mpadded height="100px" depth="100px" voffset="1negativemediummathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 60px;"><math><mpadded height="100px" depth="100px" voffset="-0.2222222222222222em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- negativethickmathspace -->
+ <div style="left: 90px;"><math><mpadded height="100px" depth="100px" voffset="1negativethickmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 80px;"><math><mpadded height="100px" depth="100px" voffset="-0.2777777777777778em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- negativeverythickmathspace -->
+ <div style="left: 110px;"><math><mpadded height="100px" depth="100px" voffset="1negativeverythickmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 100px;"><math><mpadded height="100px" depth="100px" voffset="-0.3333333333333333em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <!-- negativeveryverythickmathspace -->
+ <div style="left: 130px;"><math><mpadded height="100px" depth="100px" voffset="1negativeveryverythickmathspace"><mspace width="10px" height="10px"/></mpadded></math></div>
+ <div style="left: 120px;"><math><mpadded height="100px" depth="100px" voffset="-0.3888888888888889em"><mspace width="10px" height="10px"/></mpadded></math></div>
+ </div>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-3.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-3.html
new file mode 100644
index 00000000000..3dadb399a26
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/lengths-3.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>MathML lengths</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1"/>
+<meta name="assert" content="Verify various cases of the MathML length syntax.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/xheight500.woff");
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<script>
+ var epsilon = .5;
+
+ function getBox(aId) {
+ return document.getElementById(aId).getBoundingClientRect();
+ }
+
+ setup({ explicit_done: true });
+ window.addEventListener("load", function() {
+ document.fonts.ready.then(runTests);
+ });
+
+ function runTests() {
+ test(function() {
+ assert_equals(getBox("unitCm").width, 96, "cm");
+ assert_equals(getBox("unitEm").width, 120, "em");
+ assert_equals(getBox("unitEx").width, 500, "ex");
+ assert_equals(getBox("unitIn").width, 288, "in");
+ assert_equals(getBox("unitNamed").width, 700, "namedspace");
+ assert_equals(getBox("unitMm").width, 576, "mm");
+ assert_equals(getBox("unitPc").width, 96, "pc");
+ assert_equals(getBox("unitPercentage").width, 60, "%");
+ assert_equals(getBox("unitPt").width, 96, "pt");
+ assert_equals(getBox("unitPx").width, 123, "px");
+ assert_equals(getBox("unitNone").width, 150, "Unitless");
+ }, "Units");
+
+ test(function() {
+ assert_equals(getBox("spaceCm").width, 96, "cm");
+ assert_equals(getBox("spaceEm").width, 120, "em");
+ assert_equals(getBox("spaceEx").width, 500, "ex");
+ assert_equals(getBox("spaceIn").width, 288, "in");
+ assert_equals(getBox("spaceNamed").width, 700, "namedspace");
+ assert_equals(getBox("spaceMm").width, 576, "mm");
+ assert_equals(getBox("spacePc").width, 96, "pc");
+ assert_equals(getBox("spacePercentage").width, 60, "%");
+ assert_equals(getBox("spacePt").width, 96, "pt");
+ assert_equals(getBox("spacePx").width, 123, "px");
+ assert_equals(getBox("spaceNone").width, 150, "Unitless");
+ }, "Trimming of space");
+
+ test(function() {
+ assert_approx_equals(getBox("n0").width, 0, epsilon, "n0");
+ assert_approx_equals(getBox("n1").width, 90, epsilon, "n1");
+ assert_approx_equals(getBox("n2").width, 8, epsilon, "n2");
+ assert_approx_equals(getBox("n3").width, 70, epsilon, "n3");
+ assert_approx_equals(getBox("n4").width, 650, epsilon, "n4");
+ assert_approx_equals(getBox("n5").width, 4320, epsilon, "n5");
+ assert_approx_equals(getBox("n6").width, 1, epsilon, "n6");
+ assert_approx_equals(getBox("n7").width, 8, epsilon, "n7");
+ assert_approx_equals(getBox("n8").width, 65, epsilon, "n8");
+ assert_approx_equals(getBox("n9").width, 432, epsilon, "n9");
+ assert_approx_equals(getBox("n10").width, 123, epsilon, "n10");
+ }, "Non-negative numbers");
+
+ test(function() {
+ var topRef = getBox("ref").top;
+ assert_approx_equals(getBox("N0").top - topRef, -0, epsilon, "N0");
+ assert_approx_equals(topRef - getBox("N1").top, -90, epsilon, "N1");
+ assert_approx_equals(topRef - getBox("N2").top, -8, epsilon, "N2");
+ assert_approx_equals(topRef - getBox("N3").top, -70, epsilon, "N3");
+ assert_approx_equals(topRef - getBox("N4").top, -650, epsilon, "N4");
+ assert_approx_equals(topRef - getBox("N5").top, -4320, epsilon, "N5");
+ assert_approx_equals(topRef - getBox("N6").top, -1, epsilon, "N6");
+ assert_approx_equals(topRef - getBox("N7").top, -8, epsilon, "N7");
+ assert_approx_equals(topRef - getBox("N8").top, -65, epsilon, "N8");
+ assert_approx_equals(topRef - getBox("N9").top, -432, epsilon, "N9");
+ assert_approx_equals(topRef - getBox("N10").top, -123, epsilon, "N10");
+ }, "Non-positive numbers");
+
+ done();
+ }
+</script>
+</head>
+<body>
+ <p>
+ <math>
+ <mspace id="unitCm" width="2.54cm"/>
+ <mspace id="unitEm" width="12em"/>
+ <mspace id="unitEx" width="100ex"/>
+ <mspace id="unitIn" width="3in"/>
+ <mspace style="font-size: 1800px" id="unitNamed" width="veryverythickmathspace"/>
+ <mspace id="unitMm" width="152.4mm"/>
+ <mspace id="unitPc" width="6pc"/>
+ <mstyle mathsize="200%"><mspace id="unitPercentage" width="3em"/></mstyle>
+ <mspace id="unitPt" width="72pt"/>
+ <mspace id="unitPx" width="123px"/>
+ <mstyle mathsize="5"><mspace id="unitNone" width="3em"/></mstyle>
+ </math>
+ </p>
+ <p>
+ <math>
+ <mspace id="spaceCm" width="&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;2.54cm&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;"/>
+ <mspace id="spaceEm" width="&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;12em&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;"/>
+ <mspace id="spaceEx" width="&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;100ex&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;"/>
+ <mspace id="spaceIn" width="&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;3in&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;"/>
+ <mspace style="font-size: 1800px" id="spaceNamed" width="&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;veryverythickmathspace&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;"/>
+ <mspace id="spaceMm" width="&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;152.4mm&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;"/>
+ <mspace id="spacePc" width="&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;6pc&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;"/>
+ <mstyle mathsize="200%"><mspace id="spacePercentage" width="&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;3em&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;"/></mstyle>
+ <mspace id="spacePt" width="&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;72pt&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;"/>
+ <mspace id="spacePx" width="&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;123px&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;"/>
+ <mstyle mathsize="5"><mspace id="spaceNone" width="&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;3em&#x20;&#x9;&#xA;&#xD;&#x20;&#x9;&#xA;&#xD;"/></mstyle>
+ </math>
+ </p>
+ <p>
+ <math>
+ <mspace id="n0" width="0em"/>
+ <mspace id="n1" width="9em"/>
+ <mspace id="n2" width=".8em"/>
+ <mspace id="n3" width="7.em"/>
+ <mspace id="n4" width="65em"/>
+ <mspace id="n5" width="432em"/>
+ <mspace id="n6" width=".10em"/>
+ <mspace id="n7" width=".789em"/>
+ <mspace id="n8" width="6.5em"/>
+ <mspace id="n9" width="43.21em"/>
+ <mspace id="n10" width="012.345em"/>
+ </math>
+ </p>
+ <p>
+ <math>
+ <mspace id="ref"></mspace>
+ <mpadded voffset="-0em"><mspace id="N0"/></mpadded>
+ <mpadded voffset="-9em"><mspace id="N1"/></mpadded>
+ <mpadded voffset="-.8em"><mspace id="N2"/></mpadded>
+ <mpadded voffset="-7.em"><mspace id="N3"/></mpadded>
+ <mpadded voffset="-65em"><mspace id="N4"/></mpadded>
+ <mpadded voffset="-432em"><mspace id="N5"/></mpadded>
+ <mpadded voffset="-.10em"><mspace id="N6"/></mpadded>
+ <mpadded voffset="-.789em"><mspace id="N7"/></mpadded>
+ <mpadded voffset="-6.5em"><mspace id="N8"/></mpadded>
+ <mpadded voffset="-43.21em"><mspace id="N9"/></mpadded>
+ <mpadded voffset="-012.345em"><mspace id="N10"/></mpadded>
+ </math>
+ </p>
+ <hr/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-fraktur-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-fraktur-ref.html
new file mode 100644
index 00000000000..0007e012deb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-fraktur-ref.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant bold-fraktur (reference)</title>
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-bold-fraktur.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi>&#x1D56C;</mi></math>=<span>1D56C</span></span>
+ <span><math><mi>&#x1D56D;</mi></math>=<span>1D56D</span></span>
+ <span><math><mi>&#x1D56E;</mi></math>=<span>1D56E</span></span>
+ <span><math><mi>&#x1D56F;</mi></math>=<span>1D56F</span></span>
+ <span><math><mi>&#x1D570;</mi></math>=<span>1D570</span></span>
+ <span><math><mi>&#x1D571;</mi></math>=<span>1D571</span></span>
+ <span><math><mi>&#x1D572;</mi></math>=<span>1D572</span></span>
+ <span><math><mi>&#x1D573;</mi></math>=<span>1D573</span></span>
+ <span><math><mi>&#x1D574;</mi></math>=<span>1D574</span></span>
+ <span><math><mi>&#x1D575;</mi></math>=<span>1D575</span></span><br/>
+ <span><math><mi>&#x1D576;</mi></math>=<span>1D576</span></span>
+ <span><math><mi>&#x1D577;</mi></math>=<span>1D577</span></span>
+ <span><math><mi>&#x1D578;</mi></math>=<span>1D578</span></span>
+ <span><math><mi>&#x1D579;</mi></math>=<span>1D579</span></span>
+ <span><math><mi>&#x1D57A;</mi></math>=<span>1D57A</span></span>
+ <span><math><mi>&#x1D57B;</mi></math>=<span>1D57B</span></span>
+ <span><math><mi>&#x1D57C;</mi></math>=<span>1D57C</span></span>
+ <span><math><mi>&#x1D57D;</mi></math>=<span>1D57D</span></span>
+ <span><math><mi>&#x1D57E;</mi></math>=<span>1D57E</span></span>
+ <span><math><mi>&#x1D57F;</mi></math>=<span>1D57F</span></span><br/>
+ <span><math><mi>&#x1D580;</mi></math>=<span>1D580</span></span>
+ <span><math><mi>&#x1D581;</mi></math>=<span>1D581</span></span>
+ <span><math><mi>&#x1D582;</mi></math>=<span>1D582</span></span>
+ <span><math><mi>&#x1D583;</mi></math>=<span>1D583</span></span>
+ <span><math><mi>&#x1D584;</mi></math>=<span>1D584</span></span>
+ <span><math><mi>&#x1D585;</mi></math>=<span>1D585</span></span>
+ <span><math><mi>&#x1D586;</mi></math>=<span>1D586</span></span>
+ <span><math><mi>&#x1D587;</mi></math>=<span>1D587</span></span>
+ <span><math><mi>&#x1D588;</mi></math>=<span>1D588</span></span>
+ <span><math><mi>&#x1D589;</mi></math>=<span>1D589</span></span><br/>
+ <span><math><mi>&#x1D58A;</mi></math>=<span>1D58A</span></span>
+ <span><math><mi>&#x1D58B;</mi></math>=<span>1D58B</span></span>
+ <span><math><mi>&#x1D58C;</mi></math>=<span>1D58C</span></span>
+ <span><math><mi>&#x1D58D;</mi></math>=<span>1D58D</span></span>
+ <span><math><mi>&#x1D58E;</mi></math>=<span>1D58E</span></span>
+ <span><math><mi>&#x1D58F;</mi></math>=<span>1D58F</span></span>
+ <span><math><mi>&#x1D590;</mi></math>=<span>1D590</span></span>
+ <span><math><mi>&#x1D591;</mi></math>=<span>1D591</span></span>
+ <span><math><mi>&#x1D592;</mi></math>=<span>1D592</span></span>
+ <span><math><mi>&#x1D593;</mi></math>=<span>1D593</span></span><br/>
+ <span><math><mi>&#x1D594;</mi></math>=<span>1D594</span></span>
+ <span><math><mi>&#x1D595;</mi></math>=<span>1D595</span></span>
+ <span><math><mi>&#x1D596;</mi></math>=<span>1D596</span></span>
+ <span><math><mi>&#x1D597;</mi></math>=<span>1D597</span></span>
+ <span><math><mi>&#x1D598;</mi></math>=<span>1D598</span></span>
+ <span><math><mi>&#x1D599;</mi></math>=<span>1D599</span></span>
+ <span><math><mi>&#x1D59A;</mi></math>=<span>1D59A</span></span>
+ <span><math><mi>&#x1D59B;</mi></math>=<span>1D59B</span></span>
+ <span><math><mi>&#x1D59C;</mi></math>=<span>1D59C</span></span>
+ <span><math><mi>&#x1D59D;</mi></math>=<span>1D59D</span></span><br/>
+ <span><math><mi>&#x1D59E;</mi></math>=<span>1D59E</span></span>
+ <span><math><mi>&#x1D59F;</mi></math>=<span>1D59F</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-fraktur.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-fraktur.html
new file mode 100644
index 00000000000..5182df883d6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-fraktur.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant bold-fraktur</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1.tab2"/>
+<link rel="match" href="mathvariant-bold-fraktur-ref.html"/>
+<meta name="assert" content="Verify that a single-char <mi> with a bold-fraktur mathvariant is equivalent to an <mi> with the transformed unicode character.">
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-bold-fraktur.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi mathvariant="bold-fraktur">&#x41;</mi></math>=<span>1D56C</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x42;</mi></math>=<span>1D56D</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x43;</mi></math>=<span>1D56E</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x44;</mi></math>=<span>1D56F</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x45;</mi></math>=<span>1D570</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x46;</mi></math>=<span>1D571</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x47;</mi></math>=<span>1D572</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x48;</mi></math>=<span>1D573</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x49;</mi></math>=<span>1D574</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x4A;</mi></math>=<span>1D575</span></span><br/>
+ <span><math><mi mathvariant="bold-fraktur">&#x4B;</mi></math>=<span>1D576</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x4C;</mi></math>=<span>1D577</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x4D;</mi></math>=<span>1D578</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x4E;</mi></math>=<span>1D579</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x4F;</mi></math>=<span>1D57A</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x50;</mi></math>=<span>1D57B</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x51;</mi></math>=<span>1D57C</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x52;</mi></math>=<span>1D57D</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x53;</mi></math>=<span>1D57E</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x54;</mi></math>=<span>1D57F</span></span><br/>
+ <span><math><mi mathvariant="bold-fraktur">&#x55;</mi></math>=<span>1D580</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x56;</mi></math>=<span>1D581</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x57;</mi></math>=<span>1D582</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x58;</mi></math>=<span>1D583</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x59;</mi></math>=<span>1D584</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x5A;</mi></math>=<span>1D585</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x61;</mi></math>=<span>1D586</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x62;</mi></math>=<span>1D587</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x63;</mi></math>=<span>1D588</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x64;</mi></math>=<span>1D589</span></span><br/>
+ <span><math><mi mathvariant="bold-fraktur">&#x65;</mi></math>=<span>1D58A</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x66;</mi></math>=<span>1D58B</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x67;</mi></math>=<span>1D58C</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x68;</mi></math>=<span>1D58D</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x69;</mi></math>=<span>1D58E</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x6A;</mi></math>=<span>1D58F</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x6B;</mi></math>=<span>1D590</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x6C;</mi></math>=<span>1D591</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x6D;</mi></math>=<span>1D592</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x6E;</mi></math>=<span>1D593</span></span><br/>
+ <span><math><mi mathvariant="bold-fraktur">&#x6F;</mi></math>=<span>1D594</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x70;</mi></math>=<span>1D595</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x71;</mi></math>=<span>1D596</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x72;</mi></math>=<span>1D597</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x73;</mi></math>=<span>1D598</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x74;</mi></math>=<span>1D599</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x75;</mi></math>=<span>1D59A</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x76;</mi></math>=<span>1D59B</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x77;</mi></math>=<span>1D59C</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x78;</mi></math>=<span>1D59D</span></span><br/>
+ <span><math><mi mathvariant="bold-fraktur">&#x79;</mi></math>=<span>1D59E</span></span>
+ <span><math><mi mathvariant="bold-fraktur">&#x7A;</mi></math>=<span>1D59F</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-italic-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-italic-ref.html
new file mode 100644
index 00000000000..0d3758d9dc9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-italic-ref.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant bold-italic (reference)</title>
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-bold-italic.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi>&#x1D74F;</mi></math>=<span>1D74F</span></span>
+ <span><math><mi>&#x1D735;</mi></math>=<span>1D735</span></span>
+ <span><math><mi>&#x1D468;</mi></math>=<span>1D468</span></span>
+ <span><math><mi>&#x1D469;</mi></math>=<span>1D469</span></span>
+ <span><math><mi>&#x1D46A;</mi></math>=<span>1D46A</span></span>
+ <span><math><mi>&#x1D46B;</mi></math>=<span>1D46B</span></span>
+ <span><math><mi>&#x1D46C;</mi></math>=<span>1D46C</span></span>
+ <span><math><mi>&#x1D46D;</mi></math>=<span>1D46D</span></span>
+ <span><math><mi>&#x1D46E;</mi></math>=<span>1D46E</span></span>
+ <span><math><mi>&#x1D46F;</mi></math>=<span>1D46F</span></span><br/>
+ <span><math><mi>&#x1D470;</mi></math>=<span>1D470</span></span>
+ <span><math><mi>&#x1D471;</mi></math>=<span>1D471</span></span>
+ <span><math><mi>&#x1D472;</mi></math>=<span>1D472</span></span>
+ <span><math><mi>&#x1D473;</mi></math>=<span>1D473</span></span>
+ <span><math><mi>&#x1D474;</mi></math>=<span>1D474</span></span>
+ <span><math><mi>&#x1D475;</mi></math>=<span>1D475</span></span>
+ <span><math><mi>&#x1D476;</mi></math>=<span>1D476</span></span>
+ <span><math><mi>&#x1D477;</mi></math>=<span>1D477</span></span>
+ <span><math><mi>&#x1D478;</mi></math>=<span>1D478</span></span>
+ <span><math><mi>&#x1D479;</mi></math>=<span>1D479</span></span><br/>
+ <span><math><mi>&#x1D47A;</mi></math>=<span>1D47A</span></span>
+ <span><math><mi>&#x1D47B;</mi></math>=<span>1D47B</span></span>
+ <span><math><mi>&#x1D47C;</mi></math>=<span>1D47C</span></span>
+ <span><math><mi>&#x1D47D;</mi></math>=<span>1D47D</span></span>
+ <span><math><mi>&#x1D47E;</mi></math>=<span>1D47E</span></span>
+ <span><math><mi>&#x1D47F;</mi></math>=<span>1D47F</span></span>
+ <span><math><mi>&#x1D480;</mi></math>=<span>1D480</span></span>
+ <span><math><mi>&#x1D481;</mi></math>=<span>1D481</span></span>
+ <span><math><mi>&#x1D482;</mi></math>=<span>1D482</span></span>
+ <span><math><mi>&#x1D483;</mi></math>=<span>1D483</span></span><br/>
+ <span><math><mi>&#x1D484;</mi></math>=<span>1D484</span></span>
+ <span><math><mi>&#x1D485;</mi></math>=<span>1D485</span></span>
+ <span><math><mi>&#x1D486;</mi></math>=<span>1D486</span></span>
+ <span><math><mi>&#x1D487;</mi></math>=<span>1D487</span></span>
+ <span><math><mi>&#x1D488;</mi></math>=<span>1D488</span></span>
+ <span><math><mi>&#x1D489;</mi></math>=<span>1D489</span></span>
+ <span><math><mi>&#x1D48A;</mi></math>=<span>1D48A</span></span>
+ <span><math><mi>&#x1D48B;</mi></math>=<span>1D48B</span></span>
+ <span><math><mi>&#x1D48C;</mi></math>=<span>1D48C</span></span>
+ <span><math><mi>&#x1D48D;</mi></math>=<span>1D48D</span></span><br/>
+ <span><math><mi>&#x1D48E;</mi></math>=<span>1D48E</span></span>
+ <span><math><mi>&#x1D48F;</mi></math>=<span>1D48F</span></span>
+ <span><math><mi>&#x1D490;</mi></math>=<span>1D490</span></span>
+ <span><math><mi>&#x1D491;</mi></math>=<span>1D491</span></span>
+ <span><math><mi>&#x1D492;</mi></math>=<span>1D492</span></span>
+ <span><math><mi>&#x1D493;</mi></math>=<span>1D493</span></span>
+ <span><math><mi>&#x1D494;</mi></math>=<span>1D494</span></span>
+ <span><math><mi>&#x1D495;</mi></math>=<span>1D495</span></span>
+ <span><math><mi>&#x1D496;</mi></math>=<span>1D496</span></span>
+ <span><math><mi>&#x1D497;</mi></math>=<span>1D497</span></span><br/>
+ <span><math><mi>&#x1D498;</mi></math>=<span>1D498</span></span>
+ <span><math><mi>&#x1D499;</mi></math>=<span>1D499</span></span>
+ <span><math><mi>&#x1D49A;</mi></math>=<span>1D49A</span></span>
+ <span><math><mi>&#x1D49B;</mi></math>=<span>1D49B</span></span>
+ <span><math><mi>&#x1D71C;</mi></math>=<span>1D71C</span></span>
+ <span><math><mi>&#x1D71D;</mi></math>=<span>1D71D</span></span>
+ <span><math><mi>&#x1D71E;</mi></math>=<span>1D71E</span></span>
+ <span><math><mi>&#x1D71F;</mi></math>=<span>1D71F</span></span>
+ <span><math><mi>&#x1D720;</mi></math>=<span>1D720</span></span>
+ <span><math><mi>&#x1D721;</mi></math>=<span>1D721</span></span><br/>
+ <span><math><mi>&#x1D722;</mi></math>=<span>1D722</span></span>
+ <span><math><mi>&#x1D723;</mi></math>=<span>1D723</span></span>
+ <span><math><mi>&#x1D724;</mi></math>=<span>1D724</span></span>
+ <span><math><mi>&#x1D725;</mi></math>=<span>1D725</span></span>
+ <span><math><mi>&#x1D726;</mi></math>=<span>1D726</span></span>
+ <span><math><mi>&#x1D727;</mi></math>=<span>1D727</span></span>
+ <span><math><mi>&#x1D728;</mi></math>=<span>1D728</span></span>
+ <span><math><mi>&#x1D729;</mi></math>=<span>1D729</span></span>
+ <span><math><mi>&#x1D72A;</mi></math>=<span>1D72A</span></span>
+ <span><math><mi>&#x1D72B;</mi></math>=<span>1D72B</span></span><br/>
+ <span><math><mi>&#x1D72C;</mi></math>=<span>1D72C</span></span>
+ <span><math><mi>&#x1D72E;</mi></math>=<span>1D72E</span></span>
+ <span><math><mi>&#x1D72F;</mi></math>=<span>1D72F</span></span>
+ <span><math><mi>&#x1D730;</mi></math>=<span>1D730</span></span>
+ <span><math><mi>&#x1D731;</mi></math>=<span>1D731</span></span>
+ <span><math><mi>&#x1D732;</mi></math>=<span>1D732</span></span>
+ <span><math><mi>&#x1D733;</mi></math>=<span>1D733</span></span>
+ <span><math><mi>&#x1D734;</mi></math>=<span>1D734</span></span>
+ <span><math><mi>&#x1D736;</mi></math>=<span>1D736</span></span>
+ <span><math><mi>&#x1D737;</mi></math>=<span>1D737</span></span><br/>
+ <span><math><mi>&#x1D738;</mi></math>=<span>1D738</span></span>
+ <span><math><mi>&#x1D739;</mi></math>=<span>1D739</span></span>
+ <span><math><mi>&#x1D73A;</mi></math>=<span>1D73A</span></span>
+ <span><math><mi>&#x1D73B;</mi></math>=<span>1D73B</span></span>
+ <span><math><mi>&#x1D73C;</mi></math>=<span>1D73C</span></span>
+ <span><math><mi>&#x1D73D;</mi></math>=<span>1D73D</span></span>
+ <span><math><mi>&#x1D73E;</mi></math>=<span>1D73E</span></span>
+ <span><math><mi>&#x1D73F;</mi></math>=<span>1D73F</span></span>
+ <span><math><mi>&#x1D740;</mi></math>=<span>1D740</span></span>
+ <span><math><mi>&#x1D741;</mi></math>=<span>1D741</span></span><br/>
+ <span><math><mi>&#x1D742;</mi></math>=<span>1D742</span></span>
+ <span><math><mi>&#x1D743;</mi></math>=<span>1D743</span></span>
+ <span><math><mi>&#x1D744;</mi></math>=<span>1D744</span></span>
+ <span><math><mi>&#x1D745;</mi></math>=<span>1D745</span></span>
+ <span><math><mi>&#x1D746;</mi></math>=<span>1D746</span></span>
+ <span><math><mi>&#x1D747;</mi></math>=<span>1D747</span></span>
+ <span><math><mi>&#x1D748;</mi></math>=<span>1D748</span></span>
+ <span><math><mi>&#x1D749;</mi></math>=<span>1D749</span></span>
+ <span><math><mi>&#x1D74A;</mi></math>=<span>1D74A</span></span>
+ <span><math><mi>&#x1D74B;</mi></math>=<span>1D74B</span></span><br/>
+ <span><math><mi>&#x1D74C;</mi></math>=<span>1D74C</span></span>
+ <span><math><mi>&#x1D74D;</mi></math>=<span>1D74D</span></span>
+ <span><math><mi>&#x1D74E;</mi></math>=<span>1D74E</span></span>
+ <span><math><mi>&#x1D751;</mi></math>=<span>1D751</span></span>
+ <span><math><mi>&#x1D753;</mi></math>=<span>1D753</span></span>
+ <span><math><mi>&#x1D755;</mi></math>=<span>1D755</span></span>
+ <span><math><mi>&#x1D752;</mi></math>=<span>1D752</span></span>
+ <span><math><mi>&#x1D754;</mi></math>=<span>1D754</span></span>
+ <span><math><mi>&#x1D72D;</mi></math>=<span>1D72D</span></span>
+ <span><math><mi>&#x1D750;</mi></math>=<span>1D750</span></span><br/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-italic.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-italic.html
new file mode 100644
index 00000000000..b115fec47a6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-italic.html
@@ -0,0 +1,140 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant bold-italic</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1.tab2"/>
+<link rel="match" href="mathvariant-bold-italic-ref.html"/>
+<meta name="assert" content="Verify that a single-char <mi> with a bold-italic mathvariant is equivalent to an <mi> with the transformed unicode character.">
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-bold-italic.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi mathvariant="bold-italic">&#x2202;</mi></math>=<span>1D74F</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x2207;</mi></math>=<span>1D735</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x41;</mi></math>=<span>1D468</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x42;</mi></math>=<span>1D469</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x43;</mi></math>=<span>1D46A</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x44;</mi></math>=<span>1D46B</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x45;</mi></math>=<span>1D46C</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x46;</mi></math>=<span>1D46D</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x47;</mi></math>=<span>1D46E</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x48;</mi></math>=<span>1D46F</span></span><br/>
+ <span><math><mi mathvariant="bold-italic">&#x49;</mi></math>=<span>1D470</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x4A;</mi></math>=<span>1D471</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x4B;</mi></math>=<span>1D472</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x4C;</mi></math>=<span>1D473</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x4D;</mi></math>=<span>1D474</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x4E;</mi></math>=<span>1D475</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x4F;</mi></math>=<span>1D476</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x50;</mi></math>=<span>1D477</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x51;</mi></math>=<span>1D478</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x52;</mi></math>=<span>1D479</span></span><br/>
+ <span><math><mi mathvariant="bold-italic">&#x53;</mi></math>=<span>1D47A</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x54;</mi></math>=<span>1D47B</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x55;</mi></math>=<span>1D47C</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x56;</mi></math>=<span>1D47D</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x57;</mi></math>=<span>1D47E</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x58;</mi></math>=<span>1D47F</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x59;</mi></math>=<span>1D480</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x5A;</mi></math>=<span>1D481</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x61;</mi></math>=<span>1D482</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x62;</mi></math>=<span>1D483</span></span><br/>
+ <span><math><mi mathvariant="bold-italic">&#x63;</mi></math>=<span>1D484</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x64;</mi></math>=<span>1D485</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x65;</mi></math>=<span>1D486</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x66;</mi></math>=<span>1D487</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x67;</mi></math>=<span>1D488</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x68;</mi></math>=<span>1D489</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x69;</mi></math>=<span>1D48A</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x6A;</mi></math>=<span>1D48B</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x6B;</mi></math>=<span>1D48C</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x6C;</mi></math>=<span>1D48D</span></span><br/>
+ <span><math><mi mathvariant="bold-italic">&#x6D;</mi></math>=<span>1D48E</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x6E;</mi></math>=<span>1D48F</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x6F;</mi></math>=<span>1D490</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x70;</mi></math>=<span>1D491</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x71;</mi></math>=<span>1D492</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x72;</mi></math>=<span>1D493</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x73;</mi></math>=<span>1D494</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x74;</mi></math>=<span>1D495</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x75;</mi></math>=<span>1D496</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x76;</mi></math>=<span>1D497</span></span><br/>
+ <span><math><mi mathvariant="bold-italic">&#x77;</mi></math>=<span>1D498</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x78;</mi></math>=<span>1D499</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x79;</mi></math>=<span>1D49A</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x7A;</mi></math>=<span>1D49B</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x391;</mi></math>=<span>1D71C</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x392;</mi></math>=<span>1D71D</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x393;</mi></math>=<span>1D71E</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x394;</mi></math>=<span>1D71F</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x395;</mi></math>=<span>1D720</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x396;</mi></math>=<span>1D721</span></span><br/>
+ <span><math><mi mathvariant="bold-italic">&#x397;</mi></math>=<span>1D722</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x398;</mi></math>=<span>1D723</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x399;</mi></math>=<span>1D724</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x39A;</mi></math>=<span>1D725</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x39B;</mi></math>=<span>1D726</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x39C;</mi></math>=<span>1D727</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x39D;</mi></math>=<span>1D728</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x39E;</mi></math>=<span>1D729</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x39F;</mi></math>=<span>1D72A</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3A0;</mi></math>=<span>1D72B</span></span><br/>
+ <span><math><mi mathvariant="bold-italic">&#x3A1;</mi></math>=<span>1D72C</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3A3;</mi></math>=<span>1D72E</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3A4;</mi></math>=<span>1D72F</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3A5;</mi></math>=<span>1D730</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3A6;</mi></math>=<span>1D731</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3A7;</mi></math>=<span>1D732</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3A8;</mi></math>=<span>1D733</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3A9;</mi></math>=<span>1D734</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3B1;</mi></math>=<span>1D736</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3B2;</mi></math>=<span>1D737</span></span><br/>
+ <span><math><mi mathvariant="bold-italic">&#x3B3;</mi></math>=<span>1D738</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3B4;</mi></math>=<span>1D739</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3B5;</mi></math>=<span>1D73A</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3B6;</mi></math>=<span>1D73B</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3B7;</mi></math>=<span>1D73C</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3B8;</mi></math>=<span>1D73D</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3B9;</mi></math>=<span>1D73E</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3BA;</mi></math>=<span>1D73F</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3BB;</mi></math>=<span>1D740</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3BC;</mi></math>=<span>1D741</span></span><br/>
+ <span><math><mi mathvariant="bold-italic">&#x3BD;</mi></math>=<span>1D742</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3BE;</mi></math>=<span>1D743</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3BF;</mi></math>=<span>1D744</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3C0;</mi></math>=<span>1D745</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3C1;</mi></math>=<span>1D746</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3C2;</mi></math>=<span>1D747</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3C3;</mi></math>=<span>1D748</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3C4;</mi></math>=<span>1D749</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3C5;</mi></math>=<span>1D74A</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3C6;</mi></math>=<span>1D74B</span></span><br/>
+ <span><math><mi mathvariant="bold-italic">&#x3C7;</mi></math>=<span>1D74C</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3C8;</mi></math>=<span>1D74D</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3C9;</mi></math>=<span>1D74E</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3D1;</mi></math>=<span>1D751</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3D5;</mi></math>=<span>1D753</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3D6;</mi></math>=<span>1D755</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3F0;</mi></math>=<span>1D752</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3F1;</mi></math>=<span>1D754</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3F4;</mi></math>=<span>1D72D</span></span>
+ <span><math><mi mathvariant="bold-italic">&#x3F5;</mi></math>=<span>1D750</span></span><br/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-ref.html
new file mode 100644
index 00000000000..f9bbef64a04
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-ref.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant bold (reference)</title>
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-bold.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi>&#x1D6DB;</mi></math>=<span>1D6DB</span></span>
+ <span><math><mi>&#x1D6C1;</mi></math>=<span>1D6C1</span></span>
+ <span><math><mi>&#x1D7CE;</mi></math>=<span>1D7CE</span></span>
+ <span><math><mi>&#x1D7CF;</mi></math>=<span>1D7CF</span></span>
+ <span><math><mi>&#x1D7D0;</mi></math>=<span>1D7D0</span></span>
+ <span><math><mi>&#x1D7D1;</mi></math>=<span>1D7D1</span></span>
+ <span><math><mi>&#x1D7D2;</mi></math>=<span>1D7D2</span></span>
+ <span><math><mi>&#x1D7D3;</mi></math>=<span>1D7D3</span></span>
+ <span><math><mi>&#x1D7D4;</mi></math>=<span>1D7D4</span></span>
+ <span><math><mi>&#x1D7D5;</mi></math>=<span>1D7D5</span></span><br/>
+ <span><math><mi>&#x1D7D6;</mi></math>=<span>1D7D6</span></span>
+ <span><math><mi>&#x1D7D7;</mi></math>=<span>1D7D7</span></span>
+ <span><math><mi>&#x1D400;</mi></math>=<span>1D400</span></span>
+ <span><math><mi>&#x1D401;</mi></math>=<span>1D401</span></span>
+ <span><math><mi>&#x1D402;</mi></math>=<span>1D402</span></span>
+ <span><math><mi>&#x1D403;</mi></math>=<span>1D403</span></span>
+ <span><math><mi>&#x1D404;</mi></math>=<span>1D404</span></span>
+ <span><math><mi>&#x1D405;</mi></math>=<span>1D405</span></span>
+ <span><math><mi>&#x1D406;</mi></math>=<span>1D406</span></span>
+ <span><math><mi>&#x1D407;</mi></math>=<span>1D407</span></span><br/>
+ <span><math><mi>&#x1D408;</mi></math>=<span>1D408</span></span>
+ <span><math><mi>&#x1D409;</mi></math>=<span>1D409</span></span>
+ <span><math><mi>&#x1D40A;</mi></math>=<span>1D40A</span></span>
+ <span><math><mi>&#x1D40B;</mi></math>=<span>1D40B</span></span>
+ <span><math><mi>&#x1D40C;</mi></math>=<span>1D40C</span></span>
+ <span><math><mi>&#x1D40D;</mi></math>=<span>1D40D</span></span>
+ <span><math><mi>&#x1D40E;</mi></math>=<span>1D40E</span></span>
+ <span><math><mi>&#x1D40F;</mi></math>=<span>1D40F</span></span>
+ <span><math><mi>&#x1D410;</mi></math>=<span>1D410</span></span>
+ <span><math><mi>&#x1D411;</mi></math>=<span>1D411</span></span><br/>
+ <span><math><mi>&#x1D412;</mi></math>=<span>1D412</span></span>
+ <span><math><mi>&#x1D413;</mi></math>=<span>1D413</span></span>
+ <span><math><mi>&#x1D414;</mi></math>=<span>1D414</span></span>
+ <span><math><mi>&#x1D415;</mi></math>=<span>1D415</span></span>
+ <span><math><mi>&#x1D416;</mi></math>=<span>1D416</span></span>
+ <span><math><mi>&#x1D417;</mi></math>=<span>1D417</span></span>
+ <span><math><mi>&#x1D418;</mi></math>=<span>1D418</span></span>
+ <span><math><mi>&#x1D419;</mi></math>=<span>1D419</span></span>
+ <span><math><mi>&#x1D41A;</mi></math>=<span>1D41A</span></span>
+ <span><math><mi>&#x1D41B;</mi></math>=<span>1D41B</span></span><br/>
+ <span><math><mi>&#x1D41C;</mi></math>=<span>1D41C</span></span>
+ <span><math><mi>&#x1D41D;</mi></math>=<span>1D41D</span></span>
+ <span><math><mi>&#x1D41E;</mi></math>=<span>1D41E</span></span>
+ <span><math><mi>&#x1D41F;</mi></math>=<span>1D41F</span></span>
+ <span><math><mi>&#x1D420;</mi></math>=<span>1D420</span></span>
+ <span><math><mi>&#x1D421;</mi></math>=<span>1D421</span></span>
+ <span><math><mi>&#x1D422;</mi></math>=<span>1D422</span></span>
+ <span><math><mi>&#x1D423;</mi></math>=<span>1D423</span></span>
+ <span><math><mi>&#x1D424;</mi></math>=<span>1D424</span></span>
+ <span><math><mi>&#x1D425;</mi></math>=<span>1D425</span></span><br/>
+ <span><math><mi>&#x1D426;</mi></math>=<span>1D426</span></span>
+ <span><math><mi>&#x1D427;</mi></math>=<span>1D427</span></span>
+ <span><math><mi>&#x1D428;</mi></math>=<span>1D428</span></span>
+ <span><math><mi>&#x1D429;</mi></math>=<span>1D429</span></span>
+ <span><math><mi>&#x1D42A;</mi></math>=<span>1D42A</span></span>
+ <span><math><mi>&#x1D42B;</mi></math>=<span>1D42B</span></span>
+ <span><math><mi>&#x1D42C;</mi></math>=<span>1D42C</span></span>
+ <span><math><mi>&#x1D42D;</mi></math>=<span>1D42D</span></span>
+ <span><math><mi>&#x1D42E;</mi></math>=<span>1D42E</span></span>
+ <span><math><mi>&#x1D42F;</mi></math>=<span>1D42F</span></span><br/>
+ <span><math><mi>&#x1D430;</mi></math>=<span>1D430</span></span>
+ <span><math><mi>&#x1D431;</mi></math>=<span>1D431</span></span>
+ <span><math><mi>&#x1D432;</mi></math>=<span>1D432</span></span>
+ <span><math><mi>&#x1D433;</mi></math>=<span>1D433</span></span>
+ <span><math><mi>&#x1D6A8;</mi></math>=<span>1D6A8</span></span>
+ <span><math><mi>&#x1D6A9;</mi></math>=<span>1D6A9</span></span>
+ <span><math><mi>&#x1D6AA;</mi></math>=<span>1D6AA</span></span>
+ <span><math><mi>&#x1D6AB;</mi></math>=<span>1D6AB</span></span>
+ <span><math><mi>&#x1D6AC;</mi></math>=<span>1D6AC</span></span>
+ <span><math><mi>&#x1D6AD;</mi></math>=<span>1D6AD</span></span><br/>
+ <span><math><mi>&#x1D6AE;</mi></math>=<span>1D6AE</span></span>
+ <span><math><mi>&#x1D6AF;</mi></math>=<span>1D6AF</span></span>
+ <span><math><mi>&#x1D6B0;</mi></math>=<span>1D6B0</span></span>
+ <span><math><mi>&#x1D6B1;</mi></math>=<span>1D6B1</span></span>
+ <span><math><mi>&#x1D6B2;</mi></math>=<span>1D6B2</span></span>
+ <span><math><mi>&#x1D6B3;</mi></math>=<span>1D6B3</span></span>
+ <span><math><mi>&#x1D6B4;</mi></math>=<span>1D6B4</span></span>
+ <span><math><mi>&#x1D6B5;</mi></math>=<span>1D6B5</span></span>
+ <span><math><mi>&#x1D6B6;</mi></math>=<span>1D6B6</span></span>
+ <span><math><mi>&#x1D6B7;</mi></math>=<span>1D6B7</span></span><br/>
+ <span><math><mi>&#x1D6B8;</mi></math>=<span>1D6B8</span></span>
+ <span><math><mi>&#x1D6BA;</mi></math>=<span>1D6BA</span></span>
+ <span><math><mi>&#x1D6BB;</mi></math>=<span>1D6BB</span></span>
+ <span><math><mi>&#x1D6BC;</mi></math>=<span>1D6BC</span></span>
+ <span><math><mi>&#x1D6BD;</mi></math>=<span>1D6BD</span></span>
+ <span><math><mi>&#x1D6BE;</mi></math>=<span>1D6BE</span></span>
+ <span><math><mi>&#x1D6BF;</mi></math>=<span>1D6BF</span></span>
+ <span><math><mi>&#x1D6C0;</mi></math>=<span>1D6C0</span></span>
+ <span><math><mi>&#x1D6C2;</mi></math>=<span>1D6C2</span></span>
+ <span><math><mi>&#x1D6C3;</mi></math>=<span>1D6C3</span></span><br/>
+ <span><math><mi>&#x1D6C4;</mi></math>=<span>1D6C4</span></span>
+ <span><math><mi>&#x1D6C5;</mi></math>=<span>1D6C5</span></span>
+ <span><math><mi>&#x1D6C6;</mi></math>=<span>1D6C6</span></span>
+ <span><math><mi>&#x1D6C7;</mi></math>=<span>1D6C7</span></span>
+ <span><math><mi>&#x1D6C8;</mi></math>=<span>1D6C8</span></span>
+ <span><math><mi>&#x1D6C9;</mi></math>=<span>1D6C9</span></span>
+ <span><math><mi>&#x1D6CA;</mi></math>=<span>1D6CA</span></span>
+ <span><math><mi>&#x1D6CB;</mi></math>=<span>1D6CB</span></span>
+ <span><math><mi>&#x1D6CC;</mi></math>=<span>1D6CC</span></span>
+ <span><math><mi>&#x1D6CD;</mi></math>=<span>1D6CD</span></span><br/>
+ <span><math><mi>&#x1D6CE;</mi></math>=<span>1D6CE</span></span>
+ <span><math><mi>&#x1D6CF;</mi></math>=<span>1D6CF</span></span>
+ <span><math><mi>&#x1D6D0;</mi></math>=<span>1D6D0</span></span>
+ <span><math><mi>&#x1D6D1;</mi></math>=<span>1D6D1</span></span>
+ <span><math><mi>&#x1D6D2;</mi></math>=<span>1D6D2</span></span>
+ <span><math><mi>&#x1D6D3;</mi></math>=<span>1D6D3</span></span>
+ <span><math><mi>&#x1D6D4;</mi></math>=<span>1D6D4</span></span>
+ <span><math><mi>&#x1D6D5;</mi></math>=<span>1D6D5</span></span>
+ <span><math><mi>&#x1D6D6;</mi></math>=<span>1D6D6</span></span>
+ <span><math><mi>&#x1D6D7;</mi></math>=<span>1D6D7</span></span><br/>
+ <span><math><mi>&#x1D6D8;</mi></math>=<span>1D6D8</span></span>
+ <span><math><mi>&#x1D6D9;</mi></math>=<span>1D6D9</span></span>
+ <span><math><mi>&#x1D6DA;</mi></math>=<span>1D6DA</span></span>
+ <span><math><mi>&#x1D6DD;</mi></math>=<span>1D6DD</span></span>
+ <span><math><mi>&#x1D6DF;</mi></math>=<span>1D6DF</span></span>
+ <span><math><mi>&#x1D6E1;</mi></math>=<span>1D6E1</span></span>
+ <span><math><mi>&#x1D7CA;</mi></math>=<span>1D7CA</span></span>
+ <span><math><mi>&#x1D7CB;</mi></math>=<span>1D7CB</span></span>
+ <span><math><mi>&#x1D6DE;</mi></math>=<span>1D6DE</span></span>
+ <span><math><mi>&#x1D6E0;</mi></math>=<span>1D6E0</span></span><br/>
+ <span><math><mi>&#x1D6B9;</mi></math>=<span>1D6B9</span></span>
+ <span><math><mi>&#x1D6DC;</mi></math>=<span>1D6DC</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-sans-serif-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-sans-serif-ref.html
new file mode 100644
index 00000000000..69ef0802f4b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-sans-serif-ref.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant bold-sans-serif (reference)</title>
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-bold-sans-serif.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi>&#x1D789;</mi></math>=<span>1D789</span></span>
+ <span><math><mi>&#x1D76F;</mi></math>=<span>1D76F</span></span>
+ <span><math><mi>&#x1D7EC;</mi></math>=<span>1D7EC</span></span>
+ <span><math><mi>&#x1D7ED;</mi></math>=<span>1D7ED</span></span>
+ <span><math><mi>&#x1D7EE;</mi></math>=<span>1D7EE</span></span>
+ <span><math><mi>&#x1D7EF;</mi></math>=<span>1D7EF</span></span>
+ <span><math><mi>&#x1D7F0;</mi></math>=<span>1D7F0</span></span>
+ <span><math><mi>&#x1D7F1;</mi></math>=<span>1D7F1</span></span>
+ <span><math><mi>&#x1D7F2;</mi></math>=<span>1D7F2</span></span>
+ <span><math><mi>&#x1D7F3;</mi></math>=<span>1D7F3</span></span><br/>
+ <span><math><mi>&#x1D7F4;</mi></math>=<span>1D7F4</span></span>
+ <span><math><mi>&#x1D7F5;</mi></math>=<span>1D7F5</span></span>
+ <span><math><mi>&#x1D5D4;</mi></math>=<span>1D5D4</span></span>
+ <span><math><mi>&#x1D5D5;</mi></math>=<span>1D5D5</span></span>
+ <span><math><mi>&#x1D5D6;</mi></math>=<span>1D5D6</span></span>
+ <span><math><mi>&#x1D5D7;</mi></math>=<span>1D5D7</span></span>
+ <span><math><mi>&#x1D5D8;</mi></math>=<span>1D5D8</span></span>
+ <span><math><mi>&#x1D5D9;</mi></math>=<span>1D5D9</span></span>
+ <span><math><mi>&#x1D5DA;</mi></math>=<span>1D5DA</span></span>
+ <span><math><mi>&#x1D5DB;</mi></math>=<span>1D5DB</span></span><br/>
+ <span><math><mi>&#x1D5DC;</mi></math>=<span>1D5DC</span></span>
+ <span><math><mi>&#x1D5DD;</mi></math>=<span>1D5DD</span></span>
+ <span><math><mi>&#x1D5DE;</mi></math>=<span>1D5DE</span></span>
+ <span><math><mi>&#x1D5DF;</mi></math>=<span>1D5DF</span></span>
+ <span><math><mi>&#x1D5E0;</mi></math>=<span>1D5E0</span></span>
+ <span><math><mi>&#x1D5E1;</mi></math>=<span>1D5E1</span></span>
+ <span><math><mi>&#x1D5E2;</mi></math>=<span>1D5E2</span></span>
+ <span><math><mi>&#x1D5E3;</mi></math>=<span>1D5E3</span></span>
+ <span><math><mi>&#x1D5E4;</mi></math>=<span>1D5E4</span></span>
+ <span><math><mi>&#x1D5E5;</mi></math>=<span>1D5E5</span></span><br/>
+ <span><math><mi>&#x1D5E6;</mi></math>=<span>1D5E6</span></span>
+ <span><math><mi>&#x1D5E7;</mi></math>=<span>1D5E7</span></span>
+ <span><math><mi>&#x1D5E8;</mi></math>=<span>1D5E8</span></span>
+ <span><math><mi>&#x1D5E9;</mi></math>=<span>1D5E9</span></span>
+ <span><math><mi>&#x1D5EA;</mi></math>=<span>1D5EA</span></span>
+ <span><math><mi>&#x1D5EB;</mi></math>=<span>1D5EB</span></span>
+ <span><math><mi>&#x1D5EC;</mi></math>=<span>1D5EC</span></span>
+ <span><math><mi>&#x1D5ED;</mi></math>=<span>1D5ED</span></span>
+ <span><math><mi>&#x1D5EE;</mi></math>=<span>1D5EE</span></span>
+ <span><math><mi>&#x1D5EF;</mi></math>=<span>1D5EF</span></span><br/>
+ <span><math><mi>&#x1D5F0;</mi></math>=<span>1D5F0</span></span>
+ <span><math><mi>&#x1D5F1;</mi></math>=<span>1D5F1</span></span>
+ <span><math><mi>&#x1D5F2;</mi></math>=<span>1D5F2</span></span>
+ <span><math><mi>&#x1D5F3;</mi></math>=<span>1D5F3</span></span>
+ <span><math><mi>&#x1D5F4;</mi></math>=<span>1D5F4</span></span>
+ <span><math><mi>&#x1D5F5;</mi></math>=<span>1D5F5</span></span>
+ <span><math><mi>&#x1D5F6;</mi></math>=<span>1D5F6</span></span>
+ <span><math><mi>&#x1D5F7;</mi></math>=<span>1D5F7</span></span>
+ <span><math><mi>&#x1D5F8;</mi></math>=<span>1D5F8</span></span>
+ <span><math><mi>&#x1D5F9;</mi></math>=<span>1D5F9</span></span><br/>
+ <span><math><mi>&#x1D5FA;</mi></math>=<span>1D5FA</span></span>
+ <span><math><mi>&#x1D5FB;</mi></math>=<span>1D5FB</span></span>
+ <span><math><mi>&#x1D5FC;</mi></math>=<span>1D5FC</span></span>
+ <span><math><mi>&#x1D5FD;</mi></math>=<span>1D5FD</span></span>
+ <span><math><mi>&#x1D5FE;</mi></math>=<span>1D5FE</span></span>
+ <span><math><mi>&#x1D5FF;</mi></math>=<span>1D5FF</span></span>
+ <span><math><mi>&#x1D600;</mi></math>=<span>1D600</span></span>
+ <span><math><mi>&#x1D601;</mi></math>=<span>1D601</span></span>
+ <span><math><mi>&#x1D602;</mi></math>=<span>1D602</span></span>
+ <span><math><mi>&#x1D603;</mi></math>=<span>1D603</span></span><br/>
+ <span><math><mi>&#x1D604;</mi></math>=<span>1D604</span></span>
+ <span><math><mi>&#x1D605;</mi></math>=<span>1D605</span></span>
+ <span><math><mi>&#x1D606;</mi></math>=<span>1D606</span></span>
+ <span><math><mi>&#x1D607;</mi></math>=<span>1D607</span></span>
+ <span><math><mi>&#x1D756;</mi></math>=<span>1D756</span></span>
+ <span><math><mi>&#x1D757;</mi></math>=<span>1D757</span></span>
+ <span><math><mi>&#x1D758;</mi></math>=<span>1D758</span></span>
+ <span><math><mi>&#x1D759;</mi></math>=<span>1D759</span></span>
+ <span><math><mi>&#x1D75A;</mi></math>=<span>1D75A</span></span>
+ <span><math><mi>&#x1D75B;</mi></math>=<span>1D75B</span></span><br/>
+ <span><math><mi>&#x1D75C;</mi></math>=<span>1D75C</span></span>
+ <span><math><mi>&#x1D75D;</mi></math>=<span>1D75D</span></span>
+ <span><math><mi>&#x1D75E;</mi></math>=<span>1D75E</span></span>
+ <span><math><mi>&#x1D75F;</mi></math>=<span>1D75F</span></span>
+ <span><math><mi>&#x1D760;</mi></math>=<span>1D760</span></span>
+ <span><math><mi>&#x1D761;</mi></math>=<span>1D761</span></span>
+ <span><math><mi>&#x1D762;</mi></math>=<span>1D762</span></span>
+ <span><math><mi>&#x1D763;</mi></math>=<span>1D763</span></span>
+ <span><math><mi>&#x1D764;</mi></math>=<span>1D764</span></span>
+ <span><math><mi>&#x1D765;</mi></math>=<span>1D765</span></span><br/>
+ <span><math><mi>&#x1D766;</mi></math>=<span>1D766</span></span>
+ <span><math><mi>&#x1D768;</mi></math>=<span>1D768</span></span>
+ <span><math><mi>&#x1D769;</mi></math>=<span>1D769</span></span>
+ <span><math><mi>&#x1D76A;</mi></math>=<span>1D76A</span></span>
+ <span><math><mi>&#x1D76B;</mi></math>=<span>1D76B</span></span>
+ <span><math><mi>&#x1D76C;</mi></math>=<span>1D76C</span></span>
+ <span><math><mi>&#x1D76D;</mi></math>=<span>1D76D</span></span>
+ <span><math><mi>&#x1D76E;</mi></math>=<span>1D76E</span></span>
+ <span><math><mi>&#x1D770;</mi></math>=<span>1D770</span></span>
+ <span><math><mi>&#x1D771;</mi></math>=<span>1D771</span></span><br/>
+ <span><math><mi>&#x1D772;</mi></math>=<span>1D772</span></span>
+ <span><math><mi>&#x1D773;</mi></math>=<span>1D773</span></span>
+ <span><math><mi>&#x1D774;</mi></math>=<span>1D774</span></span>
+ <span><math><mi>&#x1D775;</mi></math>=<span>1D775</span></span>
+ <span><math><mi>&#x1D776;</mi></math>=<span>1D776</span></span>
+ <span><math><mi>&#x1D777;</mi></math>=<span>1D777</span></span>
+ <span><math><mi>&#x1D778;</mi></math>=<span>1D778</span></span>
+ <span><math><mi>&#x1D779;</mi></math>=<span>1D779</span></span>
+ <span><math><mi>&#x1D77A;</mi></math>=<span>1D77A</span></span>
+ <span><math><mi>&#x1D77B;</mi></math>=<span>1D77B</span></span><br/>
+ <span><math><mi>&#x1D77C;</mi></math>=<span>1D77C</span></span>
+ <span><math><mi>&#x1D77D;</mi></math>=<span>1D77D</span></span>
+ <span><math><mi>&#x1D77E;</mi></math>=<span>1D77E</span></span>
+ <span><math><mi>&#x1D77F;</mi></math>=<span>1D77F</span></span>
+ <span><math><mi>&#x1D780;</mi></math>=<span>1D780</span></span>
+ <span><math><mi>&#x1D781;</mi></math>=<span>1D781</span></span>
+ <span><math><mi>&#x1D782;</mi></math>=<span>1D782</span></span>
+ <span><math><mi>&#x1D783;</mi></math>=<span>1D783</span></span>
+ <span><math><mi>&#x1D784;</mi></math>=<span>1D784</span></span>
+ <span><math><mi>&#x1D785;</mi></math>=<span>1D785</span></span><br/>
+ <span><math><mi>&#x1D786;</mi></math>=<span>1D786</span></span>
+ <span><math><mi>&#x1D787;</mi></math>=<span>1D787</span></span>
+ <span><math><mi>&#x1D788;</mi></math>=<span>1D788</span></span>
+ <span><math><mi>&#x1D78B;</mi></math>=<span>1D78B</span></span>
+ <span><math><mi>&#x1D78D;</mi></math>=<span>1D78D</span></span>
+ <span><math><mi>&#x1D78F;</mi></math>=<span>1D78F</span></span>
+ <span><math><mi>&#x1D78C;</mi></math>=<span>1D78C</span></span>
+ <span><math><mi>&#x1D78E;</mi></math>=<span>1D78E</span></span>
+ <span><math><mi>&#x1D767;</mi></math>=<span>1D767</span></span>
+ <span><math><mi>&#x1D78A;</mi></math>=<span>1D78A</span></span><br/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-sans-serif.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-sans-serif.html
new file mode 100644
index 00000000000..2a009507d18
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-sans-serif.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant bold-sans-serif</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1.tab2"/>
+<link rel="match" href="mathvariant-bold-sans-serif-ref.html"/>
+<meta name="assert" content="Verify that a single-char <mi> with a bold-sans-serif mathvariant is equivalent to an <mi> with the transformed unicode character.">
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-bold-sans-serif.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi mathvariant="bold-sans-serif">&#x2202;</mi></math>=<span>1D789</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x2207;</mi></math>=<span>1D76F</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x30;</mi></math>=<span>1D7EC</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x31;</mi></math>=<span>1D7ED</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x32;</mi></math>=<span>1D7EE</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x33;</mi></math>=<span>1D7EF</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x34;</mi></math>=<span>1D7F0</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x35;</mi></math>=<span>1D7F1</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x36;</mi></math>=<span>1D7F2</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x37;</mi></math>=<span>1D7F3</span></span><br/>
+ <span><math><mi mathvariant="bold-sans-serif">&#x38;</mi></math>=<span>1D7F4</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x39;</mi></math>=<span>1D7F5</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x41;</mi></math>=<span>1D5D4</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x42;</mi></math>=<span>1D5D5</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x43;</mi></math>=<span>1D5D6</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x44;</mi></math>=<span>1D5D7</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x45;</mi></math>=<span>1D5D8</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x46;</mi></math>=<span>1D5D9</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x47;</mi></math>=<span>1D5DA</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x48;</mi></math>=<span>1D5DB</span></span><br/>
+ <span><math><mi mathvariant="bold-sans-serif">&#x49;</mi></math>=<span>1D5DC</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x4A;</mi></math>=<span>1D5DD</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x4B;</mi></math>=<span>1D5DE</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x4C;</mi></math>=<span>1D5DF</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x4D;</mi></math>=<span>1D5E0</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x4E;</mi></math>=<span>1D5E1</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x4F;</mi></math>=<span>1D5E2</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x50;</mi></math>=<span>1D5E3</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x51;</mi></math>=<span>1D5E4</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x52;</mi></math>=<span>1D5E5</span></span><br/>
+ <span><math><mi mathvariant="bold-sans-serif">&#x53;</mi></math>=<span>1D5E6</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x54;</mi></math>=<span>1D5E7</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x55;</mi></math>=<span>1D5E8</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x56;</mi></math>=<span>1D5E9</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x57;</mi></math>=<span>1D5EA</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x58;</mi></math>=<span>1D5EB</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x59;</mi></math>=<span>1D5EC</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x5A;</mi></math>=<span>1D5ED</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x61;</mi></math>=<span>1D5EE</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x62;</mi></math>=<span>1D5EF</span></span><br/>
+ <span><math><mi mathvariant="bold-sans-serif">&#x63;</mi></math>=<span>1D5F0</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x64;</mi></math>=<span>1D5F1</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x65;</mi></math>=<span>1D5F2</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x66;</mi></math>=<span>1D5F3</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x67;</mi></math>=<span>1D5F4</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x68;</mi></math>=<span>1D5F5</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x69;</mi></math>=<span>1D5F6</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x6A;</mi></math>=<span>1D5F7</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x6B;</mi></math>=<span>1D5F8</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x6C;</mi></math>=<span>1D5F9</span></span><br/>
+ <span><math><mi mathvariant="bold-sans-serif">&#x6D;</mi></math>=<span>1D5FA</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x6E;</mi></math>=<span>1D5FB</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x6F;</mi></math>=<span>1D5FC</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x70;</mi></math>=<span>1D5FD</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x71;</mi></math>=<span>1D5FE</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x72;</mi></math>=<span>1D5FF</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x73;</mi></math>=<span>1D600</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x74;</mi></math>=<span>1D601</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x75;</mi></math>=<span>1D602</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x76;</mi></math>=<span>1D603</span></span><br/>
+ <span><math><mi mathvariant="bold-sans-serif">&#x77;</mi></math>=<span>1D604</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x78;</mi></math>=<span>1D605</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x79;</mi></math>=<span>1D606</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x7A;</mi></math>=<span>1D607</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x391;</mi></math>=<span>1D756</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x392;</mi></math>=<span>1D757</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x393;</mi></math>=<span>1D758</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x394;</mi></math>=<span>1D759</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x395;</mi></math>=<span>1D75A</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x396;</mi></math>=<span>1D75B</span></span><br/>
+ <span><math><mi mathvariant="bold-sans-serif">&#x397;</mi></math>=<span>1D75C</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x398;</mi></math>=<span>1D75D</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x399;</mi></math>=<span>1D75E</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x39A;</mi></math>=<span>1D75F</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x39B;</mi></math>=<span>1D760</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x39C;</mi></math>=<span>1D761</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x39D;</mi></math>=<span>1D762</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x39E;</mi></math>=<span>1D763</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x39F;</mi></math>=<span>1D764</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3A0;</mi></math>=<span>1D765</span></span><br/>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3A1;</mi></math>=<span>1D766</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3A3;</mi></math>=<span>1D768</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3A4;</mi></math>=<span>1D769</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3A5;</mi></math>=<span>1D76A</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3A6;</mi></math>=<span>1D76B</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3A7;</mi></math>=<span>1D76C</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3A8;</mi></math>=<span>1D76D</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3A9;</mi></math>=<span>1D76E</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3B1;</mi></math>=<span>1D770</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3B2;</mi></math>=<span>1D771</span></span><br/>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3B3;</mi></math>=<span>1D772</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3B4;</mi></math>=<span>1D773</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3B5;</mi></math>=<span>1D774</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3B6;</mi></math>=<span>1D775</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3B7;</mi></math>=<span>1D776</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3B8;</mi></math>=<span>1D777</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3B9;</mi></math>=<span>1D778</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3BA;</mi></math>=<span>1D779</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3BB;</mi></math>=<span>1D77A</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3BC;</mi></math>=<span>1D77B</span></span><br/>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3BD;</mi></math>=<span>1D77C</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3BE;</mi></math>=<span>1D77D</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3BF;</mi></math>=<span>1D77E</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3C0;</mi></math>=<span>1D77F</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3C1;</mi></math>=<span>1D780</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3C2;</mi></math>=<span>1D781</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3C3;</mi></math>=<span>1D782</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3C4;</mi></math>=<span>1D783</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3C5;</mi></math>=<span>1D784</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3C6;</mi></math>=<span>1D785</span></span><br/>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3C7;</mi></math>=<span>1D786</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3C8;</mi></math>=<span>1D787</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3C9;</mi></math>=<span>1D788</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3D1;</mi></math>=<span>1D78B</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3D5;</mi></math>=<span>1D78D</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3D6;</mi></math>=<span>1D78F</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3F0;</mi></math>=<span>1D78C</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3F1;</mi></math>=<span>1D78E</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3F4;</mi></math>=<span>1D767</span></span>
+ <span><math><mi mathvariant="bold-sans-serif">&#x3F5;</mi></math>=<span>1D78A</span></span><br/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-script-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-script-ref.html
new file mode 100644
index 00000000000..1ae6f1d6e68
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-script-ref.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant bold-script (reference)</title>
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-bold-script.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi>&#x1D4D0;</mi></math>=<span>1D4D0</span></span>
+ <span><math><mi>&#x1D4D1;</mi></math>=<span>1D4D1</span></span>
+ <span><math><mi>&#x1D4D2;</mi></math>=<span>1D4D2</span></span>
+ <span><math><mi>&#x1D4D3;</mi></math>=<span>1D4D3</span></span>
+ <span><math><mi>&#x1D4D4;</mi></math>=<span>1D4D4</span></span>
+ <span><math><mi>&#x1D4D5;</mi></math>=<span>1D4D5</span></span>
+ <span><math><mi>&#x1D4D6;</mi></math>=<span>1D4D6</span></span>
+ <span><math><mi>&#x1D4D7;</mi></math>=<span>1D4D7</span></span>
+ <span><math><mi>&#x1D4D8;</mi></math>=<span>1D4D8</span></span>
+ <span><math><mi>&#x1D4D9;</mi></math>=<span>1D4D9</span></span><br/>
+ <span><math><mi>&#x1D4DA;</mi></math>=<span>1D4DA</span></span>
+ <span><math><mi>&#x1D4DB;</mi></math>=<span>1D4DB</span></span>
+ <span><math><mi>&#x1D4DC;</mi></math>=<span>1D4DC</span></span>
+ <span><math><mi>&#x1D4DD;</mi></math>=<span>1D4DD</span></span>
+ <span><math><mi>&#x1D4DE;</mi></math>=<span>1D4DE</span></span>
+ <span><math><mi>&#x1D4DF;</mi></math>=<span>1D4DF</span></span>
+ <span><math><mi>&#x1D4E0;</mi></math>=<span>1D4E0</span></span>
+ <span><math><mi>&#x1D4E1;</mi></math>=<span>1D4E1</span></span>
+ <span><math><mi>&#x1D4E2;</mi></math>=<span>1D4E2</span></span>
+ <span><math><mi>&#x1D4E3;</mi></math>=<span>1D4E3</span></span><br/>
+ <span><math><mi>&#x1D4E4;</mi></math>=<span>1D4E4</span></span>
+ <span><math><mi>&#x1D4E5;</mi></math>=<span>1D4E5</span></span>
+ <span><math><mi>&#x1D4E6;</mi></math>=<span>1D4E6</span></span>
+ <span><math><mi>&#x1D4E7;</mi></math>=<span>1D4E7</span></span>
+ <span><math><mi>&#x1D4E8;</mi></math>=<span>1D4E8</span></span>
+ <span><math><mi>&#x1D4E9;</mi></math>=<span>1D4E9</span></span>
+ <span><math><mi>&#x1D4EA;</mi></math>=<span>1D4EA</span></span>
+ <span><math><mi>&#x1D4EB;</mi></math>=<span>1D4EB</span></span>
+ <span><math><mi>&#x1D4EC;</mi></math>=<span>1D4EC</span></span>
+ <span><math><mi>&#x1D4ED;</mi></math>=<span>1D4ED</span></span><br/>
+ <span><math><mi>&#x1D4EE;</mi></math>=<span>1D4EE</span></span>
+ <span><math><mi>&#x1D4EF;</mi></math>=<span>1D4EF</span></span>
+ <span><math><mi>&#x1D4F0;</mi></math>=<span>1D4F0</span></span>
+ <span><math><mi>&#x1D4F1;</mi></math>=<span>1D4F1</span></span>
+ <span><math><mi>&#x1D4F2;</mi></math>=<span>1D4F2</span></span>
+ <span><math><mi>&#x1D4F3;</mi></math>=<span>1D4F3</span></span>
+ <span><math><mi>&#x1D4F4;</mi></math>=<span>1D4F4</span></span>
+ <span><math><mi>&#x1D4F5;</mi></math>=<span>1D4F5</span></span>
+ <span><math><mi>&#x1D4F6;</mi></math>=<span>1D4F6</span></span>
+ <span><math><mi>&#x1D4F7;</mi></math>=<span>1D4F7</span></span><br/>
+ <span><math><mi>&#x1D4F8;</mi></math>=<span>1D4F8</span></span>
+ <span><math><mi>&#x1D4F9;</mi></math>=<span>1D4F9</span></span>
+ <span><math><mi>&#x1D4FA;</mi></math>=<span>1D4FA</span></span>
+ <span><math><mi>&#x1D4FB;</mi></math>=<span>1D4FB</span></span>
+ <span><math><mi>&#x1D4FC;</mi></math>=<span>1D4FC</span></span>
+ <span><math><mi>&#x1D4FD;</mi></math>=<span>1D4FD</span></span>
+ <span><math><mi>&#x1D4FE;</mi></math>=<span>1D4FE</span></span>
+ <span><math><mi>&#x1D4FF;</mi></math>=<span>1D4FF</span></span>
+ <span><math><mi>&#x1D500;</mi></math>=<span>1D500</span></span>
+ <span><math><mi>&#x1D501;</mi></math>=<span>1D501</span></span><br/>
+ <span><math><mi>&#x1D502;</mi></math>=<span>1D502</span></span>
+ <span><math><mi>&#x1D503;</mi></math>=<span>1D503</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-script.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-script.html
new file mode 100644
index 00000000000..8c2e693252b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold-script.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant bold-script</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1.tab2"/>
+<link rel="match" href="mathvariant-bold-script-ref.html"/>
+<meta name="assert" content="Verify that a single-char <mi> with a bold-script mathvariant is equivalent to an <mi> with the transformed unicode character.">
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-bold-script.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi mathvariant="bold-script">&#x41;</mi></math>=<span>1D4D0</span></span>
+ <span><math><mi mathvariant="bold-script">&#x42;</mi></math>=<span>1D4D1</span></span>
+ <span><math><mi mathvariant="bold-script">&#x43;</mi></math>=<span>1D4D2</span></span>
+ <span><math><mi mathvariant="bold-script">&#x44;</mi></math>=<span>1D4D3</span></span>
+ <span><math><mi mathvariant="bold-script">&#x45;</mi></math>=<span>1D4D4</span></span>
+ <span><math><mi mathvariant="bold-script">&#x46;</mi></math>=<span>1D4D5</span></span>
+ <span><math><mi mathvariant="bold-script">&#x47;</mi></math>=<span>1D4D6</span></span>
+ <span><math><mi mathvariant="bold-script">&#x48;</mi></math>=<span>1D4D7</span></span>
+ <span><math><mi mathvariant="bold-script">&#x49;</mi></math>=<span>1D4D8</span></span>
+ <span><math><mi mathvariant="bold-script">&#x4A;</mi></math>=<span>1D4D9</span></span><br/>
+ <span><math><mi mathvariant="bold-script">&#x4B;</mi></math>=<span>1D4DA</span></span>
+ <span><math><mi mathvariant="bold-script">&#x4C;</mi></math>=<span>1D4DB</span></span>
+ <span><math><mi mathvariant="bold-script">&#x4D;</mi></math>=<span>1D4DC</span></span>
+ <span><math><mi mathvariant="bold-script">&#x4E;</mi></math>=<span>1D4DD</span></span>
+ <span><math><mi mathvariant="bold-script">&#x4F;</mi></math>=<span>1D4DE</span></span>
+ <span><math><mi mathvariant="bold-script">&#x50;</mi></math>=<span>1D4DF</span></span>
+ <span><math><mi mathvariant="bold-script">&#x51;</mi></math>=<span>1D4E0</span></span>
+ <span><math><mi mathvariant="bold-script">&#x52;</mi></math>=<span>1D4E1</span></span>
+ <span><math><mi mathvariant="bold-script">&#x53;</mi></math>=<span>1D4E2</span></span>
+ <span><math><mi mathvariant="bold-script">&#x54;</mi></math>=<span>1D4E3</span></span><br/>
+ <span><math><mi mathvariant="bold-script">&#x55;</mi></math>=<span>1D4E4</span></span>
+ <span><math><mi mathvariant="bold-script">&#x56;</mi></math>=<span>1D4E5</span></span>
+ <span><math><mi mathvariant="bold-script">&#x57;</mi></math>=<span>1D4E6</span></span>
+ <span><math><mi mathvariant="bold-script">&#x58;</mi></math>=<span>1D4E7</span></span>
+ <span><math><mi mathvariant="bold-script">&#x59;</mi></math>=<span>1D4E8</span></span>
+ <span><math><mi mathvariant="bold-script">&#x5A;</mi></math>=<span>1D4E9</span></span>
+ <span><math><mi mathvariant="bold-script">&#x61;</mi></math>=<span>1D4EA</span></span>
+ <span><math><mi mathvariant="bold-script">&#x62;</mi></math>=<span>1D4EB</span></span>
+ <span><math><mi mathvariant="bold-script">&#x63;</mi></math>=<span>1D4EC</span></span>
+ <span><math><mi mathvariant="bold-script">&#x64;</mi></math>=<span>1D4ED</span></span><br/>
+ <span><math><mi mathvariant="bold-script">&#x65;</mi></math>=<span>1D4EE</span></span>
+ <span><math><mi mathvariant="bold-script">&#x66;</mi></math>=<span>1D4EF</span></span>
+ <span><math><mi mathvariant="bold-script">&#x67;</mi></math>=<span>1D4F0</span></span>
+ <span><math><mi mathvariant="bold-script">&#x68;</mi></math>=<span>1D4F1</span></span>
+ <span><math><mi mathvariant="bold-script">&#x69;</mi></math>=<span>1D4F2</span></span>
+ <span><math><mi mathvariant="bold-script">&#x6A;</mi></math>=<span>1D4F3</span></span>
+ <span><math><mi mathvariant="bold-script">&#x6B;</mi></math>=<span>1D4F4</span></span>
+ <span><math><mi mathvariant="bold-script">&#x6C;</mi></math>=<span>1D4F5</span></span>
+ <span><math><mi mathvariant="bold-script">&#x6D;</mi></math>=<span>1D4F6</span></span>
+ <span><math><mi mathvariant="bold-script">&#x6E;</mi></math>=<span>1D4F7</span></span><br/>
+ <span><math><mi mathvariant="bold-script">&#x6F;</mi></math>=<span>1D4F8</span></span>
+ <span><math><mi mathvariant="bold-script">&#x70;</mi></math>=<span>1D4F9</span></span>
+ <span><math><mi mathvariant="bold-script">&#x71;</mi></math>=<span>1D4FA</span></span>
+ <span><math><mi mathvariant="bold-script">&#x72;</mi></math>=<span>1D4FB</span></span>
+ <span><math><mi mathvariant="bold-script">&#x73;</mi></math>=<span>1D4FC</span></span>
+ <span><math><mi mathvariant="bold-script">&#x74;</mi></math>=<span>1D4FD</span></span>
+ <span><math><mi mathvariant="bold-script">&#x75;</mi></math>=<span>1D4FE</span></span>
+ <span><math><mi mathvariant="bold-script">&#x76;</mi></math>=<span>1D4FF</span></span>
+ <span><math><mi mathvariant="bold-script">&#x77;</mi></math>=<span>1D500</span></span>
+ <span><math><mi mathvariant="bold-script">&#x78;</mi></math>=<span>1D501</span></span><br/>
+ <span><math><mi mathvariant="bold-script">&#x79;</mi></math>=<span>1D502</span></span>
+ <span><math><mi mathvariant="bold-script">&#x7A;</mi></math>=<span>1D503</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold.html
new file mode 100644
index 00000000000..d00e3a1ca5b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-bold.html
@@ -0,0 +1,152 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant bold</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1.tab2"/>
+<link rel="match" href="mathvariant-bold-ref.html"/>
+<meta name="assert" content="Verify that a single-char <mi> with a bold mathvariant is equivalent to an <mi> with the transformed unicode character.">
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-bold.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi mathvariant="bold">&#x2202;</mi></math>=<span>1D6DB</span></span>
+ <span><math><mi mathvariant="bold">&#x2207;</mi></math>=<span>1D6C1</span></span>
+ <span><math><mi mathvariant="bold">&#x30;</mi></math>=<span>1D7CE</span></span>
+ <span><math><mi mathvariant="bold">&#x31;</mi></math>=<span>1D7CF</span></span>
+ <span><math><mi mathvariant="bold">&#x32;</mi></math>=<span>1D7D0</span></span>
+ <span><math><mi mathvariant="bold">&#x33;</mi></math>=<span>1D7D1</span></span>
+ <span><math><mi mathvariant="bold">&#x34;</mi></math>=<span>1D7D2</span></span>
+ <span><math><mi mathvariant="bold">&#x35;</mi></math>=<span>1D7D3</span></span>
+ <span><math><mi mathvariant="bold">&#x36;</mi></math>=<span>1D7D4</span></span>
+ <span><math><mi mathvariant="bold">&#x37;</mi></math>=<span>1D7D5</span></span><br/>
+ <span><math><mi mathvariant="bold">&#x38;</mi></math>=<span>1D7D6</span></span>
+ <span><math><mi mathvariant="bold">&#x39;</mi></math>=<span>1D7D7</span></span>
+ <span><math><mi mathvariant="bold">&#x41;</mi></math>=<span>1D400</span></span>
+ <span><math><mi mathvariant="bold">&#x42;</mi></math>=<span>1D401</span></span>
+ <span><math><mi mathvariant="bold">&#x43;</mi></math>=<span>1D402</span></span>
+ <span><math><mi mathvariant="bold">&#x44;</mi></math>=<span>1D403</span></span>
+ <span><math><mi mathvariant="bold">&#x45;</mi></math>=<span>1D404</span></span>
+ <span><math><mi mathvariant="bold">&#x46;</mi></math>=<span>1D405</span></span>
+ <span><math><mi mathvariant="bold">&#x47;</mi></math>=<span>1D406</span></span>
+ <span><math><mi mathvariant="bold">&#x48;</mi></math>=<span>1D407</span></span><br/>
+ <span><math><mi mathvariant="bold">&#x49;</mi></math>=<span>1D408</span></span>
+ <span><math><mi mathvariant="bold">&#x4A;</mi></math>=<span>1D409</span></span>
+ <span><math><mi mathvariant="bold">&#x4B;</mi></math>=<span>1D40A</span></span>
+ <span><math><mi mathvariant="bold">&#x4C;</mi></math>=<span>1D40B</span></span>
+ <span><math><mi mathvariant="bold">&#x4D;</mi></math>=<span>1D40C</span></span>
+ <span><math><mi mathvariant="bold">&#x4E;</mi></math>=<span>1D40D</span></span>
+ <span><math><mi mathvariant="bold">&#x4F;</mi></math>=<span>1D40E</span></span>
+ <span><math><mi mathvariant="bold">&#x50;</mi></math>=<span>1D40F</span></span>
+ <span><math><mi mathvariant="bold">&#x51;</mi></math>=<span>1D410</span></span>
+ <span><math><mi mathvariant="bold">&#x52;</mi></math>=<span>1D411</span></span><br/>
+ <span><math><mi mathvariant="bold">&#x53;</mi></math>=<span>1D412</span></span>
+ <span><math><mi mathvariant="bold">&#x54;</mi></math>=<span>1D413</span></span>
+ <span><math><mi mathvariant="bold">&#x55;</mi></math>=<span>1D414</span></span>
+ <span><math><mi mathvariant="bold">&#x56;</mi></math>=<span>1D415</span></span>
+ <span><math><mi mathvariant="bold">&#x57;</mi></math>=<span>1D416</span></span>
+ <span><math><mi mathvariant="bold">&#x58;</mi></math>=<span>1D417</span></span>
+ <span><math><mi mathvariant="bold">&#x59;</mi></math>=<span>1D418</span></span>
+ <span><math><mi mathvariant="bold">&#x5A;</mi></math>=<span>1D419</span></span>
+ <span><math><mi mathvariant="bold">&#x61;</mi></math>=<span>1D41A</span></span>
+ <span><math><mi mathvariant="bold">&#x62;</mi></math>=<span>1D41B</span></span><br/>
+ <span><math><mi mathvariant="bold">&#x63;</mi></math>=<span>1D41C</span></span>
+ <span><math><mi mathvariant="bold">&#x64;</mi></math>=<span>1D41D</span></span>
+ <span><math><mi mathvariant="bold">&#x65;</mi></math>=<span>1D41E</span></span>
+ <span><math><mi mathvariant="bold">&#x66;</mi></math>=<span>1D41F</span></span>
+ <span><math><mi mathvariant="bold">&#x67;</mi></math>=<span>1D420</span></span>
+ <span><math><mi mathvariant="bold">&#x68;</mi></math>=<span>1D421</span></span>
+ <span><math><mi mathvariant="bold">&#x69;</mi></math>=<span>1D422</span></span>
+ <span><math><mi mathvariant="bold">&#x6A;</mi></math>=<span>1D423</span></span>
+ <span><math><mi mathvariant="bold">&#x6B;</mi></math>=<span>1D424</span></span>
+ <span><math><mi mathvariant="bold">&#x6C;</mi></math>=<span>1D425</span></span><br/>
+ <span><math><mi mathvariant="bold">&#x6D;</mi></math>=<span>1D426</span></span>
+ <span><math><mi mathvariant="bold">&#x6E;</mi></math>=<span>1D427</span></span>
+ <span><math><mi mathvariant="bold">&#x6F;</mi></math>=<span>1D428</span></span>
+ <span><math><mi mathvariant="bold">&#x70;</mi></math>=<span>1D429</span></span>
+ <span><math><mi mathvariant="bold">&#x71;</mi></math>=<span>1D42A</span></span>
+ <span><math><mi mathvariant="bold">&#x72;</mi></math>=<span>1D42B</span></span>
+ <span><math><mi mathvariant="bold">&#x73;</mi></math>=<span>1D42C</span></span>
+ <span><math><mi mathvariant="bold">&#x74;</mi></math>=<span>1D42D</span></span>
+ <span><math><mi mathvariant="bold">&#x75;</mi></math>=<span>1D42E</span></span>
+ <span><math><mi mathvariant="bold">&#x76;</mi></math>=<span>1D42F</span></span><br/>
+ <span><math><mi mathvariant="bold">&#x77;</mi></math>=<span>1D430</span></span>
+ <span><math><mi mathvariant="bold">&#x78;</mi></math>=<span>1D431</span></span>
+ <span><math><mi mathvariant="bold">&#x79;</mi></math>=<span>1D432</span></span>
+ <span><math><mi mathvariant="bold">&#x7A;</mi></math>=<span>1D433</span></span>
+ <span><math><mi mathvariant="bold">&#x391;</mi></math>=<span>1D6A8</span></span>
+ <span><math><mi mathvariant="bold">&#x392;</mi></math>=<span>1D6A9</span></span>
+ <span><math><mi mathvariant="bold">&#x393;</mi></math>=<span>1D6AA</span></span>
+ <span><math><mi mathvariant="bold">&#x394;</mi></math>=<span>1D6AB</span></span>
+ <span><math><mi mathvariant="bold">&#x395;</mi></math>=<span>1D6AC</span></span>
+ <span><math><mi mathvariant="bold">&#x396;</mi></math>=<span>1D6AD</span></span><br/>
+ <span><math><mi mathvariant="bold">&#x397;</mi></math>=<span>1D6AE</span></span>
+ <span><math><mi mathvariant="bold">&#x398;</mi></math>=<span>1D6AF</span></span>
+ <span><math><mi mathvariant="bold">&#x399;</mi></math>=<span>1D6B0</span></span>
+ <span><math><mi mathvariant="bold">&#x39A;</mi></math>=<span>1D6B1</span></span>
+ <span><math><mi mathvariant="bold">&#x39B;</mi></math>=<span>1D6B2</span></span>
+ <span><math><mi mathvariant="bold">&#x39C;</mi></math>=<span>1D6B3</span></span>
+ <span><math><mi mathvariant="bold">&#x39D;</mi></math>=<span>1D6B4</span></span>
+ <span><math><mi mathvariant="bold">&#x39E;</mi></math>=<span>1D6B5</span></span>
+ <span><math><mi mathvariant="bold">&#x39F;</mi></math>=<span>1D6B6</span></span>
+ <span><math><mi mathvariant="bold">&#x3A0;</mi></math>=<span>1D6B7</span></span><br/>
+ <span><math><mi mathvariant="bold">&#x3A1;</mi></math>=<span>1D6B8</span></span>
+ <span><math><mi mathvariant="bold">&#x3A3;</mi></math>=<span>1D6BA</span></span>
+ <span><math><mi mathvariant="bold">&#x3A4;</mi></math>=<span>1D6BB</span></span>
+ <span><math><mi mathvariant="bold">&#x3A5;</mi></math>=<span>1D6BC</span></span>
+ <span><math><mi mathvariant="bold">&#x3A6;</mi></math>=<span>1D6BD</span></span>
+ <span><math><mi mathvariant="bold">&#x3A7;</mi></math>=<span>1D6BE</span></span>
+ <span><math><mi mathvariant="bold">&#x3A8;</mi></math>=<span>1D6BF</span></span>
+ <span><math><mi mathvariant="bold">&#x3A9;</mi></math>=<span>1D6C0</span></span>
+ <span><math><mi mathvariant="bold">&#x3B1;</mi></math>=<span>1D6C2</span></span>
+ <span><math><mi mathvariant="bold">&#x3B2;</mi></math>=<span>1D6C3</span></span><br/>
+ <span><math><mi mathvariant="bold">&#x3B3;</mi></math>=<span>1D6C4</span></span>
+ <span><math><mi mathvariant="bold">&#x3B4;</mi></math>=<span>1D6C5</span></span>
+ <span><math><mi mathvariant="bold">&#x3B5;</mi></math>=<span>1D6C6</span></span>
+ <span><math><mi mathvariant="bold">&#x3B6;</mi></math>=<span>1D6C7</span></span>
+ <span><math><mi mathvariant="bold">&#x3B7;</mi></math>=<span>1D6C8</span></span>
+ <span><math><mi mathvariant="bold">&#x3B8;</mi></math>=<span>1D6C9</span></span>
+ <span><math><mi mathvariant="bold">&#x3B9;</mi></math>=<span>1D6CA</span></span>
+ <span><math><mi mathvariant="bold">&#x3BA;</mi></math>=<span>1D6CB</span></span>
+ <span><math><mi mathvariant="bold">&#x3BB;</mi></math>=<span>1D6CC</span></span>
+ <span><math><mi mathvariant="bold">&#x3BC;</mi></math>=<span>1D6CD</span></span><br/>
+ <span><math><mi mathvariant="bold">&#x3BD;</mi></math>=<span>1D6CE</span></span>
+ <span><math><mi mathvariant="bold">&#x3BE;</mi></math>=<span>1D6CF</span></span>
+ <span><math><mi mathvariant="bold">&#x3BF;</mi></math>=<span>1D6D0</span></span>
+ <span><math><mi mathvariant="bold">&#x3C0;</mi></math>=<span>1D6D1</span></span>
+ <span><math><mi mathvariant="bold">&#x3C1;</mi></math>=<span>1D6D2</span></span>
+ <span><math><mi mathvariant="bold">&#x3C2;</mi></math>=<span>1D6D3</span></span>
+ <span><math><mi mathvariant="bold">&#x3C3;</mi></math>=<span>1D6D4</span></span>
+ <span><math><mi mathvariant="bold">&#x3C4;</mi></math>=<span>1D6D5</span></span>
+ <span><math><mi mathvariant="bold">&#x3C5;</mi></math>=<span>1D6D6</span></span>
+ <span><math><mi mathvariant="bold">&#x3C6;</mi></math>=<span>1D6D7</span></span><br/>
+ <span><math><mi mathvariant="bold">&#x3C7;</mi></math>=<span>1D6D8</span></span>
+ <span><math><mi mathvariant="bold">&#x3C8;</mi></math>=<span>1D6D9</span></span>
+ <span><math><mi mathvariant="bold">&#x3C9;</mi></math>=<span>1D6DA</span></span>
+ <span><math><mi mathvariant="bold">&#x3D1;</mi></math>=<span>1D6DD</span></span>
+ <span><math><mi mathvariant="bold">&#x3D5;</mi></math>=<span>1D6DF</span></span>
+ <span><math><mi mathvariant="bold">&#x3D6;</mi></math>=<span>1D6E1</span></span>
+ <span><math><mi mathvariant="bold">&#x3DC;</mi></math>=<span>1D7CA</span></span>
+ <span><math><mi mathvariant="bold">&#x3DD;</mi></math>=<span>1D7CB</span></span>
+ <span><math><mi mathvariant="bold">&#x3F0;</mi></math>=<span>1D6DE</span></span>
+ <span><math><mi mathvariant="bold">&#x3F1;</mi></math>=<span>1D6E0</span></span><br/>
+ <span><math><mi mathvariant="bold">&#x3F4;</mi></math>=<span>1D6B9</span></span>
+ <span><math><mi mathvariant="bold">&#x3F5;</mi></math>=<span>1D6DC</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-double-struck-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-double-struck-ref.html
new file mode 100644
index 00000000000..f13a548b2b3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-double-struck-ref.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant double-struck (reference)</title>
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-double-struck.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi>&#x1EEA1;</mi></math>=<span>1EEA1</span></span>
+ <span><math><mi>&#x1EEB5;</mi></math>=<span>1EEB5</span></span>
+ <span><math><mi>&#x1EEB6;</mi></math>=<span>1EEB6</span></span>
+ <span><math><mi>&#x1EEA2;</mi></math>=<span>1EEA2</span></span>
+ <span><math><mi>&#x1EEA7;</mi></math>=<span>1EEA7</span></span>
+ <span><math><mi>&#x1EEB7;</mi></math>=<span>1EEB7</span></span>
+ <span><math><mi>&#x1EEA3;</mi></math>=<span>1EEA3</span></span>
+ <span><math><mi>&#x1EEB8;</mi></math>=<span>1EEB8</span></span>
+ <span><math><mi>&#x1EEB3;</mi></math>=<span>1EEB3</span></span>
+ <span><math><mi>&#x1EEA6;</mi></math>=<span>1EEA6</span></span><br/>
+ <span><math><mi>&#x1D7DB;</mi></math>=<span>1D7DB</span></span>
+ <span><math><mi>&#x1D7DC;</mi></math>=<span>1D7DC</span></span>
+ <span><math><mi>&#x1D7DD;</mi></math>=<span>1D7DD</span></span>
+ <span><math><mi>&#x1EEB9;</mi></math>=<span>1EEB9</span></span>
+ <span><math><mi>&#x1EEA8;</mi></math>=<span>1EEA8</span></span>
+ <span><math><mi>&#x1EEBA;</mi></math>=<span>1EEBA</span></span>
+ <span><math><mi>&#x1D7E1;</mi></math>=<span>1D7E1</span></span>
+ <span><math><mi>&#x1EEBB;</mi></math>=<span>1EEBB</span></span>
+ <span><math><mi>&#x1EEB0;</mi></math>=<span>1EEB0</span></span>
+ <span><math><mi>&#x1EEB2;</mi></math>=<span>1EEB2</span></span><br/>
+ <span><math><mi>&#x2102;</mi></math>=<span>02102</span></span>
+ <span><math><mi>&#x1EEAB;</mi></math>=<span>1EEAB</span></span>
+ <span><math><mi>&#x1EEAC;</mi></math>=<span>1EEAC</span></span>
+ <span><math><mi>&#x1EEAD;</mi></math>=<span>1EEAD</span></span>
+ <span><math><mi>&#x1D53E;</mi></math>=<span>1D53E</span></span>
+ <span><math><mi>&#x1EEA5;</mi></math>=<span>1EEA5</span></span>
+ <span><math><mi>&#x1D540;</mi></math>=<span>1D540</span></span>
+ <span><math><mi>&#x1EEA9;</mi></math>=<span>1EEA9</span></span>
+ <span><math><mi>&#x1D542;</mi></math>=<span>1D542</span></span>
+ <span><math><mi>&#x1D543;</mi></math>=<span>1D543</span></span><br/>
+ <span><math><mi>&#x1D544;</mi></math>=<span>1D544</span></span>
+ <span><math><mi>&#x2115;</mi></math>=<span>02115</span></span>
+ <span><math><mi>&#x1D546;</mi></math>=<span>1D546</span></span>
+ <span><math><mi>&#x2119;</mi></math>=<span>02119</span></span>
+ <span><math><mi>&#x211A;</mi></math>=<span>0211A</span></span>
+ <span><math><mi>&#x211D;</mi></math>=<span>0211D</span></span>
+ <span><math><mi>&#x1D54A;</mi></math>=<span>1D54A</span></span>
+ <span><math><mi>&#x1D54B;</mi></math>=<span>1D54B</span></span>
+ <span><math><mi>&#x1D54C;</mi></math>=<span>1D54C</span></span>
+ <span><math><mi>&#x1D54D;</mi></math>=<span>1D54D</span></span><br/>
+ <span><math><mi>&#x1D54E;</mi></math>=<span>1D54E</span></span>
+ <span><math><mi>&#x1D54F;</mi></math>=<span>1D54F</span></span>
+ <span><math><mi>&#x1D550;</mi></math>=<span>1D550</span></span>
+ <span><math><mi>&#x2124;</mi></math>=<span>02124</span></span>
+ <span><math><mi>&#x1D552;</mi></math>=<span>1D552</span></span>
+ <span><math><mi>&#x1D553;</mi></math>=<span>1D553</span></span>
+ <span><math><mi>&#x1D554;</mi></math>=<span>1D554</span></span>
+ <span><math><mi>&#x1D555;</mi></math>=<span>1D555</span></span>
+ <span><math><mi>&#x1D556;</mi></math>=<span>1D556</span></span>
+ <span><math><mi>&#x1D557;</mi></math>=<span>1D557</span></span><br/>
+ <span><math><mi>&#x1D558;</mi></math>=<span>1D558</span></span>
+ <span><math><mi>&#x1D559;</mi></math>=<span>1D559</span></span>
+ <span><math><mi>&#x1D55A;</mi></math>=<span>1D55A</span></span>
+ <span><math><mi>&#x1D55B;</mi></math>=<span>1D55B</span></span>
+ <span><math><mi>&#x1D55C;</mi></math>=<span>1D55C</span></span>
+ <span><math><mi>&#x1D55D;</mi></math>=<span>1D55D</span></span>
+ <span><math><mi>&#x1D55E;</mi></math>=<span>1D55E</span></span>
+ <span><math><mi>&#x1D55F;</mi></math>=<span>1D55F</span></span>
+ <span><math><mi>&#x1D560;</mi></math>=<span>1D560</span></span>
+ <span><math><mi>&#x1D561;</mi></math>=<span>1D561</span></span><br/>
+ <span><math><mi>&#x1D562;</mi></math>=<span>1D562</span></span>
+ <span><math><mi>&#x1D563;</mi></math>=<span>1D563</span></span>
+ <span><math><mi>&#x1D564;</mi></math>=<span>1D564</span></span>
+ <span><math><mi>&#x1D565;</mi></math>=<span>1D565</span></span>
+ <span><math><mi>&#x1D566;</mi></math>=<span>1D566</span></span>
+ <span><math><mi>&#x1D567;</mi></math>=<span>1D567</span></span>
+ <span><math><mi>&#x1D568;</mi></math>=<span>1D568</span></span>
+ <span><math><mi>&#x1D569;</mi></math>=<span>1D569</span></span>
+ <span><math><mi>&#x1D56A;</mi></math>=<span>1D56A</span></span>
+ <span><math><mi>&#x1D56B;</mi></math>=<span>1D56B</span></span><br/>
+ <span><math><mi>&#x1D7D8;</mi></math>=<span>1D7D8</span></span>
+ <span><math><mi>&#x1D7D9;</mi></math>=<span>1D7D9</span></span>
+ <span><math><mi>&#x1D7DA;</mi></math>=<span>1D7DA</span></span>
+ <span><math><mi>&#x1EEAE;</mi></math>=<span>1EEAE</span></span>
+ <span><math><mi>&#x1EEB4;</mi></math>=<span>1EEB4</span></span>
+ <span><math><mi>&#x1EEB1;</mi></math>=<span>1EEB1</span></span>
+ <span><math><mi>&#x1D7DE;</mi></math>=<span>1D7DE</span></span>
+ <span><math><mi>&#x1D7DF;</mi></math>=<span>1D7DF</span></span>
+ <span><math><mi>&#x1D7E0;</mi></math>=<span>1D7E0</span></span>
+ <span><math><mi>&#x1EEAF;</mi></math>=<span>1EEAF</span></span><br/>
+ <span><math><mi>&#x1D538;</mi></math>=<span>1D538</span></span>
+ <span><math><mi>&#x1D539;</mi></math>=<span>1D539</span></span>
+ <span><math><mi>&#x1D53B;</mi></math>=<span>1D53B</span></span>
+ <span><math><mi>&#x1D53C;</mi></math>=<span>1D53C</span></span>
+ <span><math><mi>&#x1D53D;</mi></math>=<span>1D53D</span></span>
+ <span><math><mi>&#x210D;</mi></math>=<span>0210D</span></span>
+ <span><math><mi>&#x1D541;</mi></math>=<span>1D541</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-double-struck.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-double-struck.html
new file mode 100644
index 00000000000..e0772d20feb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-double-struck.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant double-struck</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1.tab2"/>
+<link rel="match" href="mathvariant-double-struck-ref.html"/>
+<meta name="assert" content="Verify that a single-char <mi> with a double-struck mathvariant is equivalent to an <mi> with the transformed unicode character.">
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-double-struck.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi mathvariant="double-struck">&#x628;</mi></math>=<span>1EEA1</span></span>
+ <span><math><mi mathvariant="double-struck">&#x62A;</mi></math>=<span>1EEB5</span></span>
+ <span><math><mi mathvariant="double-struck">&#x62B;</mi></math>=<span>1EEB6</span></span>
+ <span><math><mi mathvariant="double-struck">&#x62C;</mi></math>=<span>1EEA2</span></span>
+ <span><math><mi mathvariant="double-struck">&#x62D;</mi></math>=<span>1EEA7</span></span>
+ <span><math><mi mathvariant="double-struck">&#x62E;</mi></math>=<span>1EEB7</span></span>
+ <span><math><mi mathvariant="double-struck">&#x62F;</mi></math>=<span>1EEA3</span></span>
+ <span><math><mi mathvariant="double-struck">&#x630;</mi></math>=<span>1EEB8</span></span>
+ <span><math><mi mathvariant="double-struck">&#x631;</mi></math>=<span>1EEB3</span></span>
+ <span><math><mi mathvariant="double-struck">&#x632;</mi></math>=<span>1EEA6</span></span><br/>
+ <span><math><mi mathvariant="double-struck">&#x33;</mi></math>=<span>1D7DB</span></span>
+ <span><math><mi mathvariant="double-struck">&#x34;</mi></math>=<span>1D7DC</span></span>
+ <span><math><mi mathvariant="double-struck">&#x35;</mi></math>=<span>1D7DD</span></span>
+ <span><math><mi mathvariant="double-struck">&#x636;</mi></math>=<span>1EEB9</span></span>
+ <span><math><mi mathvariant="double-struck">&#x637;</mi></math>=<span>1EEA8</span></span>
+ <span><math><mi mathvariant="double-struck">&#x638;</mi></math>=<span>1EEBA</span></span>
+ <span><math><mi mathvariant="double-struck">&#x39;</mi></math>=<span>1D7E1</span></span>
+ <span><math><mi mathvariant="double-struck">&#x63A;</mi></math>=<span>1EEBB</span></span>
+ <span><math><mi mathvariant="double-struck">&#x641;</mi></math>=<span>1EEB0</span></span>
+ <span><math><mi mathvariant="double-struck">&#x642;</mi></math>=<span>1EEB2</span></span><br/>
+ <span><math><mi mathvariant="double-struck">&#x43;</mi></math>=<span>02102</span></span>
+ <span><math><mi mathvariant="double-struck">&#x644;</mi></math>=<span>1EEAB</span></span>
+ <span><math><mi mathvariant="double-struck">&#x645;</mi></math>=<span>1EEAC</span></span>
+ <span><math><mi mathvariant="double-struck">&#x646;</mi></math>=<span>1EEAD</span></span>
+ <span><math><mi mathvariant="double-struck">&#x47;</mi></math>=<span>1D53E</span></span>
+ <span><math><mi mathvariant="double-struck">&#x648;</mi></math>=<span>1EEA5</span></span>
+ <span><math><mi mathvariant="double-struck">&#x49;</mi></math>=<span>1D540</span></span>
+ <span><math><mi mathvariant="double-struck">&#x64A;</mi></math>=<span>1EEA9</span></span>
+ <span><math><mi mathvariant="double-struck">&#x4B;</mi></math>=<span>1D542</span></span>
+ <span><math><mi mathvariant="double-struck">&#x4C;</mi></math>=<span>1D543</span></span><br/>
+ <span><math><mi mathvariant="double-struck">&#x4D;</mi></math>=<span>1D544</span></span>
+ <span><math><mi mathvariant="double-struck">&#x4E;</mi></math>=<span>02115</span></span>
+ <span><math><mi mathvariant="double-struck">&#x4F;</mi></math>=<span>1D546</span></span>
+ <span><math><mi mathvariant="double-struck">&#x50;</mi></math>=<span>02119</span></span>
+ <span><math><mi mathvariant="double-struck">&#x51;</mi></math>=<span>0211A</span></span>
+ <span><math><mi mathvariant="double-struck">&#x52;</mi></math>=<span>0211D</span></span>
+ <span><math><mi mathvariant="double-struck">&#x53;</mi></math>=<span>1D54A</span></span>
+ <span><math><mi mathvariant="double-struck">&#x54;</mi></math>=<span>1D54B</span></span>
+ <span><math><mi mathvariant="double-struck">&#x55;</mi></math>=<span>1D54C</span></span>
+ <span><math><mi mathvariant="double-struck">&#x56;</mi></math>=<span>1D54D</span></span><br/>
+ <span><math><mi mathvariant="double-struck">&#x57;</mi></math>=<span>1D54E</span></span>
+ <span><math><mi mathvariant="double-struck">&#x58;</mi></math>=<span>1D54F</span></span>
+ <span><math><mi mathvariant="double-struck">&#x59;</mi></math>=<span>1D550</span></span>
+ <span><math><mi mathvariant="double-struck">&#x5A;</mi></math>=<span>02124</span></span>
+ <span><math><mi mathvariant="double-struck">&#x61;</mi></math>=<span>1D552</span></span>
+ <span><math><mi mathvariant="double-struck">&#x62;</mi></math>=<span>1D553</span></span>
+ <span><math><mi mathvariant="double-struck">&#x63;</mi></math>=<span>1D554</span></span>
+ <span><math><mi mathvariant="double-struck">&#x64;</mi></math>=<span>1D555</span></span>
+ <span><math><mi mathvariant="double-struck">&#x65;</mi></math>=<span>1D556</span></span>
+ <span><math><mi mathvariant="double-struck">&#x66;</mi></math>=<span>1D557</span></span><br/>
+ <span><math><mi mathvariant="double-struck">&#x67;</mi></math>=<span>1D558</span></span>
+ <span><math><mi mathvariant="double-struck">&#x68;</mi></math>=<span>1D559</span></span>
+ <span><math><mi mathvariant="double-struck">&#x69;</mi></math>=<span>1D55A</span></span>
+ <span><math><mi mathvariant="double-struck">&#x6A;</mi></math>=<span>1D55B</span></span>
+ <span><math><mi mathvariant="double-struck">&#x6B;</mi></math>=<span>1D55C</span></span>
+ <span><math><mi mathvariant="double-struck">&#x6C;</mi></math>=<span>1D55D</span></span>
+ <span><math><mi mathvariant="double-struck">&#x6D;</mi></math>=<span>1D55E</span></span>
+ <span><math><mi mathvariant="double-struck">&#x6E;</mi></math>=<span>1D55F</span></span>
+ <span><math><mi mathvariant="double-struck">&#x6F;</mi></math>=<span>1D560</span></span>
+ <span><math><mi mathvariant="double-struck">&#x70;</mi></math>=<span>1D561</span></span><br/>
+ <span><math><mi mathvariant="double-struck">&#x71;</mi></math>=<span>1D562</span></span>
+ <span><math><mi mathvariant="double-struck">&#x72;</mi></math>=<span>1D563</span></span>
+ <span><math><mi mathvariant="double-struck">&#x73;</mi></math>=<span>1D564</span></span>
+ <span><math><mi mathvariant="double-struck">&#x74;</mi></math>=<span>1D565</span></span>
+ <span><math><mi mathvariant="double-struck">&#x75;</mi></math>=<span>1D566</span></span>
+ <span><math><mi mathvariant="double-struck">&#x76;</mi></math>=<span>1D567</span></span>
+ <span><math><mi mathvariant="double-struck">&#x77;</mi></math>=<span>1D568</span></span>
+ <span><math><mi mathvariant="double-struck">&#x78;</mi></math>=<span>1D569</span></span>
+ <span><math><mi mathvariant="double-struck">&#x79;</mi></math>=<span>1D56A</span></span>
+ <span><math><mi mathvariant="double-struck">&#x7A;</mi></math>=<span>1D56B</span></span><br/>
+ <span><math><mi mathvariant="double-struck">&#x30;</mi></math>=<span>1D7D8</span></span>
+ <span><math><mi mathvariant="double-struck">&#x31;</mi></math>=<span>1D7D9</span></span>
+ <span><math><mi mathvariant="double-struck">&#x32;</mi></math>=<span>1D7DA</span></span>
+ <span><math><mi mathvariant="double-struck">&#x633;</mi></math>=<span>1EEAE</span></span>
+ <span><math><mi mathvariant="double-struck">&#x634;</mi></math>=<span>1EEB4</span></span>
+ <span><math><mi mathvariant="double-struck">&#x635;</mi></math>=<span>1EEB1</span></span>
+ <span><math><mi mathvariant="double-struck">&#x36;</mi></math>=<span>1D7DE</span></span>
+ <span><math><mi mathvariant="double-struck">&#x37;</mi></math>=<span>1D7DF</span></span>
+ <span><math><mi mathvariant="double-struck">&#x38;</mi></math>=<span>1D7E0</span></span>
+ <span><math><mi mathvariant="double-struck">&#x639;</mi></math>=<span>1EEAF</span></span><br/>
+ <span><math><mi mathvariant="double-struck">&#x41;</mi></math>=<span>1D538</span></span>
+ <span><math><mi mathvariant="double-struck">&#x42;</mi></math>=<span>1D539</span></span>
+ <span><math><mi mathvariant="double-struck">&#x44;</mi></math>=<span>1D53B</span></span>
+ <span><math><mi mathvariant="double-struck">&#x45;</mi></math>=<span>1D53C</span></span>
+ <span><math><mi mathvariant="double-struck">&#x46;</mi></math>=<span>1D53D</span></span>
+ <span><math><mi mathvariant="double-struck">&#x48;</mi></math>=<span>0210D</span></span>
+ <span><math><mi mathvariant="double-struck">&#x4A;</mi></math>=<span>1D541</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-fraktur-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-fraktur-ref.html
new file mode 100644
index 00000000000..6067f21c7f9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-fraktur-ref.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant fraktur (reference)</title>
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-fraktur.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi>&#x1D504;</mi></math>=<span>1D504</span></span>
+ <span><math><mi>&#x1D505;</mi></math>=<span>1D505</span></span>
+ <span><math><mi>&#x212D;</mi></math>=<span>0212D</span></span>
+ <span><math><mi>&#x1D507;</mi></math>=<span>1D507</span></span>
+ <span><math><mi>&#x1D508;</mi></math>=<span>1D508</span></span>
+ <span><math><mi>&#x1D509;</mi></math>=<span>1D509</span></span>
+ <span><math><mi>&#x1D50A;</mi></math>=<span>1D50A</span></span>
+ <span><math><mi>&#x210C;</mi></math>=<span>0210C</span></span>
+ <span><math><mi>&#x2111;</mi></math>=<span>02111</span></span>
+ <span><math><mi>&#x1D50D;</mi></math>=<span>1D50D</span></span><br/>
+ <span><math><mi>&#x1D50E;</mi></math>=<span>1D50E</span></span>
+ <span><math><mi>&#x1D50F;</mi></math>=<span>1D50F</span></span>
+ <span><math><mi>&#x1D510;</mi></math>=<span>1D510</span></span>
+ <span><math><mi>&#x1D511;</mi></math>=<span>1D511</span></span>
+ <span><math><mi>&#x1D512;</mi></math>=<span>1D512</span></span>
+ <span><math><mi>&#x1D513;</mi></math>=<span>1D513</span></span>
+ <span><math><mi>&#x1D514;</mi></math>=<span>1D514</span></span>
+ <span><math><mi>&#x211C;</mi></math>=<span>0211C</span></span>
+ <span><math><mi>&#x1D516;</mi></math>=<span>1D516</span></span>
+ <span><math><mi>&#x1D517;</mi></math>=<span>1D517</span></span><br/>
+ <span><math><mi>&#x1D518;</mi></math>=<span>1D518</span></span>
+ <span><math><mi>&#x1D519;</mi></math>=<span>1D519</span></span>
+ <span><math><mi>&#x1D51A;</mi></math>=<span>1D51A</span></span>
+ <span><math><mi>&#x1D51B;</mi></math>=<span>1D51B</span></span>
+ <span><math><mi>&#x1D51C;</mi></math>=<span>1D51C</span></span>
+ <span><math><mi>&#x2128;</mi></math>=<span>02128</span></span>
+ <span><math><mi>&#x1D51E;</mi></math>=<span>1D51E</span></span>
+ <span><math><mi>&#x1D51F;</mi></math>=<span>1D51F</span></span>
+ <span><math><mi>&#x1D520;</mi></math>=<span>1D520</span></span>
+ <span><math><mi>&#x1D521;</mi></math>=<span>1D521</span></span><br/>
+ <span><math><mi>&#x1D522;</mi></math>=<span>1D522</span></span>
+ <span><math><mi>&#x1D523;</mi></math>=<span>1D523</span></span>
+ <span><math><mi>&#x1D524;</mi></math>=<span>1D524</span></span>
+ <span><math><mi>&#x1D525;</mi></math>=<span>1D525</span></span>
+ <span><math><mi>&#x1D526;</mi></math>=<span>1D526</span></span>
+ <span><math><mi>&#x1D527;</mi></math>=<span>1D527</span></span>
+ <span><math><mi>&#x1D528;</mi></math>=<span>1D528</span></span>
+ <span><math><mi>&#x1D529;</mi></math>=<span>1D529</span></span>
+ <span><math><mi>&#x1D52A;</mi></math>=<span>1D52A</span></span>
+ <span><math><mi>&#x1D52B;</mi></math>=<span>1D52B</span></span><br/>
+ <span><math><mi>&#x1D52C;</mi></math>=<span>1D52C</span></span>
+ <span><math><mi>&#x1D52D;</mi></math>=<span>1D52D</span></span>
+ <span><math><mi>&#x1D52E;</mi></math>=<span>1D52E</span></span>
+ <span><math><mi>&#x1D52F;</mi></math>=<span>1D52F</span></span>
+ <span><math><mi>&#x1D530;</mi></math>=<span>1D530</span></span>
+ <span><math><mi>&#x1D531;</mi></math>=<span>1D531</span></span>
+ <span><math><mi>&#x1D532;</mi></math>=<span>1D532</span></span>
+ <span><math><mi>&#x1D533;</mi></math>=<span>1D533</span></span>
+ <span><math><mi>&#x1D534;</mi></math>=<span>1D534</span></span>
+ <span><math><mi>&#x1D535;</mi></math>=<span>1D535</span></span><br/>
+ <span><math><mi>&#x1D536;</mi></math>=<span>1D536</span></span>
+ <span><math><mi>&#x1D537;</mi></math>=<span>1D537</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-fraktur.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-fraktur.html
new file mode 100644
index 00000000000..a01b0871dcc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-fraktur.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant fraktur</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1.tab2"/>
+<link rel="match" href="mathvariant-fraktur-ref.html"/>
+<meta name="assert" content="Verify that a single-char <mi> with a fraktur mathvariant is equivalent to an <mi> with the transformed unicode character.">
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-fraktur.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi mathvariant="fraktur">&#x41;</mi></math>=<span>1D504</span></span>
+ <span><math><mi mathvariant="fraktur">&#x42;</mi></math>=<span>1D505</span></span>
+ <span><math><mi mathvariant="fraktur">&#x43;</mi></math>=<span>0212D</span></span>
+ <span><math><mi mathvariant="fraktur">&#x44;</mi></math>=<span>1D507</span></span>
+ <span><math><mi mathvariant="fraktur">&#x45;</mi></math>=<span>1D508</span></span>
+ <span><math><mi mathvariant="fraktur">&#x46;</mi></math>=<span>1D509</span></span>
+ <span><math><mi mathvariant="fraktur">&#x47;</mi></math>=<span>1D50A</span></span>
+ <span><math><mi mathvariant="fraktur">&#x48;</mi></math>=<span>0210C</span></span>
+ <span><math><mi mathvariant="fraktur">&#x49;</mi></math>=<span>02111</span></span>
+ <span><math><mi mathvariant="fraktur">&#x4A;</mi></math>=<span>1D50D</span></span><br/>
+ <span><math><mi mathvariant="fraktur">&#x4B;</mi></math>=<span>1D50E</span></span>
+ <span><math><mi mathvariant="fraktur">&#x4C;</mi></math>=<span>1D50F</span></span>
+ <span><math><mi mathvariant="fraktur">&#x4D;</mi></math>=<span>1D510</span></span>
+ <span><math><mi mathvariant="fraktur">&#x4E;</mi></math>=<span>1D511</span></span>
+ <span><math><mi mathvariant="fraktur">&#x4F;</mi></math>=<span>1D512</span></span>
+ <span><math><mi mathvariant="fraktur">&#x50;</mi></math>=<span>1D513</span></span>
+ <span><math><mi mathvariant="fraktur">&#x51;</mi></math>=<span>1D514</span></span>
+ <span><math><mi mathvariant="fraktur">&#x52;</mi></math>=<span>0211C</span></span>
+ <span><math><mi mathvariant="fraktur">&#x53;</mi></math>=<span>1D516</span></span>
+ <span><math><mi mathvariant="fraktur">&#x54;</mi></math>=<span>1D517</span></span><br/>
+ <span><math><mi mathvariant="fraktur">&#x55;</mi></math>=<span>1D518</span></span>
+ <span><math><mi mathvariant="fraktur">&#x56;</mi></math>=<span>1D519</span></span>
+ <span><math><mi mathvariant="fraktur">&#x57;</mi></math>=<span>1D51A</span></span>
+ <span><math><mi mathvariant="fraktur">&#x58;</mi></math>=<span>1D51B</span></span>
+ <span><math><mi mathvariant="fraktur">&#x59;</mi></math>=<span>1D51C</span></span>
+ <span><math><mi mathvariant="fraktur">&#x5A;</mi></math>=<span>02128</span></span>
+ <span><math><mi mathvariant="fraktur">&#x61;</mi></math>=<span>1D51E</span></span>
+ <span><math><mi mathvariant="fraktur">&#x62;</mi></math>=<span>1D51F</span></span>
+ <span><math><mi mathvariant="fraktur">&#x63;</mi></math>=<span>1D520</span></span>
+ <span><math><mi mathvariant="fraktur">&#x64;</mi></math>=<span>1D521</span></span><br/>
+ <span><math><mi mathvariant="fraktur">&#x65;</mi></math>=<span>1D522</span></span>
+ <span><math><mi mathvariant="fraktur">&#x66;</mi></math>=<span>1D523</span></span>
+ <span><math><mi mathvariant="fraktur">&#x67;</mi></math>=<span>1D524</span></span>
+ <span><math><mi mathvariant="fraktur">&#x68;</mi></math>=<span>1D525</span></span>
+ <span><math><mi mathvariant="fraktur">&#x69;</mi></math>=<span>1D526</span></span>
+ <span><math><mi mathvariant="fraktur">&#x6A;</mi></math>=<span>1D527</span></span>
+ <span><math><mi mathvariant="fraktur">&#x6B;</mi></math>=<span>1D528</span></span>
+ <span><math><mi mathvariant="fraktur">&#x6C;</mi></math>=<span>1D529</span></span>
+ <span><math><mi mathvariant="fraktur">&#x6D;</mi></math>=<span>1D52A</span></span>
+ <span><math><mi mathvariant="fraktur">&#x6E;</mi></math>=<span>1D52B</span></span><br/>
+ <span><math><mi mathvariant="fraktur">&#x6F;</mi></math>=<span>1D52C</span></span>
+ <span><math><mi mathvariant="fraktur">&#x70;</mi></math>=<span>1D52D</span></span>
+ <span><math><mi mathvariant="fraktur">&#x71;</mi></math>=<span>1D52E</span></span>
+ <span><math><mi mathvariant="fraktur">&#x72;</mi></math>=<span>1D52F</span></span>
+ <span><math><mi mathvariant="fraktur">&#x73;</mi></math>=<span>1D530</span></span>
+ <span><math><mi mathvariant="fraktur">&#x74;</mi></math>=<span>1D531</span></span>
+ <span><math><mi mathvariant="fraktur">&#x75;</mi></math>=<span>1D532</span></span>
+ <span><math><mi mathvariant="fraktur">&#x76;</mi></math>=<span>1D533</span></span>
+ <span><math><mi mathvariant="fraktur">&#x77;</mi></math>=<span>1D534</span></span>
+ <span><math><mi mathvariant="fraktur">&#x78;</mi></math>=<span>1D535</span></span><br/>
+ <span><math><mi mathvariant="fraktur">&#x79;</mi></math>=<span>1D536</span></span>
+ <span><math><mi mathvariant="fraktur">&#x7A;</mi></math>=<span>1D537</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-initial-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-initial-ref.html
new file mode 100644
index 00000000000..17e5c755faa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-initial-ref.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant initial (reference)</title>
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-initial.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi>&#x1EE30;</mi></math>=<span>1EE30</span></span>
+ <span><math><mi>&#x1EE32;</mi></math>=<span>1EE32</span></span>
+ <span><math><mi>&#x1EE2A;</mi></math>=<span>1EE2A</span></span>
+ <span><math><mi>&#x1EE2B;</mi></math>=<span>1EE2B</span></span>
+ <span><math><mi>&#x1EE2C;</mi></math>=<span>1EE2C</span></span>
+ <span><math><mi>&#x1EE2D;</mi></math>=<span>1EE2D</span></span>
+ <span><math><mi>&#x1EE24;</mi></math>=<span>1EE24</span></span>
+ <span><math><mi>&#x1EE21;</mi></math>=<span>1EE21</span></span>
+ <span><math><mi>&#x1EE29;</mi></math>=<span>1EE29</span></span>
+ <span><math><mi>&#x1EE36;</mi></math>=<span>1EE36</span></span><br/>
+ <span><math><mi>&#x1EE22;</mi></math>=<span>1EE22</span></span>
+ <span><math><mi>&#x1EE27;</mi></math>=<span>1EE27</span></span>
+ <span><math><mi>&#x1EE37;</mi></math>=<span>1EE37</span></span>
+ <span><math><mi>&#x1EE2E;</mi></math>=<span>1EE2E</span></span>
+ <span><math><mi>&#x1EE34;</mi></math>=<span>1EE34</span></span>
+ <span><math><mi>&#x1EE31;</mi></math>=<span>1EE31</span></span>
+ <span><math><mi>&#x1EE39;</mi></math>=<span>1EE39</span></span>
+ <span><math><mi>&#x1EE2F;</mi></math>=<span>1EE2F</span></span>
+ <span><math><mi>&#x1EE3B;</mi></math>=<span>1EE3B</span></span>
+ <span><math><mi>&#x1EE35;</mi></math>=<span>1EE35</span></span><br/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-initial.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-initial.html
new file mode 100644
index 00000000000..674820f6cc4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-initial.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant initial</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1.tab2"/>
+<link rel="match" href="mathvariant-initial-ref.html"/>
+<meta name="assert" content="Verify that a single-char <mi> with a initial mathvariant is equivalent to an <mi> with the transformed unicode character.">
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-initial.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi mathvariant="initial">&#x641;</mi></math>=<span>1EE30</span></span>
+ <span><math><mi mathvariant="initial">&#x642;</mi></math>=<span>1EE32</span></span>
+ <span><math><mi mathvariant="initial">&#x643;</mi></math>=<span>1EE2A</span></span>
+ <span><math><mi mathvariant="initial">&#x644;</mi></math>=<span>1EE2B</span></span>
+ <span><math><mi mathvariant="initial">&#x645;</mi></math>=<span>1EE2C</span></span>
+ <span><math><mi mathvariant="initial">&#x646;</mi></math>=<span>1EE2D</span></span>
+ <span><math><mi mathvariant="initial">&#x647;</mi></math>=<span>1EE24</span></span>
+ <span><math><mi mathvariant="initial">&#x628;</mi></math>=<span>1EE21</span></span>
+ <span><math><mi mathvariant="initial">&#x64A;</mi></math>=<span>1EE29</span></span>
+ <span><math><mi mathvariant="initial">&#x62B;</mi></math>=<span>1EE36</span></span><br/>
+ <span><math><mi mathvariant="initial">&#x62C;</mi></math>=<span>1EE22</span></span>
+ <span><math><mi mathvariant="initial">&#x62D;</mi></math>=<span>1EE27</span></span>
+ <span><math><mi mathvariant="initial">&#x62E;</mi></math>=<span>1EE37</span></span>
+ <span><math><mi mathvariant="initial">&#x633;</mi></math>=<span>1EE2E</span></span>
+ <span><math><mi mathvariant="initial">&#x634;</mi></math>=<span>1EE34</span></span>
+ <span><math><mi mathvariant="initial">&#x635;</mi></math>=<span>1EE31</span></span>
+ <span><math><mi mathvariant="initial">&#x636;</mi></math>=<span>1EE39</span></span>
+ <span><math><mi mathvariant="initial">&#x639;</mi></math>=<span>1EE2F</span></span>
+ <span><math><mi mathvariant="initial">&#x63A;</mi></math>=<span>1EE3B</span></span>
+ <span><math><mi mathvariant="initial">&#x62A;</mi></math>=<span>1EE35</span></span><br/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-italic-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-italic-ref.html
new file mode 100644
index 00000000000..bac033c2603
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-italic-ref.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant italic (reference)</title>
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-italic.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi>&#x1D715;</mi></math>=<span>1D715</span></span>
+ <span><math><mi>&#x1D6FB;</mi></math>=<span>1D6FB</span></span>
+ <span><math><mi>&#x1D6A5;</mi></math>=<span>1D6A5</span></span>
+ <span><math><mi>&#x1D434;</mi></math>=<span>1D434</span></span>
+ <span><math><mi>&#x1D435;</mi></math>=<span>1D435</span></span>
+ <span><math><mi>&#x1D436;</mi></math>=<span>1D436</span></span>
+ <span><math><mi>&#x1D437;</mi></math>=<span>1D437</span></span>
+ <span><math><mi>&#x1D438;</mi></math>=<span>1D438</span></span>
+ <span><math><mi>&#x1D439;</mi></math>=<span>1D439</span></span>
+ <span><math><mi>&#x1D43A;</mi></math>=<span>1D43A</span></span><br/>
+ <span><math><mi>&#x1D43B;</mi></math>=<span>1D43B</span></span>
+ <span><math><mi>&#x1D43C;</mi></math>=<span>1D43C</span></span>
+ <span><math><mi>&#x1D43D;</mi></math>=<span>1D43D</span></span>
+ <span><math><mi>&#x1D43E;</mi></math>=<span>1D43E</span></span>
+ <span><math><mi>&#x1D43F;</mi></math>=<span>1D43F</span></span>
+ <span><math><mi>&#x1D440;</mi></math>=<span>1D440</span></span>
+ <span><math><mi>&#x1D441;</mi></math>=<span>1D441</span></span>
+ <span><math><mi>&#x1D442;</mi></math>=<span>1D442</span></span>
+ <span><math><mi>&#x1D443;</mi></math>=<span>1D443</span></span>
+ <span><math><mi>&#x1D444;</mi></math>=<span>1D444</span></span><br/>
+ <span><math><mi>&#x1D445;</mi></math>=<span>1D445</span></span>
+ <span><math><mi>&#x1D446;</mi></math>=<span>1D446</span></span>
+ <span><math><mi>&#x1D447;</mi></math>=<span>1D447</span></span>
+ <span><math><mi>&#x1D448;</mi></math>=<span>1D448</span></span>
+ <span><math><mi>&#x1D449;</mi></math>=<span>1D449</span></span>
+ <span><math><mi>&#x1D44A;</mi></math>=<span>1D44A</span></span>
+ <span><math><mi>&#x1D44B;</mi></math>=<span>1D44B</span></span>
+ <span><math><mi>&#x1D44C;</mi></math>=<span>1D44C</span></span>
+ <span><math><mi>&#x1D44D;</mi></math>=<span>1D44D</span></span>
+ <span><math><mi>&#x1D44E;</mi></math>=<span>1D44E</span></span><br/>
+ <span><math><mi>&#x1D44F;</mi></math>=<span>1D44F</span></span>
+ <span><math><mi>&#x1D450;</mi></math>=<span>1D450</span></span>
+ <span><math><mi>&#x1D451;</mi></math>=<span>1D451</span></span>
+ <span><math><mi>&#x1D452;</mi></math>=<span>1D452</span></span>
+ <span><math><mi>&#x1D453;</mi></math>=<span>1D453</span></span>
+ <span><math><mi>&#x1D454;</mi></math>=<span>1D454</span></span>
+ <span><math><mi>&#x210E;</mi></math>=<span>0210E</span></span>
+ <span><math><mi>&#x1D456;</mi></math>=<span>1D456</span></span>
+ <span><math><mi>&#x1D457;</mi></math>=<span>1D457</span></span>
+ <span><math><mi>&#x1D458;</mi></math>=<span>1D458</span></span><br/>
+ <span><math><mi>&#x1D459;</mi></math>=<span>1D459</span></span>
+ <span><math><mi>&#x1D45A;</mi></math>=<span>1D45A</span></span>
+ <span><math><mi>&#x1D45B;</mi></math>=<span>1D45B</span></span>
+ <span><math><mi>&#x1D45C;</mi></math>=<span>1D45C</span></span>
+ <span><math><mi>&#x1D45D;</mi></math>=<span>1D45D</span></span>
+ <span><math><mi>&#x1D45E;</mi></math>=<span>1D45E</span></span>
+ <span><math><mi>&#x1D45F;</mi></math>=<span>1D45F</span></span>
+ <span><math><mi>&#x1D460;</mi></math>=<span>1D460</span></span>
+ <span><math><mi>&#x1D461;</mi></math>=<span>1D461</span></span>
+ <span><math><mi>&#x1D462;</mi></math>=<span>1D462</span></span><br/>
+ <span><math><mi>&#x1D463;</mi></math>=<span>1D463</span></span>
+ <span><math><mi>&#x1D464;</mi></math>=<span>1D464</span></span>
+ <span><math><mi>&#x1D465;</mi></math>=<span>1D465</span></span>
+ <span><math><mi>&#x1D466;</mi></math>=<span>1D466</span></span>
+ <span><math><mi>&#x1D467;</mi></math>=<span>1D467</span></span>
+ <span><math><mi>&#x1D6A4;</mi></math>=<span>1D6A4</span></span>
+ <span><math><mi>&#x1D6E2;</mi></math>=<span>1D6E2</span></span>
+ <span><math><mi>&#x1D6E3;</mi></math>=<span>1D6E3</span></span>
+ <span><math><mi>&#x1D6E4;</mi></math>=<span>1D6E4</span></span>
+ <span><math><mi>&#x1D6E5;</mi></math>=<span>1D6E5</span></span><br/>
+ <span><math><mi>&#x1D6E6;</mi></math>=<span>1D6E6</span></span>
+ <span><math><mi>&#x1D6E7;</mi></math>=<span>1D6E7</span></span>
+ <span><math><mi>&#x1D6E8;</mi></math>=<span>1D6E8</span></span>
+ <span><math><mi>&#x1D6E9;</mi></math>=<span>1D6E9</span></span>
+ <span><math><mi>&#x1D6EA;</mi></math>=<span>1D6EA</span></span>
+ <span><math><mi>&#x1D6EB;</mi></math>=<span>1D6EB</span></span>
+ <span><math><mi>&#x1D6EC;</mi></math>=<span>1D6EC</span></span>
+ <span><math><mi>&#x1D6ED;</mi></math>=<span>1D6ED</span></span>
+ <span><math><mi>&#x1D6EE;</mi></math>=<span>1D6EE</span></span>
+ <span><math><mi>&#x1D6EF;</mi></math>=<span>1D6EF</span></span><br/>
+ <span><math><mi>&#x1D6F0;</mi></math>=<span>1D6F0</span></span>
+ <span><math><mi>&#x1D6F1;</mi></math>=<span>1D6F1</span></span>
+ <span><math><mi>&#x1D6F2;</mi></math>=<span>1D6F2</span></span>
+ <span><math><mi>&#x1D6F4;</mi></math>=<span>1D6F4</span></span>
+ <span><math><mi>&#x1D6F5;</mi></math>=<span>1D6F5</span></span>
+ <span><math><mi>&#x1D6F6;</mi></math>=<span>1D6F6</span></span>
+ <span><math><mi>&#x1D6F7;</mi></math>=<span>1D6F7</span></span>
+ <span><math><mi>&#x1D6F8;</mi></math>=<span>1D6F8</span></span>
+ <span><math><mi>&#x1D6F9;</mi></math>=<span>1D6F9</span></span>
+ <span><math><mi>&#x1D6FA;</mi></math>=<span>1D6FA</span></span><br/>
+ <span><math><mi>&#x1D6FC;</mi></math>=<span>1D6FC</span></span>
+ <span><math><mi>&#x1D6FD;</mi></math>=<span>1D6FD</span></span>
+ <span><math><mi>&#x1D6FE;</mi></math>=<span>1D6FE</span></span>
+ <span><math><mi>&#x1D6FF;</mi></math>=<span>1D6FF</span></span>
+ <span><math><mi>&#x1D700;</mi></math>=<span>1D700</span></span>
+ <span><math><mi>&#x1D701;</mi></math>=<span>1D701</span></span>
+ <span><math><mi>&#x1D702;</mi></math>=<span>1D702</span></span>
+ <span><math><mi>&#x1D703;</mi></math>=<span>1D703</span></span>
+ <span><math><mi>&#x1D704;</mi></math>=<span>1D704</span></span>
+ <span><math><mi>&#x1D705;</mi></math>=<span>1D705</span></span><br/>
+ <span><math><mi>&#x1D706;</mi></math>=<span>1D706</span></span>
+ <span><math><mi>&#x1D707;</mi></math>=<span>1D707</span></span>
+ <span><math><mi>&#x1D708;</mi></math>=<span>1D708</span></span>
+ <span><math><mi>&#x1D709;</mi></math>=<span>1D709</span></span>
+ <span><math><mi>&#x1D70A;</mi></math>=<span>1D70A</span></span>
+ <span><math><mi>&#x1D70B;</mi></math>=<span>1D70B</span></span>
+ <span><math><mi>&#x1D70C;</mi></math>=<span>1D70C</span></span>
+ <span><math><mi>&#x1D70D;</mi></math>=<span>1D70D</span></span>
+ <span><math><mi>&#x1D70E;</mi></math>=<span>1D70E</span></span>
+ <span><math><mi>&#x1D70F;</mi></math>=<span>1D70F</span></span><br/>
+ <span><math><mi>&#x1D710;</mi></math>=<span>1D710</span></span>
+ <span><math><mi>&#x1D711;</mi></math>=<span>1D711</span></span>
+ <span><math><mi>&#x1D712;</mi></math>=<span>1D712</span></span>
+ <span><math><mi>&#x1D713;</mi></math>=<span>1D713</span></span>
+ <span><math><mi>&#x1D714;</mi></math>=<span>1D714</span></span>
+ <span><math><mi>&#x1D717;</mi></math>=<span>1D717</span></span>
+ <span><math><mi>&#x1D719;</mi></math>=<span>1D719</span></span>
+ <span><math><mi>&#x1D71B;</mi></math>=<span>1D71B</span></span>
+ <span><math><mi>&#x1D718;</mi></math>=<span>1D718</span></span>
+ <span><math><mi>&#x1D71A;</mi></math>=<span>1D71A</span></span><br/>
+ <span><math><mi>&#x1D6F3;</mi></math>=<span>1D6F3</span></span>
+ <span><math><mi>&#x1D716;</mi></math>=<span>1D716</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-italic.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-italic.html
new file mode 100644
index 00000000000..c3386b8bcd3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-italic.html
@@ -0,0 +1,142 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant italic</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1.tab2"/>
+<link rel="match" href="mathvariant-italic-ref.html"/>
+<meta name="assert" content="Verify that a single-char <mi> with a italic mathvariant is equivalent to an <mi> with the transformed unicode character.">
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-italic.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi mathvariant="italic">&#x2202;</mi></math>=<span>1D715</span></span>
+ <span><math><mi mathvariant="italic">&#x2207;</mi></math>=<span>1D6FB</span></span>
+ <span><math><mi mathvariant="italic">&#x237;</mi></math>=<span>1D6A5</span></span>
+ <span><math><mi mathvariant="italic">&#x41;</mi></math>=<span>1D434</span></span>
+ <span><math><mi mathvariant="italic">&#x42;</mi></math>=<span>1D435</span></span>
+ <span><math><mi mathvariant="italic">&#x43;</mi></math>=<span>1D436</span></span>
+ <span><math><mi mathvariant="italic">&#x44;</mi></math>=<span>1D437</span></span>
+ <span><math><mi mathvariant="italic">&#x45;</mi></math>=<span>1D438</span></span>
+ <span><math><mi mathvariant="italic">&#x46;</mi></math>=<span>1D439</span></span>
+ <span><math><mi mathvariant="italic">&#x47;</mi></math>=<span>1D43A</span></span><br/>
+ <span><math><mi mathvariant="italic">&#x48;</mi></math>=<span>1D43B</span></span>
+ <span><math><mi mathvariant="italic">&#x49;</mi></math>=<span>1D43C</span></span>
+ <span><math><mi mathvariant="italic">&#x4A;</mi></math>=<span>1D43D</span></span>
+ <span><math><mi mathvariant="italic">&#x4B;</mi></math>=<span>1D43E</span></span>
+ <span><math><mi mathvariant="italic">&#x4C;</mi></math>=<span>1D43F</span></span>
+ <span><math><mi mathvariant="italic">&#x4D;</mi></math>=<span>1D440</span></span>
+ <span><math><mi mathvariant="italic">&#x4E;</mi></math>=<span>1D441</span></span>
+ <span><math><mi mathvariant="italic">&#x4F;</mi></math>=<span>1D442</span></span>
+ <span><math><mi mathvariant="italic">&#x50;</mi></math>=<span>1D443</span></span>
+ <span><math><mi mathvariant="italic">&#x51;</mi></math>=<span>1D444</span></span><br/>
+ <span><math><mi mathvariant="italic">&#x52;</mi></math>=<span>1D445</span></span>
+ <span><math><mi mathvariant="italic">&#x53;</mi></math>=<span>1D446</span></span>
+ <span><math><mi mathvariant="italic">&#x54;</mi></math>=<span>1D447</span></span>
+ <span><math><mi mathvariant="italic">&#x55;</mi></math>=<span>1D448</span></span>
+ <span><math><mi mathvariant="italic">&#x56;</mi></math>=<span>1D449</span></span>
+ <span><math><mi mathvariant="italic">&#x57;</mi></math>=<span>1D44A</span></span>
+ <span><math><mi mathvariant="italic">&#x58;</mi></math>=<span>1D44B</span></span>
+ <span><math><mi mathvariant="italic">&#x59;</mi></math>=<span>1D44C</span></span>
+ <span><math><mi mathvariant="italic">&#x5A;</mi></math>=<span>1D44D</span></span>
+ <span><math><mi mathvariant="italic">&#x61;</mi></math>=<span>1D44E</span></span><br/>
+ <span><math><mi mathvariant="italic">&#x62;</mi></math>=<span>1D44F</span></span>
+ <span><math><mi mathvariant="italic">&#x63;</mi></math>=<span>1D450</span></span>
+ <span><math><mi mathvariant="italic">&#x64;</mi></math>=<span>1D451</span></span>
+ <span><math><mi mathvariant="italic">&#x65;</mi></math>=<span>1D452</span></span>
+ <span><math><mi mathvariant="italic">&#x66;</mi></math>=<span>1D453</span></span>
+ <span><math><mi mathvariant="italic">&#x67;</mi></math>=<span>1D454</span></span>
+ <span><math><mi mathvariant="italic">&#x68;</mi></math>=<span>0210E</span></span>
+ <span><math><mi mathvariant="italic">&#x69;</mi></math>=<span>1D456</span></span>
+ <span><math><mi mathvariant="italic">&#x6A;</mi></math>=<span>1D457</span></span>
+ <span><math><mi mathvariant="italic">&#x6B;</mi></math>=<span>1D458</span></span><br/>
+ <span><math><mi mathvariant="italic">&#x6C;</mi></math>=<span>1D459</span></span>
+ <span><math><mi mathvariant="italic">&#x6D;</mi></math>=<span>1D45A</span></span>
+ <span><math><mi mathvariant="italic">&#x6E;</mi></math>=<span>1D45B</span></span>
+ <span><math><mi mathvariant="italic">&#x6F;</mi></math>=<span>1D45C</span></span>
+ <span><math><mi mathvariant="italic">&#x70;</mi></math>=<span>1D45D</span></span>
+ <span><math><mi mathvariant="italic">&#x71;</mi></math>=<span>1D45E</span></span>
+ <span><math><mi mathvariant="italic">&#x72;</mi></math>=<span>1D45F</span></span>
+ <span><math><mi mathvariant="italic">&#x73;</mi></math>=<span>1D460</span></span>
+ <span><math><mi mathvariant="italic">&#x74;</mi></math>=<span>1D461</span></span>
+ <span><math><mi mathvariant="italic">&#x75;</mi></math>=<span>1D462</span></span><br/>
+ <span><math><mi mathvariant="italic">&#x76;</mi></math>=<span>1D463</span></span>
+ <span><math><mi mathvariant="italic">&#x77;</mi></math>=<span>1D464</span></span>
+ <span><math><mi mathvariant="italic">&#x78;</mi></math>=<span>1D465</span></span>
+ <span><math><mi mathvariant="italic">&#x79;</mi></math>=<span>1D466</span></span>
+ <span><math><mi mathvariant="italic">&#x7A;</mi></math>=<span>1D467</span></span>
+ <span><math><mi mathvariant="italic">&#x131;</mi></math>=<span>1D6A4</span></span>
+ <span><math><mi mathvariant="italic">&#x391;</mi></math>=<span>1D6E2</span></span>
+ <span><math><mi mathvariant="italic">&#x392;</mi></math>=<span>1D6E3</span></span>
+ <span><math><mi mathvariant="italic">&#x393;</mi></math>=<span>1D6E4</span></span>
+ <span><math><mi mathvariant="italic">&#x394;</mi></math>=<span>1D6E5</span></span><br/>
+ <span><math><mi mathvariant="italic">&#x395;</mi></math>=<span>1D6E6</span></span>
+ <span><math><mi mathvariant="italic">&#x396;</mi></math>=<span>1D6E7</span></span>
+ <span><math><mi mathvariant="italic">&#x397;</mi></math>=<span>1D6E8</span></span>
+ <span><math><mi mathvariant="italic">&#x398;</mi></math>=<span>1D6E9</span></span>
+ <span><math><mi mathvariant="italic">&#x399;</mi></math>=<span>1D6EA</span></span>
+ <span><math><mi mathvariant="italic">&#x39A;</mi></math>=<span>1D6EB</span></span>
+ <span><math><mi mathvariant="italic">&#x39B;</mi></math>=<span>1D6EC</span></span>
+ <span><math><mi mathvariant="italic">&#x39C;</mi></math>=<span>1D6ED</span></span>
+ <span><math><mi mathvariant="italic">&#x39D;</mi></math>=<span>1D6EE</span></span>
+ <span><math><mi mathvariant="italic">&#x39E;</mi></math>=<span>1D6EF</span></span><br/>
+ <span><math><mi mathvariant="italic">&#x39F;</mi></math>=<span>1D6F0</span></span>
+ <span><math><mi mathvariant="italic">&#x3A0;</mi></math>=<span>1D6F1</span></span>
+ <span><math><mi mathvariant="italic">&#x3A1;</mi></math>=<span>1D6F2</span></span>
+ <span><math><mi mathvariant="italic">&#x3A3;</mi></math>=<span>1D6F4</span></span>
+ <span><math><mi mathvariant="italic">&#x3A4;</mi></math>=<span>1D6F5</span></span>
+ <span><math><mi mathvariant="italic">&#x3A5;</mi></math>=<span>1D6F6</span></span>
+ <span><math><mi mathvariant="italic">&#x3A6;</mi></math>=<span>1D6F7</span></span>
+ <span><math><mi mathvariant="italic">&#x3A7;</mi></math>=<span>1D6F8</span></span>
+ <span><math><mi mathvariant="italic">&#x3A8;</mi></math>=<span>1D6F9</span></span>
+ <span><math><mi mathvariant="italic">&#x3A9;</mi></math>=<span>1D6FA</span></span><br/>
+ <span><math><mi mathvariant="italic">&#x3B1;</mi></math>=<span>1D6FC</span></span>
+ <span><math><mi mathvariant="italic">&#x3B2;</mi></math>=<span>1D6FD</span></span>
+ <span><math><mi mathvariant="italic">&#x3B3;</mi></math>=<span>1D6FE</span></span>
+ <span><math><mi mathvariant="italic">&#x3B4;</mi></math>=<span>1D6FF</span></span>
+ <span><math><mi mathvariant="italic">&#x3B5;</mi></math>=<span>1D700</span></span>
+ <span><math><mi mathvariant="italic">&#x3B6;</mi></math>=<span>1D701</span></span>
+ <span><math><mi mathvariant="italic">&#x3B7;</mi></math>=<span>1D702</span></span>
+ <span><math><mi mathvariant="italic">&#x3B8;</mi></math>=<span>1D703</span></span>
+ <span><math><mi mathvariant="italic">&#x3B9;</mi></math>=<span>1D704</span></span>
+ <span><math><mi mathvariant="italic">&#x3BA;</mi></math>=<span>1D705</span></span><br/>
+ <span><math><mi mathvariant="italic">&#x3BB;</mi></math>=<span>1D706</span></span>
+ <span><math><mi mathvariant="italic">&#x3BC;</mi></math>=<span>1D707</span></span>
+ <span><math><mi mathvariant="italic">&#x3BD;</mi></math>=<span>1D708</span></span>
+ <span><math><mi mathvariant="italic">&#x3BE;</mi></math>=<span>1D709</span></span>
+ <span><math><mi mathvariant="italic">&#x3BF;</mi></math>=<span>1D70A</span></span>
+ <span><math><mi mathvariant="italic">&#x3C0;</mi></math>=<span>1D70B</span></span>
+ <span><math><mi mathvariant="italic">&#x3C1;</mi></math>=<span>1D70C</span></span>
+ <span><math><mi mathvariant="italic">&#x3C2;</mi></math>=<span>1D70D</span></span>
+ <span><math><mi mathvariant="italic">&#x3C3;</mi></math>=<span>1D70E</span></span>
+ <span><math><mi mathvariant="italic">&#x3C4;</mi></math>=<span>1D70F</span></span><br/>
+ <span><math><mi mathvariant="italic">&#x3C5;</mi></math>=<span>1D710</span></span>
+ <span><math><mi mathvariant="italic">&#x3C6;</mi></math>=<span>1D711</span></span>
+ <span><math><mi mathvariant="italic">&#x3C7;</mi></math>=<span>1D712</span></span>
+ <span><math><mi mathvariant="italic">&#x3C8;</mi></math>=<span>1D713</span></span>
+ <span><math><mi mathvariant="italic">&#x3C9;</mi></math>=<span>1D714</span></span>
+ <span><math><mi mathvariant="italic">&#x3D1;</mi></math>=<span>1D717</span></span>
+ <span><math><mi mathvariant="italic">&#x3D5;</mi></math>=<span>1D719</span></span>
+ <span><math><mi mathvariant="italic">&#x3D6;</mi></math>=<span>1D71B</span></span>
+ <span><math><mi mathvariant="italic">&#x3F0;</mi></math>=<span>1D718</span></span>
+ <span><math><mi mathvariant="italic">&#x3F1;</mi></math>=<span>1D71A</span></span><br/>
+ <span><math><mi mathvariant="italic">&#x3F4;</mi></math>=<span>1D6F3</span></span>
+ <span><math><mi mathvariant="italic">&#x3F5;</mi></math>=<span>1D716</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-looped-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-looped-ref.html
new file mode 100644
index 00000000000..47c852073a9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-looped-ref.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant looped (reference)</title>
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-looped.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi>&#x1EE80;</mi></math>=<span>1EE80</span></span>
+ <span><math><mi>&#x1EE81;</mi></math>=<span>1EE81</span></span>
+ <span><math><mi>&#x1EE95;</mi></math>=<span>1EE95</span></span>
+ <span><math><mi>&#x1EE96;</mi></math>=<span>1EE96</span></span>
+ <span><math><mi>&#x1EE82;</mi></math>=<span>1EE82</span></span>
+ <span><math><mi>&#x1EE87;</mi></math>=<span>1EE87</span></span>
+ <span><math><mi>&#x1EE97;</mi></math>=<span>1EE97</span></span>
+ <span><math><mi>&#x1EE83;</mi></math>=<span>1EE83</span></span>
+ <span><math><mi>&#x1EE98;</mi></math>=<span>1EE98</span></span>
+ <span><math><mi>&#x1EE93;</mi></math>=<span>1EE93</span></span><br/>
+ <span><math><mi>&#x1EE86;</mi></math>=<span>1EE86</span></span>
+ <span><math><mi>&#x1EE8E;</mi></math>=<span>1EE8E</span></span>
+ <span><math><mi>&#x1EE94;</mi></math>=<span>1EE94</span></span>
+ <span><math><mi>&#x1EE91;</mi></math>=<span>1EE91</span></span>
+ <span><math><mi>&#x1EE99;</mi></math>=<span>1EE99</span></span>
+ <span><math><mi>&#x1EE88;</mi></math>=<span>1EE88</span></span>
+ <span><math><mi>&#x1EE9A;</mi></math>=<span>1EE9A</span></span>
+ <span><math><mi>&#x1EE8F;</mi></math>=<span>1EE8F</span></span>
+ <span><math><mi>&#x1EE9B;</mi></math>=<span>1EE9B</span></span>
+ <span><math><mi>&#x1EE90;</mi></math>=<span>1EE90</span></span><br/>
+ <span><math><mi>&#x1EE92;</mi></math>=<span>1EE92</span></span>
+ <span><math><mi>&#x1EE8B;</mi></math>=<span>1EE8B</span></span>
+ <span><math><mi>&#x1EE8C;</mi></math>=<span>1EE8C</span></span>
+ <span><math><mi>&#x1EE8D;</mi></math>=<span>1EE8D</span></span>
+ <span><math><mi>&#x1EE84;</mi></math>=<span>1EE84</span></span>
+ <span><math><mi>&#x1EE85;</mi></math>=<span>1EE85</span></span>
+ <span><math><mi>&#x1EE89;</mi></math>=<span>1EE89</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-looped.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-looped.html
new file mode 100644
index 00000000000..42926690fa5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-looped.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant looped</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1.tab2"/>
+<link rel="match" href="mathvariant-looped-ref.html"/>
+<meta name="assert" content="Verify that a single-char <mi> with a looped mathvariant is equivalent to an <mi> with the transformed unicode character.">
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-looped.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi mathvariant="looped">&#x627;</mi></math>=<span>1EE80</span></span>
+ <span><math><mi mathvariant="looped">&#x628;</mi></math>=<span>1EE81</span></span>
+ <span><math><mi mathvariant="looped">&#x62A;</mi></math>=<span>1EE95</span></span>
+ <span><math><mi mathvariant="looped">&#x62B;</mi></math>=<span>1EE96</span></span>
+ <span><math><mi mathvariant="looped">&#x62C;</mi></math>=<span>1EE82</span></span>
+ <span><math><mi mathvariant="looped">&#x62D;</mi></math>=<span>1EE87</span></span>
+ <span><math><mi mathvariant="looped">&#x62E;</mi></math>=<span>1EE97</span></span>
+ <span><math><mi mathvariant="looped">&#x62F;</mi></math>=<span>1EE83</span></span>
+ <span><math><mi mathvariant="looped">&#x630;</mi></math>=<span>1EE98</span></span>
+ <span><math><mi mathvariant="looped">&#x631;</mi></math>=<span>1EE93</span></span><br/>
+ <span><math><mi mathvariant="looped">&#x632;</mi></math>=<span>1EE86</span></span>
+ <span><math><mi mathvariant="looped">&#x633;</mi></math>=<span>1EE8E</span></span>
+ <span><math><mi mathvariant="looped">&#x634;</mi></math>=<span>1EE94</span></span>
+ <span><math><mi mathvariant="looped">&#x635;</mi></math>=<span>1EE91</span></span>
+ <span><math><mi mathvariant="looped">&#x636;</mi></math>=<span>1EE99</span></span>
+ <span><math><mi mathvariant="looped">&#x637;</mi></math>=<span>1EE88</span></span>
+ <span><math><mi mathvariant="looped">&#x638;</mi></math>=<span>1EE9A</span></span>
+ <span><math><mi mathvariant="looped">&#x639;</mi></math>=<span>1EE8F</span></span>
+ <span><math><mi mathvariant="looped">&#x63A;</mi></math>=<span>1EE9B</span></span>
+ <span><math><mi mathvariant="looped">&#x641;</mi></math>=<span>1EE90</span></span><br/>
+ <span><math><mi mathvariant="looped">&#x642;</mi></math>=<span>1EE92</span></span>
+ <span><math><mi mathvariant="looped">&#x644;</mi></math>=<span>1EE8B</span></span>
+ <span><math><mi mathvariant="looped">&#x645;</mi></math>=<span>1EE8C</span></span>
+ <span><math><mi mathvariant="looped">&#x646;</mi></math>=<span>1EE8D</span></span>
+ <span><math><mi mathvariant="looped">&#x647;</mi></math>=<span>1EE84</span></span>
+ <span><math><mi mathvariant="looped">&#x648;</mi></math>=<span>1EE85</span></span>
+ <span><math><mi mathvariant="looped">&#x64A;</mi></math>=<span>1EE89</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-monospace-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-monospace-ref.html
new file mode 100644
index 00000000000..713ce69d8da
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-monospace-ref.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant monospace (reference)</title>
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-monospace.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi>&#x1D7F6;</mi></math>=<span>1D7F6</span></span>
+ <span><math><mi>&#x1D7F7;</mi></math>=<span>1D7F7</span></span>
+ <span><math><mi>&#x1D7F8;</mi></math>=<span>1D7F8</span></span>
+ <span><math><mi>&#x1D7F9;</mi></math>=<span>1D7F9</span></span>
+ <span><math><mi>&#x1D7FA;</mi></math>=<span>1D7FA</span></span>
+ <span><math><mi>&#x1D7FB;</mi></math>=<span>1D7FB</span></span>
+ <span><math><mi>&#x1D7FC;</mi></math>=<span>1D7FC</span></span>
+ <span><math><mi>&#x1D7FD;</mi></math>=<span>1D7FD</span></span>
+ <span><math><mi>&#x1D7FE;</mi></math>=<span>1D7FE</span></span>
+ <span><math><mi>&#x1D7FF;</mi></math>=<span>1D7FF</span></span><br/>
+ <span><math><mi>&#x1D670;</mi></math>=<span>1D670</span></span>
+ <span><math><mi>&#x1D671;</mi></math>=<span>1D671</span></span>
+ <span><math><mi>&#x1D672;</mi></math>=<span>1D672</span></span>
+ <span><math><mi>&#x1D673;</mi></math>=<span>1D673</span></span>
+ <span><math><mi>&#x1D674;</mi></math>=<span>1D674</span></span>
+ <span><math><mi>&#x1D675;</mi></math>=<span>1D675</span></span>
+ <span><math><mi>&#x1D676;</mi></math>=<span>1D676</span></span>
+ <span><math><mi>&#x1D677;</mi></math>=<span>1D677</span></span>
+ <span><math><mi>&#x1D678;</mi></math>=<span>1D678</span></span>
+ <span><math><mi>&#x1D679;</mi></math>=<span>1D679</span></span><br/>
+ <span><math><mi>&#x1D67A;</mi></math>=<span>1D67A</span></span>
+ <span><math><mi>&#x1D67B;</mi></math>=<span>1D67B</span></span>
+ <span><math><mi>&#x1D67C;</mi></math>=<span>1D67C</span></span>
+ <span><math><mi>&#x1D67D;</mi></math>=<span>1D67D</span></span>
+ <span><math><mi>&#x1D67E;</mi></math>=<span>1D67E</span></span>
+ <span><math><mi>&#x1D67F;</mi></math>=<span>1D67F</span></span>
+ <span><math><mi>&#x1D680;</mi></math>=<span>1D680</span></span>
+ <span><math><mi>&#x1D681;</mi></math>=<span>1D681</span></span>
+ <span><math><mi>&#x1D682;</mi></math>=<span>1D682</span></span>
+ <span><math><mi>&#x1D683;</mi></math>=<span>1D683</span></span><br/>
+ <span><math><mi>&#x1D684;</mi></math>=<span>1D684</span></span>
+ <span><math><mi>&#x1D685;</mi></math>=<span>1D685</span></span>
+ <span><math><mi>&#x1D686;</mi></math>=<span>1D686</span></span>
+ <span><math><mi>&#x1D687;</mi></math>=<span>1D687</span></span>
+ <span><math><mi>&#x1D688;</mi></math>=<span>1D688</span></span>
+ <span><math><mi>&#x1D689;</mi></math>=<span>1D689</span></span>
+ <span><math><mi>&#x1D68A;</mi></math>=<span>1D68A</span></span>
+ <span><math><mi>&#x1D68B;</mi></math>=<span>1D68B</span></span>
+ <span><math><mi>&#x1D68C;</mi></math>=<span>1D68C</span></span>
+ <span><math><mi>&#x1D68D;</mi></math>=<span>1D68D</span></span><br/>
+ <span><math><mi>&#x1D68E;</mi></math>=<span>1D68E</span></span>
+ <span><math><mi>&#x1D68F;</mi></math>=<span>1D68F</span></span>
+ <span><math><mi>&#x1D690;</mi></math>=<span>1D690</span></span>
+ <span><math><mi>&#x1D691;</mi></math>=<span>1D691</span></span>
+ <span><math><mi>&#x1D692;</mi></math>=<span>1D692</span></span>
+ <span><math><mi>&#x1D693;</mi></math>=<span>1D693</span></span>
+ <span><math><mi>&#x1D694;</mi></math>=<span>1D694</span></span>
+ <span><math><mi>&#x1D695;</mi></math>=<span>1D695</span></span>
+ <span><math><mi>&#x1D696;</mi></math>=<span>1D696</span></span>
+ <span><math><mi>&#x1D697;</mi></math>=<span>1D697</span></span><br/>
+ <span><math><mi>&#x1D698;</mi></math>=<span>1D698</span></span>
+ <span><math><mi>&#x1D699;</mi></math>=<span>1D699</span></span>
+ <span><math><mi>&#x1D69A;</mi></math>=<span>1D69A</span></span>
+ <span><math><mi>&#x1D69B;</mi></math>=<span>1D69B</span></span>
+ <span><math><mi>&#x1D69C;</mi></math>=<span>1D69C</span></span>
+ <span><math><mi>&#x1D69D;</mi></math>=<span>1D69D</span></span>
+ <span><math><mi>&#x1D69E;</mi></math>=<span>1D69E</span></span>
+ <span><math><mi>&#x1D69F;</mi></math>=<span>1D69F</span></span>
+ <span><math><mi>&#x1D6A0;</mi></math>=<span>1D6A0</span></span>
+ <span><math><mi>&#x1D6A1;</mi></math>=<span>1D6A1</span></span><br/>
+ <span><math><mi>&#x1D6A2;</mi></math>=<span>1D6A2</span></span>
+ <span><math><mi>&#x1D6A3;</mi></math>=<span>1D6A3</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-monospace.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-monospace.html
new file mode 100644
index 00000000000..8a01d1a8c21
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-monospace.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant monospace</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1.tab2"/>
+<link rel="match" href="mathvariant-monospace-ref.html"/>
+<meta name="assert" content="Verify that a single-char <mi> with a monospace mathvariant is equivalent to an <mi> with the transformed unicode character.">
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-monospace.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi mathvariant="monospace">&#x30;</mi></math>=<span>1D7F6</span></span>
+ <span><math><mi mathvariant="monospace">&#x31;</mi></math>=<span>1D7F7</span></span>
+ <span><math><mi mathvariant="monospace">&#x32;</mi></math>=<span>1D7F8</span></span>
+ <span><math><mi mathvariant="monospace">&#x33;</mi></math>=<span>1D7F9</span></span>
+ <span><math><mi mathvariant="monospace">&#x34;</mi></math>=<span>1D7FA</span></span>
+ <span><math><mi mathvariant="monospace">&#x35;</mi></math>=<span>1D7FB</span></span>
+ <span><math><mi mathvariant="monospace">&#x36;</mi></math>=<span>1D7FC</span></span>
+ <span><math><mi mathvariant="monospace">&#x37;</mi></math>=<span>1D7FD</span></span>
+ <span><math><mi mathvariant="monospace">&#x38;</mi></math>=<span>1D7FE</span></span>
+ <span><math><mi mathvariant="monospace">&#x39;</mi></math>=<span>1D7FF</span></span><br/>
+ <span><math><mi mathvariant="monospace">&#x41;</mi></math>=<span>1D670</span></span>
+ <span><math><mi mathvariant="monospace">&#x42;</mi></math>=<span>1D671</span></span>
+ <span><math><mi mathvariant="monospace">&#x43;</mi></math>=<span>1D672</span></span>
+ <span><math><mi mathvariant="monospace">&#x44;</mi></math>=<span>1D673</span></span>
+ <span><math><mi mathvariant="monospace">&#x45;</mi></math>=<span>1D674</span></span>
+ <span><math><mi mathvariant="monospace">&#x46;</mi></math>=<span>1D675</span></span>
+ <span><math><mi mathvariant="monospace">&#x47;</mi></math>=<span>1D676</span></span>
+ <span><math><mi mathvariant="monospace">&#x48;</mi></math>=<span>1D677</span></span>
+ <span><math><mi mathvariant="monospace">&#x49;</mi></math>=<span>1D678</span></span>
+ <span><math><mi mathvariant="monospace">&#x4A;</mi></math>=<span>1D679</span></span><br/>
+ <span><math><mi mathvariant="monospace">&#x4B;</mi></math>=<span>1D67A</span></span>
+ <span><math><mi mathvariant="monospace">&#x4C;</mi></math>=<span>1D67B</span></span>
+ <span><math><mi mathvariant="monospace">&#x4D;</mi></math>=<span>1D67C</span></span>
+ <span><math><mi mathvariant="monospace">&#x4E;</mi></math>=<span>1D67D</span></span>
+ <span><math><mi mathvariant="monospace">&#x4F;</mi></math>=<span>1D67E</span></span>
+ <span><math><mi mathvariant="monospace">&#x50;</mi></math>=<span>1D67F</span></span>
+ <span><math><mi mathvariant="monospace">&#x51;</mi></math>=<span>1D680</span></span>
+ <span><math><mi mathvariant="monospace">&#x52;</mi></math>=<span>1D681</span></span>
+ <span><math><mi mathvariant="monospace">&#x53;</mi></math>=<span>1D682</span></span>
+ <span><math><mi mathvariant="monospace">&#x54;</mi></math>=<span>1D683</span></span><br/>
+ <span><math><mi mathvariant="monospace">&#x55;</mi></math>=<span>1D684</span></span>
+ <span><math><mi mathvariant="monospace">&#x56;</mi></math>=<span>1D685</span></span>
+ <span><math><mi mathvariant="monospace">&#x57;</mi></math>=<span>1D686</span></span>
+ <span><math><mi mathvariant="monospace">&#x58;</mi></math>=<span>1D687</span></span>
+ <span><math><mi mathvariant="monospace">&#x59;</mi></math>=<span>1D688</span></span>
+ <span><math><mi mathvariant="monospace">&#x5A;</mi></math>=<span>1D689</span></span>
+ <span><math><mi mathvariant="monospace">&#x61;</mi></math>=<span>1D68A</span></span>
+ <span><math><mi mathvariant="monospace">&#x62;</mi></math>=<span>1D68B</span></span>
+ <span><math><mi mathvariant="monospace">&#x63;</mi></math>=<span>1D68C</span></span>
+ <span><math><mi mathvariant="monospace">&#x64;</mi></math>=<span>1D68D</span></span><br/>
+ <span><math><mi mathvariant="monospace">&#x65;</mi></math>=<span>1D68E</span></span>
+ <span><math><mi mathvariant="monospace">&#x66;</mi></math>=<span>1D68F</span></span>
+ <span><math><mi mathvariant="monospace">&#x67;</mi></math>=<span>1D690</span></span>
+ <span><math><mi mathvariant="monospace">&#x68;</mi></math>=<span>1D691</span></span>
+ <span><math><mi mathvariant="monospace">&#x69;</mi></math>=<span>1D692</span></span>
+ <span><math><mi mathvariant="monospace">&#x6A;</mi></math>=<span>1D693</span></span>
+ <span><math><mi mathvariant="monospace">&#x6B;</mi></math>=<span>1D694</span></span>
+ <span><math><mi mathvariant="monospace">&#x6C;</mi></math>=<span>1D695</span></span>
+ <span><math><mi mathvariant="monospace">&#x6D;</mi></math>=<span>1D696</span></span>
+ <span><math><mi mathvariant="monospace">&#x6E;</mi></math>=<span>1D697</span></span><br/>
+ <span><math><mi mathvariant="monospace">&#x6F;</mi></math>=<span>1D698</span></span>
+ <span><math><mi mathvariant="monospace">&#x70;</mi></math>=<span>1D699</span></span>
+ <span><math><mi mathvariant="monospace">&#x71;</mi></math>=<span>1D69A</span></span>
+ <span><math><mi mathvariant="monospace">&#x72;</mi></math>=<span>1D69B</span></span>
+ <span><math><mi mathvariant="monospace">&#x73;</mi></math>=<span>1D69C</span></span>
+ <span><math><mi mathvariant="monospace">&#x74;</mi></math>=<span>1D69D</span></span>
+ <span><math><mi mathvariant="monospace">&#x75;</mi></math>=<span>1D69E</span></span>
+ <span><math><mi mathvariant="monospace">&#x76;</mi></math>=<span>1D69F</span></span>
+ <span><math><mi mathvariant="monospace">&#x77;</mi></math>=<span>1D6A0</span></span>
+ <span><math><mi mathvariant="monospace">&#x78;</mi></math>=<span>1D6A1</span></span><br/>
+ <span><math><mi mathvariant="monospace">&#x79;</mi></math>=<span>1D6A2</span></span>
+ <span><math><mi mathvariant="monospace">&#x7A;</mi></math>=<span>1D6A3</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif-bold-italic-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif-bold-italic-ref.html
new file mode 100644
index 00000000000..952bea76a00
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif-bold-italic-ref.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant sans-serif-bold-italic (reference)</title>
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-sans-serif-bold-italic.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi>&#x1D7C3;</mi></math>=<span>1D7C3</span></span>
+ <span><math><mi>&#x1D7A9;</mi></math>=<span>1D7A9</span></span>
+ <span><math><mi>&#x1D63C;</mi></math>=<span>1D63C</span></span>
+ <span><math><mi>&#x1D63D;</mi></math>=<span>1D63D</span></span>
+ <span><math><mi>&#x1D63E;</mi></math>=<span>1D63E</span></span>
+ <span><math><mi>&#x1D63F;</mi></math>=<span>1D63F</span></span>
+ <span><math><mi>&#x1D640;</mi></math>=<span>1D640</span></span>
+ <span><math><mi>&#x1D641;</mi></math>=<span>1D641</span></span>
+ <span><math><mi>&#x1D642;</mi></math>=<span>1D642</span></span>
+ <span><math><mi>&#x1D643;</mi></math>=<span>1D643</span></span><br/>
+ <span><math><mi>&#x1D644;</mi></math>=<span>1D644</span></span>
+ <span><math><mi>&#x1D645;</mi></math>=<span>1D645</span></span>
+ <span><math><mi>&#x1D646;</mi></math>=<span>1D646</span></span>
+ <span><math><mi>&#x1D647;</mi></math>=<span>1D647</span></span>
+ <span><math><mi>&#x1D648;</mi></math>=<span>1D648</span></span>
+ <span><math><mi>&#x1D649;</mi></math>=<span>1D649</span></span>
+ <span><math><mi>&#x1D64A;</mi></math>=<span>1D64A</span></span>
+ <span><math><mi>&#x1D64B;</mi></math>=<span>1D64B</span></span>
+ <span><math><mi>&#x1D64C;</mi></math>=<span>1D64C</span></span>
+ <span><math><mi>&#x1D64D;</mi></math>=<span>1D64D</span></span><br/>
+ <span><math><mi>&#x1D64E;</mi></math>=<span>1D64E</span></span>
+ <span><math><mi>&#x1D64F;</mi></math>=<span>1D64F</span></span>
+ <span><math><mi>&#x1D650;</mi></math>=<span>1D650</span></span>
+ <span><math><mi>&#x1D651;</mi></math>=<span>1D651</span></span>
+ <span><math><mi>&#x1D652;</mi></math>=<span>1D652</span></span>
+ <span><math><mi>&#x1D653;</mi></math>=<span>1D653</span></span>
+ <span><math><mi>&#x1D654;</mi></math>=<span>1D654</span></span>
+ <span><math><mi>&#x1D655;</mi></math>=<span>1D655</span></span>
+ <span><math><mi>&#x1D656;</mi></math>=<span>1D656</span></span>
+ <span><math><mi>&#x1D657;</mi></math>=<span>1D657</span></span><br/>
+ <span><math><mi>&#x1D658;</mi></math>=<span>1D658</span></span>
+ <span><math><mi>&#x1D659;</mi></math>=<span>1D659</span></span>
+ <span><math><mi>&#x1D65A;</mi></math>=<span>1D65A</span></span>
+ <span><math><mi>&#x1D65B;</mi></math>=<span>1D65B</span></span>
+ <span><math><mi>&#x1D65C;</mi></math>=<span>1D65C</span></span>
+ <span><math><mi>&#x1D65D;</mi></math>=<span>1D65D</span></span>
+ <span><math><mi>&#x1D65E;</mi></math>=<span>1D65E</span></span>
+ <span><math><mi>&#x1D65F;</mi></math>=<span>1D65F</span></span>
+ <span><math><mi>&#x1D660;</mi></math>=<span>1D660</span></span>
+ <span><math><mi>&#x1D661;</mi></math>=<span>1D661</span></span><br/>
+ <span><math><mi>&#x1D662;</mi></math>=<span>1D662</span></span>
+ <span><math><mi>&#x1D663;</mi></math>=<span>1D663</span></span>
+ <span><math><mi>&#x1D664;</mi></math>=<span>1D664</span></span>
+ <span><math><mi>&#x1D665;</mi></math>=<span>1D665</span></span>
+ <span><math><mi>&#x1D666;</mi></math>=<span>1D666</span></span>
+ <span><math><mi>&#x1D667;</mi></math>=<span>1D667</span></span>
+ <span><math><mi>&#x1D668;</mi></math>=<span>1D668</span></span>
+ <span><math><mi>&#x1D669;</mi></math>=<span>1D669</span></span>
+ <span><math><mi>&#x1D66A;</mi></math>=<span>1D66A</span></span>
+ <span><math><mi>&#x1D66B;</mi></math>=<span>1D66B</span></span><br/>
+ <span><math><mi>&#x1D66C;</mi></math>=<span>1D66C</span></span>
+ <span><math><mi>&#x1D66D;</mi></math>=<span>1D66D</span></span>
+ <span><math><mi>&#x1D66E;</mi></math>=<span>1D66E</span></span>
+ <span><math><mi>&#x1D66F;</mi></math>=<span>1D66F</span></span>
+ <span><math><mi>&#x1D790;</mi></math>=<span>1D790</span></span>
+ <span><math><mi>&#x1D791;</mi></math>=<span>1D791</span></span>
+ <span><math><mi>&#x1D792;</mi></math>=<span>1D792</span></span>
+ <span><math><mi>&#x1D793;</mi></math>=<span>1D793</span></span>
+ <span><math><mi>&#x1D794;</mi></math>=<span>1D794</span></span>
+ <span><math><mi>&#x1D795;</mi></math>=<span>1D795</span></span><br/>
+ <span><math><mi>&#x1D796;</mi></math>=<span>1D796</span></span>
+ <span><math><mi>&#x1D797;</mi></math>=<span>1D797</span></span>
+ <span><math><mi>&#x1D798;</mi></math>=<span>1D798</span></span>
+ <span><math><mi>&#x1D799;</mi></math>=<span>1D799</span></span>
+ <span><math><mi>&#x1D79A;</mi></math>=<span>1D79A</span></span>
+ <span><math><mi>&#x1D79B;</mi></math>=<span>1D79B</span></span>
+ <span><math><mi>&#x1D79C;</mi></math>=<span>1D79C</span></span>
+ <span><math><mi>&#x1D79D;</mi></math>=<span>1D79D</span></span>
+ <span><math><mi>&#x1D79E;</mi></math>=<span>1D79E</span></span>
+ <span><math><mi>&#x1D79F;</mi></math>=<span>1D79F</span></span><br/>
+ <span><math><mi>&#x1D7A0;</mi></math>=<span>1D7A0</span></span>
+ <span><math><mi>&#x1D7A2;</mi></math>=<span>1D7A2</span></span>
+ <span><math><mi>&#x1D7A3;</mi></math>=<span>1D7A3</span></span>
+ <span><math><mi>&#x1D7A4;</mi></math>=<span>1D7A4</span></span>
+ <span><math><mi>&#x1D7A5;</mi></math>=<span>1D7A5</span></span>
+ <span><math><mi>&#x1D7A6;</mi></math>=<span>1D7A6</span></span>
+ <span><math><mi>&#x1D7A7;</mi></math>=<span>1D7A7</span></span>
+ <span><math><mi>&#x1D7A8;</mi></math>=<span>1D7A8</span></span>
+ <span><math><mi>&#x1D7AA;</mi></math>=<span>1D7AA</span></span>
+ <span><math><mi>&#x1D7AB;</mi></math>=<span>1D7AB</span></span><br/>
+ <span><math><mi>&#x1D7AC;</mi></math>=<span>1D7AC</span></span>
+ <span><math><mi>&#x1D7AD;</mi></math>=<span>1D7AD</span></span>
+ <span><math><mi>&#x1D7AE;</mi></math>=<span>1D7AE</span></span>
+ <span><math><mi>&#x1D7AF;</mi></math>=<span>1D7AF</span></span>
+ <span><math><mi>&#x1D7B0;</mi></math>=<span>1D7B0</span></span>
+ <span><math><mi>&#x1D7B1;</mi></math>=<span>1D7B1</span></span>
+ <span><math><mi>&#x1D7B2;</mi></math>=<span>1D7B2</span></span>
+ <span><math><mi>&#x1D7B3;</mi></math>=<span>1D7B3</span></span>
+ <span><math><mi>&#x1D7B4;</mi></math>=<span>1D7B4</span></span>
+ <span><math><mi>&#x1D7B5;</mi></math>=<span>1D7B5</span></span><br/>
+ <span><math><mi>&#x1D7B6;</mi></math>=<span>1D7B6</span></span>
+ <span><math><mi>&#x1D7B7;</mi></math>=<span>1D7B7</span></span>
+ <span><math><mi>&#x1D7B8;</mi></math>=<span>1D7B8</span></span>
+ <span><math><mi>&#x1D7B9;</mi></math>=<span>1D7B9</span></span>
+ <span><math><mi>&#x1D7BA;</mi></math>=<span>1D7BA</span></span>
+ <span><math><mi>&#x1D7BB;</mi></math>=<span>1D7BB</span></span>
+ <span><math><mi>&#x1D7BC;</mi></math>=<span>1D7BC</span></span>
+ <span><math><mi>&#x1D7BD;</mi></math>=<span>1D7BD</span></span>
+ <span><math><mi>&#x1D7BE;</mi></math>=<span>1D7BE</span></span>
+ <span><math><mi>&#x1D7BF;</mi></math>=<span>1D7BF</span></span><br/>
+ <span><math><mi>&#x1D7C0;</mi></math>=<span>1D7C0</span></span>
+ <span><math><mi>&#x1D7C1;</mi></math>=<span>1D7C1</span></span>
+ <span><math><mi>&#x1D7C2;</mi></math>=<span>1D7C2</span></span>
+ <span><math><mi>&#x1D7C5;</mi></math>=<span>1D7C5</span></span>
+ <span><math><mi>&#x1D7C7;</mi></math>=<span>1D7C7</span></span>
+ <span><math><mi>&#x1D7C9;</mi></math>=<span>1D7C9</span></span>
+ <span><math><mi>&#x1D7C6;</mi></math>=<span>1D7C6</span></span>
+ <span><math><mi>&#x1D7C8;</mi></math>=<span>1D7C8</span></span>
+ <span><math><mi>&#x1D7A1;</mi></math>=<span>1D7A1</span></span>
+ <span><math><mi>&#x1D7C4;</mi></math>=<span>1D7C4</span></span><br/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif-bold-italic.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif-bold-italic.html
new file mode 100644
index 00000000000..c7990a9a180
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif-bold-italic.html
@@ -0,0 +1,140 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant sans-serif-bold-italic</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1.tab2"/>
+<link rel="match" href="mathvariant-sans-serif-bold-italic-ref.html"/>
+<meta name="assert" content="Verify that a single-char <mi> with a sans-serif-bold-italic mathvariant is equivalent to an <mi> with the transformed unicode character.">
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-sans-serif-bold-italic.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x2202;</mi></math>=<span>1D7C3</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x2207;</mi></math>=<span>1D7A9</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x41;</mi></math>=<span>1D63C</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x42;</mi></math>=<span>1D63D</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x43;</mi></math>=<span>1D63E</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x44;</mi></math>=<span>1D63F</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x45;</mi></math>=<span>1D640</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x46;</mi></math>=<span>1D641</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x47;</mi></math>=<span>1D642</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x48;</mi></math>=<span>1D643</span></span><br/>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x49;</mi></math>=<span>1D644</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x4A;</mi></math>=<span>1D645</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x4B;</mi></math>=<span>1D646</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x4C;</mi></math>=<span>1D647</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x4D;</mi></math>=<span>1D648</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x4E;</mi></math>=<span>1D649</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x4F;</mi></math>=<span>1D64A</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x50;</mi></math>=<span>1D64B</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x51;</mi></math>=<span>1D64C</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x52;</mi></math>=<span>1D64D</span></span><br/>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x53;</mi></math>=<span>1D64E</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x54;</mi></math>=<span>1D64F</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x55;</mi></math>=<span>1D650</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x56;</mi></math>=<span>1D651</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x57;</mi></math>=<span>1D652</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x58;</mi></math>=<span>1D653</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x59;</mi></math>=<span>1D654</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x5A;</mi></math>=<span>1D655</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x61;</mi></math>=<span>1D656</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x62;</mi></math>=<span>1D657</span></span><br/>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x63;</mi></math>=<span>1D658</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x64;</mi></math>=<span>1D659</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x65;</mi></math>=<span>1D65A</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x66;</mi></math>=<span>1D65B</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x67;</mi></math>=<span>1D65C</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x68;</mi></math>=<span>1D65D</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x69;</mi></math>=<span>1D65E</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x6A;</mi></math>=<span>1D65F</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x6B;</mi></math>=<span>1D660</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x6C;</mi></math>=<span>1D661</span></span><br/>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x6D;</mi></math>=<span>1D662</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x6E;</mi></math>=<span>1D663</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x6F;</mi></math>=<span>1D664</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x70;</mi></math>=<span>1D665</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x71;</mi></math>=<span>1D666</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x72;</mi></math>=<span>1D667</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x73;</mi></math>=<span>1D668</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x74;</mi></math>=<span>1D669</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x75;</mi></math>=<span>1D66A</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x76;</mi></math>=<span>1D66B</span></span><br/>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x77;</mi></math>=<span>1D66C</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x78;</mi></math>=<span>1D66D</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x79;</mi></math>=<span>1D66E</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x7A;</mi></math>=<span>1D66F</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x391;</mi></math>=<span>1D790</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x392;</mi></math>=<span>1D791</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x393;</mi></math>=<span>1D792</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x394;</mi></math>=<span>1D793</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x395;</mi></math>=<span>1D794</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x396;</mi></math>=<span>1D795</span></span><br/>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x397;</mi></math>=<span>1D796</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x398;</mi></math>=<span>1D797</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x399;</mi></math>=<span>1D798</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x39A;</mi></math>=<span>1D799</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x39B;</mi></math>=<span>1D79A</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x39C;</mi></math>=<span>1D79B</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x39D;</mi></math>=<span>1D79C</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x39E;</mi></math>=<span>1D79D</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x39F;</mi></math>=<span>1D79E</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3A0;</mi></math>=<span>1D79F</span></span><br/>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3A1;</mi></math>=<span>1D7A0</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3A3;</mi></math>=<span>1D7A2</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3A4;</mi></math>=<span>1D7A3</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3A5;</mi></math>=<span>1D7A4</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3A6;</mi></math>=<span>1D7A5</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3A7;</mi></math>=<span>1D7A6</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3A8;</mi></math>=<span>1D7A7</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3A9;</mi></math>=<span>1D7A8</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3B1;</mi></math>=<span>1D7AA</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3B2;</mi></math>=<span>1D7AB</span></span><br/>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3B3;</mi></math>=<span>1D7AC</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3B4;</mi></math>=<span>1D7AD</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3B5;</mi></math>=<span>1D7AE</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3B6;</mi></math>=<span>1D7AF</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3B7;</mi></math>=<span>1D7B0</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3B8;</mi></math>=<span>1D7B1</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3B9;</mi></math>=<span>1D7B2</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3BA;</mi></math>=<span>1D7B3</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3BB;</mi></math>=<span>1D7B4</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3BC;</mi></math>=<span>1D7B5</span></span><br/>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3BD;</mi></math>=<span>1D7B6</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3BE;</mi></math>=<span>1D7B7</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3BF;</mi></math>=<span>1D7B8</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3C0;</mi></math>=<span>1D7B9</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3C1;</mi></math>=<span>1D7BA</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3C2;</mi></math>=<span>1D7BB</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3C3;</mi></math>=<span>1D7BC</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3C4;</mi></math>=<span>1D7BD</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3C5;</mi></math>=<span>1D7BE</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3C6;</mi></math>=<span>1D7BF</span></span><br/>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3C7;</mi></math>=<span>1D7C0</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3C8;</mi></math>=<span>1D7C1</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3C9;</mi></math>=<span>1D7C2</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3D1;</mi></math>=<span>1D7C5</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3D5;</mi></math>=<span>1D7C7</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3D6;</mi></math>=<span>1D7C9</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3F0;</mi></math>=<span>1D7C6</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3F1;</mi></math>=<span>1D7C8</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3F4;</mi></math>=<span>1D7A1</span></span>
+ <span><math><mi mathvariant="sans-serif-bold-italic">&#x3F5;</mi></math>=<span>1D7C4</span></span><br/>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif-italic-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif-italic-ref.html
new file mode 100644
index 00000000000..eab1776fe4a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif-italic-ref.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant sans-serif-italic (reference)</title>
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-sans-serif-italic.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi>&#x1D608;</mi></math>=<span>1D608</span></span>
+ <span><math><mi>&#x1D609;</mi></math>=<span>1D609</span></span>
+ <span><math><mi>&#x1D60A;</mi></math>=<span>1D60A</span></span>
+ <span><math><mi>&#x1D60B;</mi></math>=<span>1D60B</span></span>
+ <span><math><mi>&#x1D60C;</mi></math>=<span>1D60C</span></span>
+ <span><math><mi>&#x1D60D;</mi></math>=<span>1D60D</span></span>
+ <span><math><mi>&#x1D60E;</mi></math>=<span>1D60E</span></span>
+ <span><math><mi>&#x1D60F;</mi></math>=<span>1D60F</span></span>
+ <span><math><mi>&#x1D610;</mi></math>=<span>1D610</span></span>
+ <span><math><mi>&#x1D611;</mi></math>=<span>1D611</span></span><br/>
+ <span><math><mi>&#x1D612;</mi></math>=<span>1D612</span></span>
+ <span><math><mi>&#x1D613;</mi></math>=<span>1D613</span></span>
+ <span><math><mi>&#x1D614;</mi></math>=<span>1D614</span></span>
+ <span><math><mi>&#x1D615;</mi></math>=<span>1D615</span></span>
+ <span><math><mi>&#x1D616;</mi></math>=<span>1D616</span></span>
+ <span><math><mi>&#x1D617;</mi></math>=<span>1D617</span></span>
+ <span><math><mi>&#x1D618;</mi></math>=<span>1D618</span></span>
+ <span><math><mi>&#x1D619;</mi></math>=<span>1D619</span></span>
+ <span><math><mi>&#x1D61A;</mi></math>=<span>1D61A</span></span>
+ <span><math><mi>&#x1D61B;</mi></math>=<span>1D61B</span></span><br/>
+ <span><math><mi>&#x1D61C;</mi></math>=<span>1D61C</span></span>
+ <span><math><mi>&#x1D61D;</mi></math>=<span>1D61D</span></span>
+ <span><math><mi>&#x1D61E;</mi></math>=<span>1D61E</span></span>
+ <span><math><mi>&#x1D61F;</mi></math>=<span>1D61F</span></span>
+ <span><math><mi>&#x1D620;</mi></math>=<span>1D620</span></span>
+ <span><math><mi>&#x1D621;</mi></math>=<span>1D621</span></span>
+ <span><math><mi>&#x1D622;</mi></math>=<span>1D622</span></span>
+ <span><math><mi>&#x1D623;</mi></math>=<span>1D623</span></span>
+ <span><math><mi>&#x1D624;</mi></math>=<span>1D624</span></span>
+ <span><math><mi>&#x1D625;</mi></math>=<span>1D625</span></span><br/>
+ <span><math><mi>&#x1D626;</mi></math>=<span>1D626</span></span>
+ <span><math><mi>&#x1D627;</mi></math>=<span>1D627</span></span>
+ <span><math><mi>&#x1D628;</mi></math>=<span>1D628</span></span>
+ <span><math><mi>&#x1D629;</mi></math>=<span>1D629</span></span>
+ <span><math><mi>&#x1D62A;</mi></math>=<span>1D62A</span></span>
+ <span><math><mi>&#x1D62B;</mi></math>=<span>1D62B</span></span>
+ <span><math><mi>&#x1D62C;</mi></math>=<span>1D62C</span></span>
+ <span><math><mi>&#x1D62D;</mi></math>=<span>1D62D</span></span>
+ <span><math><mi>&#x1D62E;</mi></math>=<span>1D62E</span></span>
+ <span><math><mi>&#x1D62F;</mi></math>=<span>1D62F</span></span><br/>
+ <span><math><mi>&#x1D630;</mi></math>=<span>1D630</span></span>
+ <span><math><mi>&#x1D631;</mi></math>=<span>1D631</span></span>
+ <span><math><mi>&#x1D632;</mi></math>=<span>1D632</span></span>
+ <span><math><mi>&#x1D633;</mi></math>=<span>1D633</span></span>
+ <span><math><mi>&#x1D634;</mi></math>=<span>1D634</span></span>
+ <span><math><mi>&#x1D635;</mi></math>=<span>1D635</span></span>
+ <span><math><mi>&#x1D636;</mi></math>=<span>1D636</span></span>
+ <span><math><mi>&#x1D637;</mi></math>=<span>1D637</span></span>
+ <span><math><mi>&#x1D638;</mi></math>=<span>1D638</span></span>
+ <span><math><mi>&#x1D639;</mi></math>=<span>1D639</span></span><br/>
+ <span><math><mi>&#x1D63A;</mi></math>=<span>1D63A</span></span>
+ <span><math><mi>&#x1D63B;</mi></math>=<span>1D63B</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif-italic.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif-italic.html
new file mode 100644
index 00000000000..293d14bbc0a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif-italic.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant sans-serif-italic</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1.tab2"/>
+<link rel="match" href="mathvariant-sans-serif-italic-ref.html"/>
+<meta name="assert" content="Verify that a single-char <mi> with a sans-serif-italic mathvariant is equivalent to an <mi> with the transformed unicode character.">
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-sans-serif-italic.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi mathvariant="sans-serif-italic">&#x41;</mi></math>=<span>1D608</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x42;</mi></math>=<span>1D609</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x43;</mi></math>=<span>1D60A</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x44;</mi></math>=<span>1D60B</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x45;</mi></math>=<span>1D60C</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x46;</mi></math>=<span>1D60D</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x47;</mi></math>=<span>1D60E</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x48;</mi></math>=<span>1D60F</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x49;</mi></math>=<span>1D610</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x4A;</mi></math>=<span>1D611</span></span><br/>
+ <span><math><mi mathvariant="sans-serif-italic">&#x4B;</mi></math>=<span>1D612</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x4C;</mi></math>=<span>1D613</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x4D;</mi></math>=<span>1D614</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x4E;</mi></math>=<span>1D615</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x4F;</mi></math>=<span>1D616</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x50;</mi></math>=<span>1D617</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x51;</mi></math>=<span>1D618</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x52;</mi></math>=<span>1D619</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x53;</mi></math>=<span>1D61A</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x54;</mi></math>=<span>1D61B</span></span><br/>
+ <span><math><mi mathvariant="sans-serif-italic">&#x55;</mi></math>=<span>1D61C</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x56;</mi></math>=<span>1D61D</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x57;</mi></math>=<span>1D61E</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x58;</mi></math>=<span>1D61F</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x59;</mi></math>=<span>1D620</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x5A;</mi></math>=<span>1D621</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x61;</mi></math>=<span>1D622</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x62;</mi></math>=<span>1D623</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x63;</mi></math>=<span>1D624</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x64;</mi></math>=<span>1D625</span></span><br/>
+ <span><math><mi mathvariant="sans-serif-italic">&#x65;</mi></math>=<span>1D626</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x66;</mi></math>=<span>1D627</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x67;</mi></math>=<span>1D628</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x68;</mi></math>=<span>1D629</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x69;</mi></math>=<span>1D62A</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x6A;</mi></math>=<span>1D62B</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x6B;</mi></math>=<span>1D62C</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x6C;</mi></math>=<span>1D62D</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x6D;</mi></math>=<span>1D62E</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x6E;</mi></math>=<span>1D62F</span></span><br/>
+ <span><math><mi mathvariant="sans-serif-italic">&#x6F;</mi></math>=<span>1D630</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x70;</mi></math>=<span>1D631</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x71;</mi></math>=<span>1D632</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x72;</mi></math>=<span>1D633</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x73;</mi></math>=<span>1D634</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x74;</mi></math>=<span>1D635</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x75;</mi></math>=<span>1D636</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x76;</mi></math>=<span>1D637</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x77;</mi></math>=<span>1D638</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x78;</mi></math>=<span>1D639</span></span><br/>
+ <span><math><mi mathvariant="sans-serif-italic">&#x79;</mi></math>=<span>1D63A</span></span>
+ <span><math><mi mathvariant="sans-serif-italic">&#x7A;</mi></math>=<span>1D63B</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif-ref.html
new file mode 100644
index 00000000000..b6bb6f87c35
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif-ref.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant sans-serif (reference)</title>
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-sans-serif.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi>&#x1D7E2;</mi></math>=<span>1D7E2</span></span>
+ <span><math><mi>&#x1D7E3;</mi></math>=<span>1D7E3</span></span>
+ <span><math><mi>&#x1D7E4;</mi></math>=<span>1D7E4</span></span>
+ <span><math><mi>&#x1D7E5;</mi></math>=<span>1D7E5</span></span>
+ <span><math><mi>&#x1D7E6;</mi></math>=<span>1D7E6</span></span>
+ <span><math><mi>&#x1D7E7;</mi></math>=<span>1D7E7</span></span>
+ <span><math><mi>&#x1D7E8;</mi></math>=<span>1D7E8</span></span>
+ <span><math><mi>&#x1D7E9;</mi></math>=<span>1D7E9</span></span>
+ <span><math><mi>&#x1D7EA;</mi></math>=<span>1D7EA</span></span>
+ <span><math><mi>&#x1D7EB;</mi></math>=<span>1D7EB</span></span><br/>
+ <span><math><mi>&#x1D5A0;</mi></math>=<span>1D5A0</span></span>
+ <span><math><mi>&#x1D5A1;</mi></math>=<span>1D5A1</span></span>
+ <span><math><mi>&#x1D5A2;</mi></math>=<span>1D5A2</span></span>
+ <span><math><mi>&#x1D5A3;</mi></math>=<span>1D5A3</span></span>
+ <span><math><mi>&#x1D5A4;</mi></math>=<span>1D5A4</span></span>
+ <span><math><mi>&#x1D5A5;</mi></math>=<span>1D5A5</span></span>
+ <span><math><mi>&#x1D5A6;</mi></math>=<span>1D5A6</span></span>
+ <span><math><mi>&#x1D5A7;</mi></math>=<span>1D5A7</span></span>
+ <span><math><mi>&#x1D5A8;</mi></math>=<span>1D5A8</span></span>
+ <span><math><mi>&#x1D5A9;</mi></math>=<span>1D5A9</span></span><br/>
+ <span><math><mi>&#x1D5AA;</mi></math>=<span>1D5AA</span></span>
+ <span><math><mi>&#x1D5AB;</mi></math>=<span>1D5AB</span></span>
+ <span><math><mi>&#x1D5AC;</mi></math>=<span>1D5AC</span></span>
+ <span><math><mi>&#x1D5AD;</mi></math>=<span>1D5AD</span></span>
+ <span><math><mi>&#x1D5AE;</mi></math>=<span>1D5AE</span></span>
+ <span><math><mi>&#x1D5AF;</mi></math>=<span>1D5AF</span></span>
+ <span><math><mi>&#x1D5B0;</mi></math>=<span>1D5B0</span></span>
+ <span><math><mi>&#x1D5B1;</mi></math>=<span>1D5B1</span></span>
+ <span><math><mi>&#x1D5B2;</mi></math>=<span>1D5B2</span></span>
+ <span><math><mi>&#x1D5B3;</mi></math>=<span>1D5B3</span></span><br/>
+ <span><math><mi>&#x1D5B4;</mi></math>=<span>1D5B4</span></span>
+ <span><math><mi>&#x1D5B5;</mi></math>=<span>1D5B5</span></span>
+ <span><math><mi>&#x1D5B6;</mi></math>=<span>1D5B6</span></span>
+ <span><math><mi>&#x1D5B7;</mi></math>=<span>1D5B7</span></span>
+ <span><math><mi>&#x1D5B8;</mi></math>=<span>1D5B8</span></span>
+ <span><math><mi>&#x1D5B9;</mi></math>=<span>1D5B9</span></span>
+ <span><math><mi>&#x1D5BA;</mi></math>=<span>1D5BA</span></span>
+ <span><math><mi>&#x1D5BB;</mi></math>=<span>1D5BB</span></span>
+ <span><math><mi>&#x1D5BC;</mi></math>=<span>1D5BC</span></span>
+ <span><math><mi>&#x1D5BD;</mi></math>=<span>1D5BD</span></span><br/>
+ <span><math><mi>&#x1D5BE;</mi></math>=<span>1D5BE</span></span>
+ <span><math><mi>&#x1D5BF;</mi></math>=<span>1D5BF</span></span>
+ <span><math><mi>&#x1D5C0;</mi></math>=<span>1D5C0</span></span>
+ <span><math><mi>&#x1D5C1;</mi></math>=<span>1D5C1</span></span>
+ <span><math><mi>&#x1D5C2;</mi></math>=<span>1D5C2</span></span>
+ <span><math><mi>&#x1D5C3;</mi></math>=<span>1D5C3</span></span>
+ <span><math><mi>&#x1D5C4;</mi></math>=<span>1D5C4</span></span>
+ <span><math><mi>&#x1D5C5;</mi></math>=<span>1D5C5</span></span>
+ <span><math><mi>&#x1D5C6;</mi></math>=<span>1D5C6</span></span>
+ <span><math><mi>&#x1D5C7;</mi></math>=<span>1D5C7</span></span><br/>
+ <span><math><mi>&#x1D5C8;</mi></math>=<span>1D5C8</span></span>
+ <span><math><mi>&#x1D5C9;</mi></math>=<span>1D5C9</span></span>
+ <span><math><mi>&#x1D5CA;</mi></math>=<span>1D5CA</span></span>
+ <span><math><mi>&#x1D5CB;</mi></math>=<span>1D5CB</span></span>
+ <span><math><mi>&#x1D5CC;</mi></math>=<span>1D5CC</span></span>
+ <span><math><mi>&#x1D5CD;</mi></math>=<span>1D5CD</span></span>
+ <span><math><mi>&#x1D5CE;</mi></math>=<span>1D5CE</span></span>
+ <span><math><mi>&#x1D5CF;</mi></math>=<span>1D5CF</span></span>
+ <span><math><mi>&#x1D5D0;</mi></math>=<span>1D5D0</span></span>
+ <span><math><mi>&#x1D5D1;</mi></math>=<span>1D5D1</span></span><br/>
+ <span><math><mi>&#x1D5D2;</mi></math>=<span>1D5D2</span></span>
+ <span><math><mi>&#x1D5D3;</mi></math>=<span>1D5D3</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif.html
new file mode 100644
index 00000000000..fc82e54ecf0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-sans-serif.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant sans-serif</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1.tab2"/>
+<link rel="match" href="mathvariant-sans-serif-ref.html"/>
+<meta name="assert" content="Verify that a single-char <mi> with a sans-serif mathvariant is equivalent to an <mi> with the transformed unicode character.">
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-sans-serif.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi mathvariant="sans-serif">&#x30;</mi></math>=<span>1D7E2</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x31;</mi></math>=<span>1D7E3</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x32;</mi></math>=<span>1D7E4</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x33;</mi></math>=<span>1D7E5</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x34;</mi></math>=<span>1D7E6</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x35;</mi></math>=<span>1D7E7</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x36;</mi></math>=<span>1D7E8</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x37;</mi></math>=<span>1D7E9</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x38;</mi></math>=<span>1D7EA</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x39;</mi></math>=<span>1D7EB</span></span><br/>
+ <span><math><mi mathvariant="sans-serif">&#x41;</mi></math>=<span>1D5A0</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x42;</mi></math>=<span>1D5A1</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x43;</mi></math>=<span>1D5A2</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x44;</mi></math>=<span>1D5A3</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x45;</mi></math>=<span>1D5A4</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x46;</mi></math>=<span>1D5A5</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x47;</mi></math>=<span>1D5A6</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x48;</mi></math>=<span>1D5A7</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x49;</mi></math>=<span>1D5A8</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x4A;</mi></math>=<span>1D5A9</span></span><br/>
+ <span><math><mi mathvariant="sans-serif">&#x4B;</mi></math>=<span>1D5AA</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x4C;</mi></math>=<span>1D5AB</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x4D;</mi></math>=<span>1D5AC</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x4E;</mi></math>=<span>1D5AD</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x4F;</mi></math>=<span>1D5AE</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x50;</mi></math>=<span>1D5AF</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x51;</mi></math>=<span>1D5B0</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x52;</mi></math>=<span>1D5B1</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x53;</mi></math>=<span>1D5B2</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x54;</mi></math>=<span>1D5B3</span></span><br/>
+ <span><math><mi mathvariant="sans-serif">&#x55;</mi></math>=<span>1D5B4</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x56;</mi></math>=<span>1D5B5</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x57;</mi></math>=<span>1D5B6</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x58;</mi></math>=<span>1D5B7</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x59;</mi></math>=<span>1D5B8</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x5A;</mi></math>=<span>1D5B9</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x61;</mi></math>=<span>1D5BA</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x62;</mi></math>=<span>1D5BB</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x63;</mi></math>=<span>1D5BC</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x64;</mi></math>=<span>1D5BD</span></span><br/>
+ <span><math><mi mathvariant="sans-serif">&#x65;</mi></math>=<span>1D5BE</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x66;</mi></math>=<span>1D5BF</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x67;</mi></math>=<span>1D5C0</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x68;</mi></math>=<span>1D5C1</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x69;</mi></math>=<span>1D5C2</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x6A;</mi></math>=<span>1D5C3</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x6B;</mi></math>=<span>1D5C4</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x6C;</mi></math>=<span>1D5C5</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x6D;</mi></math>=<span>1D5C6</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x6E;</mi></math>=<span>1D5C7</span></span><br/>
+ <span><math><mi mathvariant="sans-serif">&#x6F;</mi></math>=<span>1D5C8</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x70;</mi></math>=<span>1D5C9</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x71;</mi></math>=<span>1D5CA</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x72;</mi></math>=<span>1D5CB</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x73;</mi></math>=<span>1D5CC</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x74;</mi></math>=<span>1D5CD</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x75;</mi></math>=<span>1D5CE</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x76;</mi></math>=<span>1D5CF</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x77;</mi></math>=<span>1D5D0</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x78;</mi></math>=<span>1D5D1</span></span><br/>
+ <span><math><mi mathvariant="sans-serif">&#x79;</mi></math>=<span>1D5D2</span></span>
+ <span><math><mi mathvariant="sans-serif">&#x7A;</mi></math>=<span>1D5D3</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-script-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-script-ref.html
new file mode 100644
index 00000000000..8e5cae85602
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-script-ref.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant script (reference)</title>
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-script.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi>&#x1D49C;</mi></math>=<span>1D49C</span></span>
+ <span><math><mi>&#x212C;</mi></math>=<span>0212C</span></span>
+ <span><math><mi>&#x1D49E;</mi></math>=<span>1D49E</span></span>
+ <span><math><mi>&#x1D49F;</mi></math>=<span>1D49F</span></span>
+ <span><math><mi>&#x2130;</mi></math>=<span>02130</span></span>
+ <span><math><mi>&#x2131;</mi></math>=<span>02131</span></span>
+ <span><math><mi>&#x1D4A2;</mi></math>=<span>1D4A2</span></span>
+ <span><math><mi>&#x210B;</mi></math>=<span>0210B</span></span>
+ <span><math><mi>&#x2110;</mi></math>=<span>02110</span></span>
+ <span><math><mi>&#x1D4A5;</mi></math>=<span>1D4A5</span></span><br/>
+ <span><math><mi>&#x1D4A6;</mi></math>=<span>1D4A6</span></span>
+ <span><math><mi>&#x2112;</mi></math>=<span>02112</span></span>
+ <span><math><mi>&#x2133;</mi></math>=<span>02133</span></span>
+ <span><math><mi>&#x1D4A9;</mi></math>=<span>1D4A9</span></span>
+ <span><math><mi>&#x1D4AA;</mi></math>=<span>1D4AA</span></span>
+ <span><math><mi>&#x1D4AB;</mi></math>=<span>1D4AB</span></span>
+ <span><math><mi>&#x1D4AC;</mi></math>=<span>1D4AC</span></span>
+ <span><math><mi>&#x211B;</mi></math>=<span>0211B</span></span>
+ <span><math><mi>&#x1D4AE;</mi></math>=<span>1D4AE</span></span>
+ <span><math><mi>&#x1D4AF;</mi></math>=<span>1D4AF</span></span><br/>
+ <span><math><mi>&#x1D4B0;</mi></math>=<span>1D4B0</span></span>
+ <span><math><mi>&#x1D4B1;</mi></math>=<span>1D4B1</span></span>
+ <span><math><mi>&#x1D4B2;</mi></math>=<span>1D4B2</span></span>
+ <span><math><mi>&#x1D4B3;</mi></math>=<span>1D4B3</span></span>
+ <span><math><mi>&#x1D4B4;</mi></math>=<span>1D4B4</span></span>
+ <span><math><mi>&#x1D4B5;</mi></math>=<span>1D4B5</span></span>
+ <span><math><mi>&#x1D4B6;</mi></math>=<span>1D4B6</span></span>
+ <span><math><mi>&#x1D4B7;</mi></math>=<span>1D4B7</span></span>
+ <span><math><mi>&#x1D4B8;</mi></math>=<span>1D4B8</span></span>
+ <span><math><mi>&#x1D4B9;</mi></math>=<span>1D4B9</span></span><br/>
+ <span><math><mi>&#x212F;</mi></math>=<span>0212F</span></span>
+ <span><math><mi>&#x1D4BB;</mi></math>=<span>1D4BB</span></span>
+ <span><math><mi>&#x210A;</mi></math>=<span>0210A</span></span>
+ <span><math><mi>&#x1D4BD;</mi></math>=<span>1D4BD</span></span>
+ <span><math><mi>&#x1D4BE;</mi></math>=<span>1D4BE</span></span>
+ <span><math><mi>&#x1D4BF;</mi></math>=<span>1D4BF</span></span>
+ <span><math><mi>&#x1D4C0;</mi></math>=<span>1D4C0</span></span>
+ <span><math><mi>&#x1D4C1;</mi></math>=<span>1D4C1</span></span>
+ <span><math><mi>&#x1D4C2;</mi></math>=<span>1D4C2</span></span>
+ <span><math><mi>&#x1D4C3;</mi></math>=<span>1D4C3</span></span><br/>
+ <span><math><mi>&#x2134;</mi></math>=<span>02134</span></span>
+ <span><math><mi>&#x1D4C5;</mi></math>=<span>1D4C5</span></span>
+ <span><math><mi>&#x1D4C6;</mi></math>=<span>1D4C6</span></span>
+ <span><math><mi>&#x1D4C7;</mi></math>=<span>1D4C7</span></span>
+ <span><math><mi>&#x1D4C8;</mi></math>=<span>1D4C8</span></span>
+ <span><math><mi>&#x1D4C9;</mi></math>=<span>1D4C9</span></span>
+ <span><math><mi>&#x1D4CA;</mi></math>=<span>1D4CA</span></span>
+ <span><math><mi>&#x1D4CB;</mi></math>=<span>1D4CB</span></span>
+ <span><math><mi>&#x1D4CC;</mi></math>=<span>1D4CC</span></span>
+ <span><math><mi>&#x1D4CD;</mi></math>=<span>1D4CD</span></span><br/>
+ <span><math><mi>&#x1D4CE;</mi></math>=<span>1D4CE</span></span>
+ <span><math><mi>&#x1D4CF;</mi></math>=<span>1D4CF</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-script.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-script.html
new file mode 100644
index 00000000000..721052601f9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-script.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant script</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1.tab2"/>
+<link rel="match" href="mathvariant-script-ref.html"/>
+<meta name="assert" content="Verify that a single-char <mi> with a script mathvariant is equivalent to an <mi> with the transformed unicode character.">
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-script.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi mathvariant="script">&#x41;</mi></math>=<span>1D49C</span></span>
+ <span><math><mi mathvariant="script">&#x42;</mi></math>=<span>0212C</span></span>
+ <span><math><mi mathvariant="script">&#x43;</mi></math>=<span>1D49E</span></span>
+ <span><math><mi mathvariant="script">&#x44;</mi></math>=<span>1D49F</span></span>
+ <span><math><mi mathvariant="script">&#x45;</mi></math>=<span>02130</span></span>
+ <span><math><mi mathvariant="script">&#x46;</mi></math>=<span>02131</span></span>
+ <span><math><mi mathvariant="script">&#x47;</mi></math>=<span>1D4A2</span></span>
+ <span><math><mi mathvariant="script">&#x48;</mi></math>=<span>0210B</span></span>
+ <span><math><mi mathvariant="script">&#x49;</mi></math>=<span>02110</span></span>
+ <span><math><mi mathvariant="script">&#x4A;</mi></math>=<span>1D4A5</span></span><br/>
+ <span><math><mi mathvariant="script">&#x4B;</mi></math>=<span>1D4A6</span></span>
+ <span><math><mi mathvariant="script">&#x4C;</mi></math>=<span>02112</span></span>
+ <span><math><mi mathvariant="script">&#x4D;</mi></math>=<span>02133</span></span>
+ <span><math><mi mathvariant="script">&#x4E;</mi></math>=<span>1D4A9</span></span>
+ <span><math><mi mathvariant="script">&#x4F;</mi></math>=<span>1D4AA</span></span>
+ <span><math><mi mathvariant="script">&#x50;</mi></math>=<span>1D4AB</span></span>
+ <span><math><mi mathvariant="script">&#x51;</mi></math>=<span>1D4AC</span></span>
+ <span><math><mi mathvariant="script">&#x52;</mi></math>=<span>0211B</span></span>
+ <span><math><mi mathvariant="script">&#x53;</mi></math>=<span>1D4AE</span></span>
+ <span><math><mi mathvariant="script">&#x54;</mi></math>=<span>1D4AF</span></span><br/>
+ <span><math><mi mathvariant="script">&#x55;</mi></math>=<span>1D4B0</span></span>
+ <span><math><mi mathvariant="script">&#x56;</mi></math>=<span>1D4B1</span></span>
+ <span><math><mi mathvariant="script">&#x57;</mi></math>=<span>1D4B2</span></span>
+ <span><math><mi mathvariant="script">&#x58;</mi></math>=<span>1D4B3</span></span>
+ <span><math><mi mathvariant="script">&#x59;</mi></math>=<span>1D4B4</span></span>
+ <span><math><mi mathvariant="script">&#x5A;</mi></math>=<span>1D4B5</span></span>
+ <span><math><mi mathvariant="script">&#x61;</mi></math>=<span>1D4B6</span></span>
+ <span><math><mi mathvariant="script">&#x62;</mi></math>=<span>1D4B7</span></span>
+ <span><math><mi mathvariant="script">&#x63;</mi></math>=<span>1D4B8</span></span>
+ <span><math><mi mathvariant="script">&#x64;</mi></math>=<span>1D4B9</span></span><br/>
+ <span><math><mi mathvariant="script">&#x65;</mi></math>=<span>0212F</span></span>
+ <span><math><mi mathvariant="script">&#x66;</mi></math>=<span>1D4BB</span></span>
+ <span><math><mi mathvariant="script">&#x67;</mi></math>=<span>0210A</span></span>
+ <span><math><mi mathvariant="script">&#x68;</mi></math>=<span>1D4BD</span></span>
+ <span><math><mi mathvariant="script">&#x69;</mi></math>=<span>1D4BE</span></span>
+ <span><math><mi mathvariant="script">&#x6A;</mi></math>=<span>1D4BF</span></span>
+ <span><math><mi mathvariant="script">&#x6B;</mi></math>=<span>1D4C0</span></span>
+ <span><math><mi mathvariant="script">&#x6C;</mi></math>=<span>1D4C1</span></span>
+ <span><math><mi mathvariant="script">&#x6D;</mi></math>=<span>1D4C2</span></span>
+ <span><math><mi mathvariant="script">&#x6E;</mi></math>=<span>1D4C3</span></span><br/>
+ <span><math><mi mathvariant="script">&#x6F;</mi></math>=<span>02134</span></span>
+ <span><math><mi mathvariant="script">&#x70;</mi></math>=<span>1D4C5</span></span>
+ <span><math><mi mathvariant="script">&#x71;</mi></math>=<span>1D4C6</span></span>
+ <span><math><mi mathvariant="script">&#x72;</mi></math>=<span>1D4C7</span></span>
+ <span><math><mi mathvariant="script">&#x73;</mi></math>=<span>1D4C8</span></span>
+ <span><math><mi mathvariant="script">&#x74;</mi></math>=<span>1D4C9</span></span>
+ <span><math><mi mathvariant="script">&#x75;</mi></math>=<span>1D4CA</span></span>
+ <span><math><mi mathvariant="script">&#x76;</mi></math>=<span>1D4CB</span></span>
+ <span><math><mi mathvariant="script">&#x77;</mi></math>=<span>1D4CC</span></span>
+ <span><math><mi mathvariant="script">&#x78;</mi></math>=<span>1D4CD</span></span><br/>
+ <span><math><mi mathvariant="script">&#x79;</mi></math>=<span>1D4CE</span></span>
+ <span><math><mi mathvariant="script">&#x7A;</mi></math>=<span>1D4CF</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-stretched-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-stretched-ref.html
new file mode 100644
index 00000000000..717ebc2af42
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-stretched-ref.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant stretched (reference)</title>
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-stretched.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi>&#x1EE7E;</mi></math>=<span>1EE7E</span></span>
+ <span><math><mi>&#x1EE61;</mi></math>=<span>1EE61</span></span>
+ <span><math><mi>&#x1EE75;</mi></math>=<span>1EE75</span></span>
+ <span><math><mi>&#x1EE76;</mi></math>=<span>1EE76</span></span>
+ <span><math><mi>&#x1EE62;</mi></math>=<span>1EE62</span></span>
+ <span><math><mi>&#x1EE67;</mi></math>=<span>1EE67</span></span>
+ <span><math><mi>&#x1EE77;</mi></math>=<span>1EE77</span></span>
+ <span><math><mi>&#x1EE6E;</mi></math>=<span>1EE6E</span></span>
+ <span><math><mi>&#x1EE74;</mi></math>=<span>1EE74</span></span>
+ <span><math><mi>&#x1EE71;</mi></math>=<span>1EE71</span></span><br/>
+ <span><math><mi>&#x1EE79;</mi></math>=<span>1EE79</span></span>
+ <span><math><mi>&#x1EE68;</mi></math>=<span>1EE68</span></span>
+ <span><math><mi>&#x1EE7A;</mi></math>=<span>1EE7A</span></span>
+ <span><math><mi>&#x1EE6F;</mi></math>=<span>1EE6F</span></span>
+ <span><math><mi>&#x1EE7B;</mi></math>=<span>1EE7B</span></span>
+ <span><math><mi>&#x1EE70;</mi></math>=<span>1EE70</span></span>
+ <span><math><mi>&#x1EE72;</mi></math>=<span>1EE72</span></span>
+ <span><math><mi>&#x1EE6A;</mi></math>=<span>1EE6A</span></span>
+ <span><math><mi>&#x1EE6C;</mi></math>=<span>1EE6C</span></span>
+ <span><math><mi>&#x1EE6D;</mi></math>=<span>1EE6D</span></span><br/>
+ <span><math><mi>&#x1EE64;</mi></math>=<span>1EE64</span></span>
+ <span><math><mi>&#x1EE69;</mi></math>=<span>1EE69</span></span>
+ <span><math><mi>&#x1EE7C;</mi></math>=<span>1EE7C</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-stretched.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-stretched.html
new file mode 100644
index 00000000000..4eefff8f9e9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-stretched.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant stretched</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1.tab2"/>
+<link rel="match" href="mathvariant-stretched-ref.html"/>
+<meta name="assert" content="Verify that a single-char <mi> with a stretched mathvariant is equivalent to an <mi> with the transformed unicode character.">
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-stretched.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi mathvariant="stretched">&#x6A1;</mi></math>=<span>1EE7E</span></span>
+ <span><math><mi mathvariant="stretched">&#x628;</mi></math>=<span>1EE61</span></span>
+ <span><math><mi mathvariant="stretched">&#x62A;</mi></math>=<span>1EE75</span></span>
+ <span><math><mi mathvariant="stretched">&#x62B;</mi></math>=<span>1EE76</span></span>
+ <span><math><mi mathvariant="stretched">&#x62C;</mi></math>=<span>1EE62</span></span>
+ <span><math><mi mathvariant="stretched">&#x62D;</mi></math>=<span>1EE67</span></span>
+ <span><math><mi mathvariant="stretched">&#x62E;</mi></math>=<span>1EE77</span></span>
+ <span><math><mi mathvariant="stretched">&#x633;</mi></math>=<span>1EE6E</span></span>
+ <span><math><mi mathvariant="stretched">&#x634;</mi></math>=<span>1EE74</span></span>
+ <span><math><mi mathvariant="stretched">&#x635;</mi></math>=<span>1EE71</span></span><br/>
+ <span><math><mi mathvariant="stretched">&#x636;</mi></math>=<span>1EE79</span></span>
+ <span><math><mi mathvariant="stretched">&#x637;</mi></math>=<span>1EE68</span></span>
+ <span><math><mi mathvariant="stretched">&#x638;</mi></math>=<span>1EE7A</span></span>
+ <span><math><mi mathvariant="stretched">&#x639;</mi></math>=<span>1EE6F</span></span>
+ <span><math><mi mathvariant="stretched">&#x63A;</mi></math>=<span>1EE7B</span></span>
+ <span><math><mi mathvariant="stretched">&#x641;</mi></math>=<span>1EE70</span></span>
+ <span><math><mi mathvariant="stretched">&#x642;</mi></math>=<span>1EE72</span></span>
+ <span><math><mi mathvariant="stretched">&#x643;</mi></math>=<span>1EE6A</span></span>
+ <span><math><mi mathvariant="stretched">&#x645;</mi></math>=<span>1EE6C</span></span>
+ <span><math><mi mathvariant="stretched">&#x646;</mi></math>=<span>1EE6D</span></span><br/>
+ <span><math><mi mathvariant="stretched">&#x647;</mi></math>=<span>1EE64</span></span>
+ <span><math><mi mathvariant="stretched">&#x64A;</mi></math>=<span>1EE69</span></span>
+ <span><math><mi mathvariant="stretched">&#x66E;</mi></math>=<span>1EE7C</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-tailed-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-tailed-ref.html
new file mode 100644
index 00000000000..e53ef329c5f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-tailed-ref.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant tailed (reference)</title>
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-tailed.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi>&#x1EE52;</mi></math>=<span>1EE52</span></span>
+ <span><math><mi>&#x1EE4B;</mi></math>=<span>1EE4B</span></span>
+ <span><math><mi>&#x1EE4D;</mi></math>=<span>1EE4D</span></span>
+ <span><math><mi>&#x1EE49;</mi></math>=<span>1EE49</span></span>
+ <span><math><mi>&#x1EE42;</mi></math>=<span>1EE42</span></span>
+ <span><math><mi>&#x1EE47;</mi></math>=<span>1EE47</span></span>
+ <span><math><mi>&#x1EE57;</mi></math>=<span>1EE57</span></span>
+ <span><math><mi>&#x1EE5F;</mi></math>=<span>1EE5F</span></span>
+ <span><math><mi>&#x1EE4E;</mi></math>=<span>1EE4E</span></span>
+ <span><math><mi>&#x1EE54;</mi></math>=<span>1EE54</span></span><br/>
+ <span><math><mi>&#x1EE51;</mi></math>=<span>1EE51</span></span>
+ <span><math><mi>&#x1EE59;</mi></math>=<span>1EE59</span></span>
+ <span><math><mi>&#x1EE4F;</mi></math>=<span>1EE4F</span></span>
+ <span><math><mi>&#x1EE5B;</mi></math>=<span>1EE5B</span></span>
+ <span><math><mi>&#x1EE5D;</mi></math>=<span>1EE5D</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-tailed.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-tailed.html
new file mode 100644
index 00000000000..b8ae7ea021f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/mathvariant-tailed.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>mathvariant tailed</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1.tab2"/>
+<link rel="match" href="mathvariant-tailed-ref.html"/>
+<meta name="assert" content="Verify that a single-char <mi> with a tailed mathvariant is equivalent to an <mi> with the transformed unicode character.">
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/mathvariant-tailed.woff");
+ }
+ body > span {
+ padding: 10px;
+ }
+ span > span {
+ font-family: monospace;
+ font-size: 10px;
+ }
+ math {
+ font-family: TestFont;
+ font-size: 10px;
+ }
+</style>
+<body>
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->
+ <p>Test passes if all the equalities below are true.</p>
+ <span><math><mi mathvariant="tailed">&#x642;</mi></math>=<span>1EE52</span></span>
+ <span><math><mi mathvariant="tailed">&#x644;</mi></math>=<span>1EE4B</span></span>
+ <span><math><mi mathvariant="tailed">&#x646;</mi></math>=<span>1EE4D</span></span>
+ <span><math><mi mathvariant="tailed">&#x64A;</mi></math>=<span>1EE49</span></span>
+ <span><math><mi mathvariant="tailed">&#x62C;</mi></math>=<span>1EE42</span></span>
+ <span><math><mi mathvariant="tailed">&#x62D;</mi></math>=<span>1EE47</span></span>
+ <span><math><mi mathvariant="tailed">&#x62E;</mi></math>=<span>1EE57</span></span>
+ <span><math><mi mathvariant="tailed">&#x66F;</mi></math>=<span>1EE5F</span></span>
+ <span><math><mi mathvariant="tailed">&#x633;</mi></math>=<span>1EE4E</span></span>
+ <span><math><mi mathvariant="tailed">&#x634;</mi></math>=<span>1EE54</span></span><br/>
+ <span><math><mi mathvariant="tailed">&#x635;</mi></math>=<span>1EE51</span></span>
+ <span><math><mi mathvariant="tailed">&#x636;</mi></math>=<span>1EE59</span></span>
+ <span><math><mi mathvariant="tailed">&#x639;</mi></math>=<span>1EE4F</span></span>
+ <span><math><mi mathvariant="tailed">&#x63A;</mi></math>=<span>1EE5B</span></span>
+ <span><math><mi mathvariant="tailed">&#x6BA;</mi></math>=<span>1EE5D</span></span>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/visibility-1-ref.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/visibility-1-ref.html
new file mode 100644
index 00000000000..fcaf5fe85b4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/visibility-1-ref.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>visibility (reference)</title>
+</head>
+<body>
+ <p>Test passes if you see a green square.</p>
+ <div style="background: green; width: 200px; height: 200px;">
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/css-styling/visibility-1.html b/tests/wpt/web-platform-tests/mathml/relations/css-styling/visibility-1.html
new file mode 100644
index 00000000000..be8da3b00a2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/css-styling/visibility-1.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>visibility</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1">
+<link rel="match" href="visibility-1-ref.html"/>
+<meta name="assert" content="Verify that visibility=hidden is used for text and graphical elements.">
+</head>
+<body>
+ <p>Test passes if you see a green square.</p>
+ <div style="background: green; color: red; width: 200px; height: 200px;">
+ <math><mfrac style="visibility: hidden"><mn>1</mn><mn>2</mn></mfrac></math>
+ <math><msqrt style="visibility: hidden"><mn>3</mn></msqrt></math>
+ <math><mroot style="visibility: hidden"><mn>4</mn><mn>5</mn></mroot></math>
+ <math><menclose notation="left" style="visibility: hidden"><mn>6</mn></menclose></math>
+ <math><menclose notation="right" style="visibility: hidden"><mn>7</mn></menclose></math>
+ <math><menclose notation="top" style="visibility: hidden"><mn>8</mn></menclose></math>
+ <math><menclose notation="bottom" style="visibility: hidden"><mn>9</mn></menclose></math>
+ <math><menclose notation="box" style="visibility: hidden"><mn>10</mn></menclose></math>
+ <math><menclose notation="roundedbox" style="visibility: hidden"><mn>11</mn></menclose></math>
+ <math><menclose notation="actuarial" style="visibility: hidden"><mn>12</mn></menclose></math>
+ <math><menclose notation="madruwb" style="visibility: hidden"><mn>13</mn></menclose></math>
+ <math><menclose notation="horizontalstrike" style="visibility: hidden"><mn>14</mn></menclose></math>
+ <math><menclose notation="verticalstrike" style="visibility: hidden"><mn>15</mn></menclose></math>
+ <math><menclose notation="updiagonalstrike" style="visibility: hidden"><mn>16</mn></menclose></math>
+ <math><menclose notation="downdiagonalstrike" style="visibility: hidden"><mn>17</mn></menclose></math>
+ <math><menclose notation="longdiv" style="visibility: hidden"><mn>18</mn></menclose></math>
+ <math><menclose notation="circle" style="visibility: hidden"><mn>19</mn></menclose></math>
+ <math><mi style="visibility: hidden">20</mi></math>
+ <math><mn style="visibility: hidden">21</mn></math>
+ <math><mo style="visibility: hidden">22</mo></math>
+ <math><mtext style="visibility: hidden">23</mtext></math>
+ <math><ms style="visibility: hidden">24</ms></math>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/class-1-ref.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/class-1-ref.html
new file mode 100644
index 00000000000..5afa59ecf2b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/class-1-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>Class (reference)</title>
+</head>
+<body>
+
+ <p>Test passes if you see the text "PASS".</p>
+ <math>
+ <mtext style="background: green; color: white;">PASS</mtext>
+ </math>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/class-1.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/class-1.html
new file mode 100644
index 00000000000..654852329b4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/class-1.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>Class</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS1.SSS2"/>
+<link rel="match" href="class-1-ref.html"/>
+<meta name="assert" content="Verify that the class attribute affects CSS selectors.">
+<style>
+ mtext.fail { display: none; }
+ mtext.pass { background: green; }
+</style>
+</head>
+<body>
+
+ <p>Test passes if you see the text "PASS".</p>
+ <math>
+ <mtext class="fail" style="background: red; color: white;">FAIL</mtext>
+ <mtext class="pass" style="color: white;">PASS</mtext>
+ </math>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/class-2.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/class-2.html
new file mode 100644
index 00000000000..9dbede84019
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/class-2.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Class</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS1.SSS2">
+<meta name="assert" content="Verify whether the getElementsByClassName() works for MathML elements.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ setup({ explicit_done: true });
+ window.addEventListener("DOMContentLoaded", function() {
+ var mtext = document.getElementsByClassName("cl");
+ test(function() {
+ assert_equals(mtext.length, 3);
+ var mtext_ref = document.body.firstElementChild.firstElementChild;
+ mtext_ref = mtext_ref.nextElementSibling.nextElementSibling
+ assert_equals(mtext[0], mtext_ref);
+ mtext_ref = mtext_ref.nextElementSibling.nextElementSibling;
+ assert_equals(mtext[1], mtext_ref);
+ mtext_ref = mtext_ref.nextElementSibling.nextElementSibling;
+ assert_equals(mtext[2], mtext_ref);
+ }, "getElementsByClassName()");
+ done();
+ });
+</script>
+</head>
+<body>
+ <math>
+ <mtext class="cl_"></mtext>
+ <mtext class="c"></mtext>
+ <mtext class="cl"></mtext>
+ <mtext class="cl_"></mtext>
+ <mtext class="cl"></mtext>
+ <mtext class="c"></mtext>
+ <mtext class="cl"></mtext>
+ <mtext class="cl_"></mtext>
+ </math>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/color-attributes-1-ref.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/color-attributes-1-ref.html
new file mode 100644
index 00000000000..71ee8cea9db
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/color-attributes-1-ref.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>Color Attributes (reference)</title>
+<style>
+ #content > div {
+ position: absolute;
+ }
+</style>
+</head>
+<body>
+
+ <p>Test passes if you see the text below is written in white on a green
+ background.</p>
+
+ <div id="content">
+ <div>
+ <math style="background: green;">
+ <mtext style="color: white;">Hello World!</mtext>
+ </math>
+ </div>
+ </div>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/color-attributes-1.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/color-attributes-1.html
new file mode 100644
index 00000000000..b7bdf723e38
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/color-attributes-1.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>Color Attributes</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS1.SSS2"/>
+<meta name="assert" content="Verify that the mathcolor and mathbackground attributes are supported on the math element.">
+<link rel="match" href="color-attributes-1-ref.html"/>
+<style>
+ #content {
+ color: red;
+ }
+ #content > div {
+ position: absolute;
+ }
+</style>
+</head>
+<body>
+
+ <p>Test passes if you see the text below is written in white on a green
+ background.</p>
+
+ <div id="content">
+ <div>
+ <math style="background: red;">
+ <mtext style="visibility: hidden;">Hello World!</mtext>
+ </math>
+ </div>
+ <div>
+ <math mathcolor="white" mathbackground="green">
+ <mtext>Hello World!</mtext>
+ </math>
+ </div>
+ </div>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/display-1.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/display-1.html
new file mode 100644
index 00000000000..4eb302c3ee8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/display-1.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>MathML display attribute</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS1.SSS2">
+<meta name="assert" content="Verify that the display attribute on the math element is supported and impacts centering and line breaking with surrounding content.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ function getBox(aId) {
+ return document.getElementById(aId).getBoundingClientRect();
+ }
+ window.addEventListener("DOMContentLoaded", function() {
+ var content = getBox("content");
+
+ var before_block = getBox("before_block");
+ var mspace_block = getBox("mspace_block");
+ var after_block = getBox("after_block");
+ test(function() {
+ assert_approx_equals(before_block.left, content.left, 1,
+ "content before must be left aligned");
+ assert_approx_equals((mspace_block.left + mspace_block.right) / 2,
+ (content.left + content.right) / 2,
+ 1,
+ "math must be centered.");
+ assert_approx_equals(after_block.left, content.left, 1,
+ "content before must be left aligned");
+ assert_less_than_equal(before_block.bottom, mspace_block.top,
+ "new line before math");
+ assert_less_than_equal(mspace_block.bottom, after_block.top,
+ "new line after math");
+ }, "Test display math");
+
+ var before_inline = getBox("before_inline");
+ var mspace_inline = getBox("mspace_inline");
+ var after_inline = getBox("after_inline");
+ test(function() {
+ assert_approx_equals((before_inline.top + before_inline.bottom) / 2,
+ (mspace_inline.top + mspace_inline.bottom) / 2,
+ 1,
+ "content before must be horizontally aligned with math");
+ assert_approx_equals((after_inline.top + after_inline.bottom) / 2,
+ (mspace_inline.top + mspace_inline.bottom) / 2,
+ 1,
+ "content after must be horizontally aligned with math");
+ assert_less_than_equal(before_inline.right, mspace_inline.left,
+ "content before must be on the left of math");
+ assert_less_than_equal(mspace_inline.right, after_inline.left,
+ "content after must be on the right of math");
+ }, "Test inline math");
+
+ done();
+ });
+</script>
+<style>
+ #content {
+ width: 600px;
+ background: #ccc;
+ }
+ span.square {
+ display: inline-block;
+ width: 50px;
+ height: 50px;
+ background: black;
+ }
+ mspace {
+ background: black;
+ }
+</style>
+</head>
+<body>
+ <div id="content">
+ <span id="before_block" class="square"></span>
+ <math display="block"><mspace id="mspace_block" width="50px" height="50px"/></math>
+ <span id="after_block" class="square"></span>
+ <br/>
+ <span id="before_inline" class="square"></span>
+ <math display="inline"><mspace id="mspace_inline" width="50px" height="50px"/></math>
+ <span id="after_inline" class="square"></span>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/dynamic-1-ref.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/dynamic-1-ref.html
new file mode 100644
index 00000000000..5fa90e9d2fe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/dynamic-1-ref.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>Dynamic MathML DOM (reference)</title>
+<style>
+ mtext.pass { background: green; color: white; }
+</style>
+</head>
+<body>
+ <p>Test passes if you see the text "PASS".</p>
+ <math>
+ <mtext class="pass">PASS</mtext>
+ </math>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/dynamic-1.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/dynamic-1.html
new file mode 100644
index 00000000000..ab22ad13cdb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/dynamic-1.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>Dynamic MathML DOM</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS1.SSS1"/>
+<link rel="match" href="dynamic-1-ref.html"/>
+<meta name="assert" content="Verify that the MathML DOM tree can be modified via javascript and that the rendering is correctly updated.">
+<style>
+ mtext.fail { background: red; color: white; }
+ mtext.pass { background: green; color: white; }
+</style>
+<script>
+ window.addEventListener("DOMContentLoaded", function() {
+ var kMathMLNamespace = "http://www.w3.org/1998/Math/MathML";
+ var mtext = document.createElementNS(kMathMLNamespace, "mtext");
+ mtext.setAttribute("class", "pass");
+ mtext.textContent = "PASS";
+ var math = document.getElementsByTagNameNS(kMathMLNamespace, "math")[0];
+ math.replaceChild(mtext, math.firstElementChild);
+ });
+</script>
+</head>
+<body>
+ <p>Test passes if you see the text "PASS".</p>
+ <math>
+ <mtext class="fail">FAIL</mtext>
+ </math>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/href-click-1-ref.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/href-click-1-ref.html
new file mode 100644
index 00000000000..86952567c76
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/href-click-1-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>href click (reference)</title>
+</head>
+<body>
+
+ <p>This test passes if you see a green square.</p>
+
+ <div style="width: 150px; height: 150px; background: green">
+ </div>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/href-click-1.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/href-click-1.html
new file mode 100644
index 00000000000..e44df189d78
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/href-click-1.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>href click</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS1.SSS2">
+<link rel="match" href="href-click-1-ref.html"/>
+<meta name="assert" content="Verify that a click on a link moves to the target.">
+<script type="text/javascript">
+ function test()
+ {
+ var event = new MouseEvent('click', {bubbles: true, cancelable: true});
+ document.getElementById('link').dispatchEvent(event);
+ }
+</script>
+</head>
+<body onload="test()">
+
+ <p>This test passes if you see a green square.</p>
+
+ <div style="width: 150px; height: 150px; overflow: hidden">
+ <math>
+ <mrow id="link" href="#target">
+ <mspace id="space" width="150px" height="150px" mathbackground="red"/>
+ </mrow>
+ </math>
+ <div style="height: 500px;"></div>
+ <math id="target">
+ <mspace width="150px" height="150px" mathbackground="green"/>
+ </math>
+ </div>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/href-click-2-ref.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/href-click-2-ref.html
new file mode 100644
index 00000000000..86952567c76
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/href-click-2-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>href click (reference)</title>
+</head>
+<body>
+
+ <p>This test passes if you see a green square.</p>
+
+ <div style="width: 150px; height: 150px; background: green">
+ </div>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/href-click-2.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/href-click-2.html
new file mode 100644
index 00000000000..5c8dcfca9ae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/href-click-2.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>href click</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS1.SSS2">
+<link rel="match" href="href-click-2-ref.html"/>
+<meta name="assert" content="Verify that a click on an element bubbles to an ancestor link.">
+<script type="text/javascript">
+ function test()
+ {
+ var event = new MouseEvent('click', {bubbles: true, cancelable: true});
+ document.getElementById('space').dispatchEvent(event);
+ }
+</script>
+</head>
+<body onload="test()">
+
+ <p>This test passes if you see a green square.</p>
+
+ <div style="width: 150px; height: 150px; overflow: hidden">
+ <math>
+ <mrow href="#target">
+ <mrow>
+ <mrow>
+ <mspace id="space" width="150px" height="150px" mathbackground="red"/>
+ </mrow>
+ </mrow>
+ </mrow>
+ </math>
+ <div style="height: 500px;"></div>
+ <math id="target">
+ <mspace width="150px" height="150px" mathbackground="green"/>
+ </math>
+ </div>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/href-manual.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/href-manual.html
new file mode 100644
index 00000000000..7f24f20f4f2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/href-manual.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Manual click on a link</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS1.SSS2">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({explicit_timeout: true})
+function handler() {
+document.body.insertAdjacentHTML("beforeend",
+ "<span style='background: green; color: white;'>PASS</span>");
+}
+</script>
+</head>
+<body>
+ <p>Click on the one asterisk which is a link. If a "PASS" result appears the
+ test passes, otherwise it fails.</p>
+ <p>
+ <math style="font-size: 3em;">
+ <mtext>*****</mtext>
+ <mtext href="javascript:handler()">*</mtext>
+ <mtext>*****</mtext>
+ </math>
+ </p>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-1-ref.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-1-ref.html
new file mode 100644
index 00000000000..49877549670
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-1-ref.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>MathML inside foreignObject (reference)</title>
+</head>
+<body>
+ <p>Test passes if there is a green square and no red.</p>
+ <div>
+ <div style="position: absolute; width: 200px; height: 200px; background: green"></div>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-1.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-1.html
new file mode 100644
index 00000000000..b3ab19c7738
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-1.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>MathML inside foreignObject</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS1.SSS1"/>
+<link rel="match" href="integration-point-1-ref.html"/>
+<meta name="assert" content="Verify that MathML can be used inside a foreignObject element.">
+</head>
+<body>
+ <p>Test passes if there is a green square and no red.</p>
+ <div>
+ <div style="position: absolute; width: 200px; height: 200px; background: red"></div>
+ <div style="position: absolute;">
+ <svg width="200px" height="200px">
+ <rect width="200px" height="100px" fill="red"/>
+ <foreignObject width="200px" height="200px"
+ requiredExtensions="http://www.w3.org/1998/Math/MathML">
+ <div style="width: 200px; height: 200px; background: green"></div>
+ </foreignObject>
+ </svg>
+ </div>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-2-ref.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-2-ref.html
new file mode 100644
index 00000000000..33c4b7e9104
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-2-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>MathML as a phrasing content (reference)</title>
+</head>
+<body>
+ <p>Test passes if there is a green square and no red.</p>
+
+ <div>
+ <div style="position: absolute; background: green; width: 300px; height: 300px;"></div>
+ </div>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-2.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-2.html
new file mode 100644
index 00000000000..e970f9ec805
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-2.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>MathML as a phrasing content</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS1.SSS1"/>
+<link rel="match" href="integration-point-2-ref.html"/>
+<meta name="assert" content="Verify that MathML can be used at positions where phrasing content is accepted.">
+<style type="text/css">
+ span, math { font-family: monospace; font-size: 10px; }
+ div {
+ color: green;
+ }
+ span.redsquare {
+ display: inline-block;
+ width: 10px;
+ height: 10px;
+ background: red;
+ }
+ mspace {
+ background: green;
+ }
+</style>
+</head>
+<body>
+ <p>Test passes if there is a green square and no red.</p>
+
+ <div>
+
+ <div style="position: absolute; background: green; width: 300px; height: 300px;">
+ <p><span class="redsquare"></span></p>
+ <h1><span class="redsquare"></span></h1>
+ <h2><span class="redsquare"></span></h2>
+ <ul>
+ <li><span class="redsquare"></span></li>
+ </ul>
+ <ol>
+ <li><span class="redsquare"></span></li>
+ </ol>
+ <table><tr><td><span class="redsquare"></span></td></tr></table>
+ <a href="#id"><span class="redsquare"></span></a>
+ <em><span class="redsquare"></span></em>
+ <strong><span class="redsquare"></span></strong>
+ <small><span class="redsquare"></span></small>
+ <span><span class="redsquare"></span></span>
+ <u><span class="redsquare"></span></u>
+ <q><span class="redsquare"></span></q>
+ </div>
+ <div style="position: absolute; width: 400px;">
+ <p><math><mspace width="10px" height="10px"/></math></p>
+ <h1><math><mspace width="10px" height="10px"/></math></h1>
+ <h2><math><mspace width="10px" height="10px"/></math></h2>
+ <ul>
+ <li><math><mspace width="10px" height="10px"/></math></li>
+ </ul>
+ <ol>
+ <li><math><mspace width="10px" height="10px"/></math></li>
+ </ol>
+ <table><tr><td><math><mspace width="10px" height="10px"/></math></td></tr></table>
+ <a href="#id"><math><mspace width="10px" height="10px"/></math></a>
+ <em><math><mspace width="10px" height="10px"/></math></em>
+ <strong><math><mspace width="10px" height="10px"/></math></strong>
+ <small><math><mspace width="10px" height="10px"/></math></small>
+ <span><math><mspace width="10px" height="10px"/></math></span>
+ <u><math><mspace width="10px" height="10px"/></math></u>
+ <q><math><mspace width="10px" height="10px"/></math></q>
+ </div>
+
+ </div>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-3-ref.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-3-ref.html
new file mode 100644
index 00000000000..8362ed28e35
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-3-ref.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>phrasing content inside mtext (reference)</title>
+</head>
+<body>
+ <p>Test passes if there is a green square and no red.</p>
+
+ <div>
+
+ <div style="position: absolute; background: green; width: 200px; height: 200px;"></div>
+
+ </div>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-3.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-3.html
new file mode 100644
index 00000000000..8132acc6d7c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/integration-point-3.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>phrasing content inside mtext</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS1.SSS1"/>
+<link rel="match" href="integration-point-3-ref.html"/>
+<meta name="assert" content="Verify that <mtext> can contain phrasing content">
+<style type="text/css">
+ div {
+ color: green;
+ }
+ span, math, mtext { font-family: monospace; font-size: 10px; }
+ span.redsquare, span.greensquare {
+ display: inline-block;
+ width: 10px;
+ height: 10px;
+ }
+ span.redsquare {
+ background: red;
+ }
+ span.greensquare {
+ background: green;
+ }
+ mspace {
+ background: green;
+ }
+</style>
+</head>
+<body>
+ <p>Test passes if there is a green square and no red.</p>
+
+ <div>
+
+ <div style="position: absolute; background: green; width: 200px; height: 200px;">
+ <span><span><span><span class="redsquare"></span></span></span></span>
+ <span><span><u><span class="redsquare"></span></u></span></span>
+ <span><span><a href="#id"><span class="redsquare"></span></a></span></span>
+ <span><span><del><span class="redsquare"></span></del></span></span>
+ <span><span><em><span class="redsquare"></span></em></span></span>
+ <span><span><strong><span class="redsquare"></span></strong></span></span>
+ <span><span><q><span class="redsquare"></span></q></span></span>
+ <span><span><small><span class="redsquare"></span></small></span></span>
+ <span><span><var><span class="redsquare"></span></var></span></span>
+ <span><span><samp><span class="redsquare"></span></samp></span></span>
+ </div>
+ <div style="position: absolute; width: 200px;">
+ <math><mtext><span><span class="greensquare"></span></span></mtext></math>
+ <math><mtext><u><span class="greensquare"></span></u></mtext></math>
+ <math><mtext><a href="#id"><span class="greensquare"></span></a></mtext></math>
+ <math><mtext><del><span class="greensquare"></span></del></mtext></math>
+ <math><mtext><em><span class="greensquare"></span></em></mtext></math>
+ <math><mtext><strong><span class="greensquare"></span></strong></mtext></math>
+ <math><mtext><q><span class="greensquare"></span></q></mtext></math>
+ <math><mtext><small><span class="greensquare"></span></small></mtext></math>
+ <math><mtext><var><span class="greensquare"></span></var></mtext></math>
+ <math><mtext><samp><span class="greensquare"></span></samp></mtext></math>
+ </div>
+
+ </div>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/required-extensions-1.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/required-extensions-1.html
new file mode 100644
index 00000000000..795f516671a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/required-extensions-1.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>SVG requiredExtensions</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS1">
+<meta name="assert" content="Verify whether the MathML namespace is recognized as a required extensions of SVG foreignObject when using the hasExtension javascript function.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ test(function() {
+ assert_true(document.createElementNS("http://www.w3.org/2000/svg", "foreignObject").hasExtension("http://www.w3.org/1998/Math/MathML"))
+ }, "Testing foreignObject.hasExtension('http://www.w3.org/1998/Math/MathML')");
+</script>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/required-extensions-2-ref.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/required-extensions-2-ref.html
new file mode 100644
index 00000000000..dcc5b2b7d33
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/required-extensions-2-ref.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>SVG requiredExtensions (reference)</title>
+</head>
+<body>
+ <p>Test passes if there is a green square and no red.</p>
+ <svg width="200px" height="200px">
+ <rect width="200px" height="200px" fill="green"/>
+ </svg>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/required-extensions-2.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/required-extensions-2.html
new file mode 100644
index 00000000000..b49bddaa69d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/required-extensions-2.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>SVG requiredExtensions</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS1.SSS1"/>
+<link rel="match" href="required-extensions-2-ref.html"/>
+<meta name="assert" content="Verify that a foreignObject with MathML used as a requiredExtensions value is selected for display in a SVG switch element.">
+</head>
+<body>
+ <p>Test passes if there is a green square and no red.</p>
+ <svg width="200px" height="200px">
+ <rect width="200px" height="100px" fill="red"/>
+ <switch>
+ <foreignObject width="200px" height="200px"
+ requiredExtensions="http://www.w3.org/1998/Math/MathML">
+ <div style="width: 200px; height: 200px; background: green"></div>
+ </foreignObject>
+ <rect y="100px" width="200px" height="100px" fill="red"/>
+ </switch>
+ </svg>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-1-iframe.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-1-iframe.html
new file mode 100644
index 00000000000..6b3ab07f1aa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-1-iframe.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>Unique Identifier (iframe)</title>
+</head>
+<body>
+
+ <div style="width: 100px; height: 500px;">
+ <math><mtext style="background: red; color: white;">FAIL</mtext></math>
+ </div>
+ <div style="width: 100px; height: 500px;">
+ <math><mtext style="background: green; color: white;"
+ id="PASS">PASS</mtext></math>
+ </div>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-1-ref-iframe.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-1-ref-iframe.html
new file mode 100644
index 00000000000..ade0110a27e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-1-ref-iframe.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>Unique Identifier (iframe reference)</title>
+</head>
+<body>
+
+ <div style="width: 100px; height: 500px;">
+ <math><mtext style="background: green; color: white;"
+ id="PASS" class="pass">PASS</mtext></math>
+ </div>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-1-ref.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-1-ref.html
new file mode 100644
index 00000000000..575a27a25ee
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-1-ref.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>Unique identifier (reference)</title>
+</head>
+<body>
+
+ <p>Test passes if you see the text "PASS".</p>
+
+ <iframe width="100" height="100" frameborder="0" scrolling="no"
+ marginheight="0" marginwidth="0"
+ src="unique-identifier-1-ref-iframe.html#PASS"></iframe>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-1.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-1.html
new file mode 100644
index 00000000000..357e99229e9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-1.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>Unique identifier</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS1.SSS2"/>
+<link rel="match" href="unique-identifier-1-ref.html"/>
+<meta name="assert" content="Verify that the id on a MathML element can be used as a fragment identifier in order to force initial scrolling.">
+</head>
+<body>
+
+ <p>Test passes if you see the text "PASS".</p>
+
+ <iframe width="100" height="100" frameborder="0" scrolling="no"
+ marginheight="0" marginwidth="0"
+ src="unique-identifier-1-iframe.html#PASS"></iframe>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-2.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-2.html
new file mode 100644
index 00000000000..b3226c293b5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-2.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Unique Identifier</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS1.SSS2">
+<meta name="assert" content="Verify whether the getElementById() works for MathML elements.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ setup({ explicit_done: true });
+ window.addEventListener("DOMContentLoaded", function() {
+ var mtext = document.getElementById("MTEXT");
+ test(function() {
+ assert_equals(mtext, document.body.firstElementChild.lastElementChild);
+ }, "getElementById()");
+ done();
+ });
+</script>
+</head>
+<body>
+ <math>
+ <mtext id="MTEXT_"></mtext>
+ <mtext id="MTEX"></mtext>
+ <mtext id="MTEXT"></mtext>
+ </math>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-3-ref.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-3-ref.html
new file mode 100644
index 00000000000..ef056e00826
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-3-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>Unique identifier 3 (reference)</title>
+</head>
+<body>
+
+ <p>Test passes if you see the text "PASS".</p>
+ <math>
+ <mtext style="background: green; color: white;">PASS</mtext>
+ </math>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-3.html b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-3.html
new file mode 100644
index 00000000000..5d66e133ab0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/html5-tree/unique-identifier-3.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>Unique Identifier</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS1.SSS2"/>
+<link rel="match" href="unique-identifier-3-ref.html"/>
+<meta name="assert" content="Verify that the id attribute affects CSS selectors.">
+<style>
+ #fail { display: none; }
+ #pass { background: green; }
+</style>
+</head>
+<body>
+
+ <p>Test passes if you see the text "PASS".</p>
+ <math>
+ <mtext id="fail" style="background: red; color: white;">FAIL</mtext>
+ <mtext id="pass" style="color: white;">PASS</mtext>
+ </math>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/text-and-math/use-typo-metrics-1-ref.html b/tests/wpt/web-platform-tests/mathml/relations/text-and-math/use-typo-metrics-1-ref.html
new file mode 100644
index 00000000000..3f7f7640458
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/text-and-math/use-typo-metrics-1-ref.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<meta charset="utf-8"/>
+<title>Open Font Format: USE_TYPO_METRICS (reference)</title>
+<style>
+ #green {
+ position: absolute;
+ background: green;
+ left: 10px;
+ width: 230px;
+ height: 230px;
+ }
+</style>
+<body>
+ <p>Test passes if there is a green square and no red.</p>
+
+ <div>
+ <div id="green"></div>
+ </div>
+</body>
diff --git a/tests/wpt/web-platform-tests/mathml/relations/text-and-math/use-typo-metrics-1.html b/tests/wpt/web-platform-tests/mathml/relations/text-and-math/use-typo-metrics-1.html
new file mode 100644
index 00000000000..081d66b6321
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/relations/text-and-math/use-typo-metrics-1.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<meta charset="utf-8"/>
+<title>Open Font Format: USE_TYPO_METRICS</title>
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS2.SSS1"/>
+<link rel="match" href="use-typo-metrics-1-ref.html"/>
+<meta name="assert" content="Verify that the USE_TYPO_METRICS flag from the OS/2 table is taken into account to calculate line height.">
+<style>
+ @font-face {
+ font-family: TestFont;
+ src: url("/fonts/math/lineheight5000-typolineheight2300.woff");
+ }
+ .green {
+ position: absolute;
+ background: green;
+ width: 115px;
+ }
+ .red {
+ position: absolute;
+ background: red;
+ width: 115px;
+ }
+ .forceHeight {
+ height: 230px;
+ }
+ .leftSide {
+ left: 10px;
+ }
+ .rightSide {
+ left: 125px;
+ }
+ span {
+ /* em=1000, lineHeight=5000, typoLineHeight=2300 and font-size=100px
+ implies typoLineHeightPx = 230px < 500px = lineHeightPx */
+ font-family: TestFont;
+ font-size: 100px;
+ color: transparent;
+ }
+</style>
+<body>
+ <p>Test passes if there is a green square and no red.</p>
+
+ <div>
+ <!-- Left side verifies that typoLineHeightPx <= 230px -->
+ <div class="leftSide red"><span>O</span></div>
+ <div class="leftSide green forceHeight"></div>
+
+ <!-- Right side verifies that typoLineHeightPx => 230px -->
+ <div class="rightSide red forceHeight"></div>
+ <div class="rightSide green"><span>O</span></div>
+ </div>
+</body>
diff --git a/tests/wpt/web-platform-tests/mathml/tools/axisheight.py b/tests/wpt/web-platform-tests/mathml/tools/axisheight.py
new file mode 100644
index 00000000000..43827e70316
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/tools/axisheight.py
@@ -0,0 +1,23 @@
+#!/usr/bin/python
+
+from utils import mathfont
+import fontforge
+
+verticalArrowCodePoint = 0x21A8
+v1 = 5 * mathfont.em
+v2 = 14 * mathfont.em
+f = mathfont.create("axisheight%d-verticalarrow%d" % (v1, v2))
+f.math.AxisHeight = v1
+mathfont.createSquareGlyph(f, verticalArrowCodePoint)
+g = f.createChar(-1, "size1")
+mathfont.drawRectangleGlyph(g, mathfont.em, v2 / 2, 0)
+g = f.createChar(-1, "size2")
+mathfont.drawRectangleGlyph(g, mathfont.em, v2, 0)
+g = f.createChar(-1, "bot")
+mathfont.drawRectangleGlyph(g, mathfont.em, v2 + v1, 0)
+g = f.createChar(-1, "ext")
+mathfont.drawRectangleGlyph(g, mathfont.em, mathfont.em, 0)
+f[verticalArrowCodePoint].verticalVariants = "uni21A8 size1 size2"
+f[verticalArrowCodePoint].verticalComponents = \
+ (("bot", False, 0, 0, mathfont.em), ("ext", True, 0, 0, mathfont.em));
+mathfont.save(f)
diff --git a/tests/wpt/web-platform-tests/mathml/tools/fractions.py b/tests/wpt/web-platform-tests/mathml/tools/fractions.py
new file mode 100644
index 00000000000..8652806b297
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/tools/fractions.py
@@ -0,0 +1,153 @@
+#!/usr/bin/python
+
+from utils import mathfont
+import fontforge
+
+v1 = 7 * mathfont.em
+v2 = 1 * mathfont.em
+f = mathfont.create("fraction-axisheight%d-rulethickness%d" % (v1, v2))
+f.math.AxisHeight = v1
+f.math.FractionDenominatorDisplayStyleGapMin = 0
+f.math.FractionDenominatorDisplayStyleShiftDown = 0
+f.math.FractionDenominatorGapMin = 0
+f.math.FractionDenominatorShiftDown = 0
+f.math.FractionNumeratorDisplayStyleGapMin = 0
+f.math.FractionNumeratorDisplayStyleShiftUp = 0
+f.math.FractionNumeratorGapMin = 0
+f.math.FractionNumeratorShiftUp = 0
+f.math.FractionRuleThickness = v2
+mathfont.save(f)
+
+v1 = 5 * mathfont.em
+v2 = 1 * mathfont.em
+f = mathfont.create("fraction-denominatordisplaystylegapmin%d-rulethickness%d" % (v1, v2))
+f.math.AxisHeight = 0
+f.math.FractionDenominatorDisplayStyleGapMin = v1
+f.math.FractionDenominatorDisplayStyleShiftDown = 0
+f.math.FractionDenominatorGapMin = 0
+f.math.FractionDenominatorShiftDown = 0
+f.math.FractionNumeratorDisplayStyleGapMin = 0
+f.math.FractionNumeratorDisplayStyleShiftUp = 0
+f.math.FractionNumeratorGapMin = 0
+f.math.FractionNumeratorShiftUp = 0
+f.math.FractionRuleThickness = v2
+mathfont.save(f)
+
+v1 = 6 * mathfont.em
+v2 = 1 * mathfont.em
+f = mathfont.create("fraction-denominatordisplaystyleshiftdown%d-rulethickness%d" % (v1, v2))
+f.math.AxisHeight = 0
+f.math.FractionDenominatorDisplayStyleGapMin = 0
+f.math.FractionDenominatorDisplayStyleShiftDown = v1
+f.math.FractionDenominatorGapMin = 0
+f.math.FractionDenominatorShiftDown = 0
+f.math.FractionNumeratorDisplayStyleGapMin = 0
+f.math.FractionNumeratorDisplayStyleShiftUp = 0
+f.math.FractionNumeratorGapMin = 0
+f.math.FractionNumeratorShiftUp = 0
+f.math.FractionRuleThickness = v2
+mathfont.save(f)
+
+v1 = 4 * mathfont.em
+v2 = 1 * mathfont.em
+f = mathfont.create("fraction-denominatorgapmin%d-rulethickness%d" % (v1, v2))
+f.math.AxisHeight = 0
+f.math.FractionDenominatorDisplayStyleGapMin = 0
+f.math.FractionDenominatorDisplayStyleShiftDown = 0
+f.math.FractionDenominatorGapMin = v1
+f.math.FractionDenominatorShiftDown = 0
+f.math.FractionNumeratorDisplayStyleGapMin = 0
+f.math.FractionNumeratorDisplayStyleShiftUp = 0
+f.math.FractionNumeratorGapMin = 0
+f.math.FractionNumeratorShiftUp = 0
+f.math.FractionRuleThickness = v2
+mathfont.save(f)
+
+v1 = 3 * mathfont.em
+v2 = 1 * mathfont.em
+f = mathfont.create("fraction-denominatorshiftdown%d-rulethickness%d" % (v1, v2))
+f.math.AxisHeight = 0
+f.math.FractionDenominatorDisplayStyleGapMin = 0
+f.math.FractionDenominatorDisplayStyleShiftDown = 0
+f.math.FractionDenominatorGapMin = 0
+f.math.FractionDenominatorShiftDown = v1
+f.math.FractionNumeratorDisplayStyleGapMin = 0
+f.math.FractionNumeratorDisplayStyleShiftUp = 0
+f.math.FractionNumeratorGapMin = 0
+f.math.FractionNumeratorShiftUp = 0
+f.math.FractionRuleThickness = v2
+mathfont.save(f)
+
+v1 = 8 * mathfont.em
+v2 = 1 * mathfont.em
+f = mathfont.create("fraction-numeratordisplaystylegapmin%d-rulethickness%d" % (v1, v2))
+f.math.AxisHeight = 0
+f.math.FractionDenominatorDisplayStyleGapMin = 0
+f.math.FractionDenominatorDisplayStyleShiftDown = 0
+f.math.FractionDenominatorGapMin = 0
+f.math.FractionDenominatorShiftDown = 0
+f.math.FractionNumeratorDisplayStyleGapMin = v1
+f.math.FractionNumeratorDisplayStyleShiftUp = 0
+f.math.FractionNumeratorGapMin = 0
+f.math.FractionNumeratorShiftUp = 0
+f.math.FractionRuleThickness = v2
+mathfont.save(f)
+
+v1 = 2 * mathfont.em
+v2 = 1 * mathfont.em
+f = mathfont.create("fraction-numeratordisplaystyleshiftup%d-rulethickness%d" % (v1, v2))
+f.math.AxisHeight = 0
+f.math.FractionDenominatorDisplayStyleGapMin = 0
+f.math.FractionDenominatorDisplayStyleShiftDown = 0
+f.math.FractionDenominatorGapMin = 0
+f.math.FractionDenominatorShiftDown = 0
+f.math.FractionNumeratorDisplayStyleGapMin = 0
+f.math.FractionNumeratorDisplayStyleShiftUp = v1
+f.math.FractionNumeratorGapMin = 0
+f.math.FractionNumeratorShiftUp = 0
+f.math.FractionRuleThickness = v2
+mathfont.save(f)
+
+v1 = 9 * mathfont.em
+v2 = 1 * mathfont.em
+f = mathfont.create("fraction-numeratorgapmin%d-rulethickness%d" % (v1, v2))
+f.math.AxisHeight = 0
+f.math.FractionDenominatorDisplayStyleGapMin = 0
+f.math.FractionDenominatorDisplayStyleShiftDown = 0
+f.math.FractionDenominatorGapMin = 0
+f.math.FractionDenominatorShiftDown = 0
+f.math.FractionNumeratorDisplayStyleGapMin = 0
+f.math.FractionNumeratorDisplayStyleShiftUp = 0
+f.math.FractionNumeratorGapMin = v1
+f.math.FractionNumeratorShiftUp = 0
+f.math.FractionRuleThickness = v2
+mathfont.save(f)
+
+v1 = 11 * mathfont.em
+v2 = 1 * mathfont.em
+f = mathfont.create("fraction-numeratorshiftup%d-rulethickness%d" % (v1, v2))
+f.math.AxisHeight = 0
+f.math.FractionDenominatorDisplayStyleGapMin = 0
+f.math.FractionDenominatorDisplayStyleShiftDown = 0
+f.math.FractionDenominatorGapMin = 0
+f.math.FractionDenominatorShiftDown = 0
+f.math.FractionNumeratorDisplayStyleGapMin = 0
+f.math.FractionNumeratorDisplayStyleShiftUp = 0
+f.math.FractionNumeratorGapMin = 0
+f.math.FractionNumeratorShiftUp = v1
+f.math.FractionRuleThickness = v2
+mathfont.save(f)
+
+v1 = 10 * mathfont.em
+f = mathfont.create("fraction-rulethickness%d" % v1)
+f.math.AxisHeight = 0
+f.math.FractionDenominatorDisplayStyleGapMin = 0
+f.math.FractionDenominatorDisplayStyleShiftDown = 0
+f.math.FractionDenominatorGapMin = 0
+f.math.FractionDenominatorShiftDown = 0
+f.math.FractionNumeratorDisplayStyleGapMin = 0
+f.math.FractionNumeratorDisplayStyleShiftUp = 0
+f.math.FractionNumeratorGapMin = 0
+f.math.FractionNumeratorShiftUp = 0
+f.math.FractionRuleThickness = v1
+mathfont.save(f)
diff --git a/tests/wpt/web-platform-tests/mathml/tools/largeop.py b/tests/wpt/web-platform-tests/mathml/tools/largeop.py
new file mode 100644
index 00000000000..3c9c6c4c949
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/tools/largeop.py
@@ -0,0 +1,14 @@
+#!/usr/bin/python
+
+from utils import mathfont
+import fontforge
+
+nAryWhiteVerticalBarCodePoint = 0x2AFF
+v1 = 5 * mathfont.em
+f = mathfont.create("largeop-displayoperatorminheight%d" % v1)
+f.math.DisplayOperatorMinHeight = v1
+mathfont.createSquareGlyph(f, nAryWhiteVerticalBarCodePoint)
+g = f.createChar(-1, "uni2AFF.display")
+mathfont.drawRectangleGlyph(g, mathfont.em, v1, 0)
+f[nAryWhiteVerticalBarCodePoint].verticalVariants = "uni2AFF uni2AFF.display"
+mathfont.save(f)
diff --git a/tests/wpt/web-platform-tests/mathml/tools/limits.py b/tests/wpt/web-platform-tests/mathml/tools/limits.py
new file mode 100644
index 00000000000..840a76ffb1a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/tools/limits.py
@@ -0,0 +1,74 @@
+#!/usr/bin/python
+
+from utils import mathfont
+import fontforge
+
+nArySumCodePoint = 0x2211 # largeop operator
+
+v = 3 * mathfont.em
+f = mathfont.create("limits-lowerlimitbaselinedropmin%d" % v)
+mathfont.createSquareGlyph(f, nArySumCodePoint)
+f.math.LowerLimitBaselineDropMin = v
+f.math.LowerLimitGapMin = 0
+f.math.OverbarExtraAscender = 0
+f.math.OverbarVerticalGap = 0
+f.math.StretchStackBottomShiftDown = 0
+f.math.StretchStackGapAboveMin = 0
+f.math.StretchStackGapBelowMin = 0
+f.math.StretchStackTopShiftUp = 0
+f.math.UnderbarExtraDescender = 0
+f.math.UnderbarVerticalGap = 0
+f.math.UpperLimitBaselineRiseMin = 0
+f.math.UpperLimitGapMin = 0
+mathfont.save(f)
+
+v = 11 * mathfont.em
+f = mathfont.create("limits-lowerlimitgapmin%d" % v)
+mathfont.createSquareGlyph(f, nArySumCodePoint)
+f.math.LowerLimitBaselineDropMin = 0
+f.math.LowerLimitGapMin = v
+f.math.OverbarExtraAscender = 0
+f.math.OverbarVerticalGap = 0
+f.math.StretchStackBottomShiftDown = 0
+f.math.StretchStackGapAboveMin = 0
+f.math.StretchStackGapBelowMin = 0
+f.math.StretchStackTopShiftUp = 0
+f.math.UnderbarExtraDescender = 0
+f.math.UnderbarVerticalGap = 0
+f.math.UpperLimitBaselineRiseMin = 0
+f.math.UpperLimitGapMin = 0
+mathfont.save(f)
+
+v = 5 * mathfont.em
+f = mathfont.create("limits-upperlimitbaselinerisemin%d" % v)
+mathfont.createSquareGlyph(f, nArySumCodePoint)
+f.math.LowerLimitBaselineDropMin = 0
+f.math.LowerLimitGapMin = 0
+f.math.OverbarExtraAscender = 0
+f.math.OverbarVerticalGap = 0
+f.math.StretchStackBottomShiftDown = 0
+f.math.StretchStackGapAboveMin = 0
+f.math.StretchStackGapBelowMin = 0
+f.math.StretchStackTopShiftUp = 0
+f.math.UnderbarExtraDescender = 0
+f.math.UnderbarVerticalGap = 0
+f.math.UpperLimitBaselineRiseMin = v
+f.math.UpperLimitGapMin = 0
+mathfont.save(f)
+
+v = 7 * mathfont.em
+f = mathfont.create("limits-upperlimitgapmin%d" % v)
+mathfont.createSquareGlyph(f, nArySumCodePoint)
+f.math.LowerLimitBaselineDropMin = 0
+f.math.LowerLimitGapMin = 0
+f.math.OverbarExtraAscender = 0
+f.math.OverbarVerticalGap = 0
+f.math.StretchStackBottomShiftDown = 0
+f.math.StretchStackGapAboveMin = 0
+f.math.StretchStackGapBelowMin = 0
+f.math.StretchStackTopShiftUp = 0
+f.math.UnderbarExtraDescender = 0
+f.math.UnderbarVerticalGap = 0
+f.math.UpperLimitBaselineRiseMin = 0
+f.math.UpperLimitGapMin = v
+mathfont.save(f)
diff --git a/tests/wpt/web-platform-tests/mathml/tools/mathvariant-transforms.py b/tests/wpt/web-platform-tests/mathml/tools/mathvariant-transforms.py
new file mode 100644
index 00000000000..ede678cc1df
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/tools/mathvariant-transforms.py
@@ -0,0 +1,127 @@
+#!/usr/bin/python
+
+from __future__ import print_function
+from lxml import etree
+from utils.misc import downloadWithProgressBar
+from utils import mathfont
+import json
+
+# Retrieve the unicode.xml file if necessary.
+unicodeXML = downloadWithProgressBar("http://www.w3.org/2003/entities/2007xml/unicode.xml")
+
+# Extract the mathvariants transformation.
+xsltTransform = etree.XSLT(etree.XML('''\
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:strip-space elements="*"/>
+ <xsl:template match="charlist">
+ <root><xsl:apply-templates select="character"/></root>
+ </xsl:template>
+ <xsl:template match="character">
+ <xsl:if test="surrogate">
+ <entry>
+ <xsl:attribute name="mathvariant">
+ <xsl:value-of select="surrogate/@mathvariant"/>
+ </xsl:attribute>
+ <xsl:attribute name="baseChar">
+ <xsl:value-of select="surrogate/@ref"/>
+ </xsl:attribute>
+ <xsl:attribute name="transformedChar">
+ <xsl:choose>
+ <xsl:when test="bmp">
+ <xsl:value-of select="bmp/@ref"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@id"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </entry>
+ </xsl:if>
+ </xsl:template>
+</xsl:stylesheet>'''))
+
+# Put the mathvariant transforms into a Python structure.
+mathvariantTransforms = {}
+root = xsltTransform(etree.parse(unicodeXML)).getroot()
+def parseCodePoint(aHexaString):
+ return int("0x%s" % aHexaString[1:], 16)
+for entry in root:
+ mathvariant = entry.get("mathvariant")
+ baseChar = parseCodePoint(entry.get("baseChar"))
+ transformedChar = parseCodePoint(entry.get("transformedChar"))
+ if mathvariant not in mathvariantTransforms:
+ mathvariantTransforms[mathvariant] = {}
+ mathvariantTransforms[mathvariant][baseChar] = transformedChar
+
+# There is no "isolated" mathvariant.
+del mathvariantTransforms["isolated"]
+
+# Create a WOFF font for each mathvariant.
+for mathvariant in mathvariantTransforms:
+ font = mathfont.create("mathvariant-%s" % mathvariant)
+ for baseChar in mathvariantTransforms[mathvariant]:
+ if baseChar not in font:
+ mathfont.createGlyphFromValue(font, baseChar)
+ transformedChar = mathvariantTransforms[mathvariant][baseChar]
+ mathfont.createGlyphFromValue(font, transformedChar)
+ mathfont.save(font)
+
+# Create a test font for each mathvariant.
+for mathvariant in mathvariantTransforms:
+ print("Generating test for %s..." % mathvariant, end="")
+ reftest = open("../relations/css-styling/mathvariant-%s.html" % mathvariant, "w")
+ reftestReference = open("../relations/css-styling/mathvariant-%s-ref.html" % mathvariant, "w")
+ source = '\
+<!DOCTYPE html>\n\
+<html>\n\
+<head>\n\
+<meta charset="utf-8"/>\n\
+<title>mathvariant %s</title>\n'
+ reftest.write(source % mathvariant)
+ reftestReference.write(source % ("%s (reference)" % mathvariant))
+ source ='\
+<link rel="help" href="http://www.mathml-association.org/MathMLinHTML5/S2.html#SS3.SSS1.tab2"/>\n\
+<link rel="match" href="mathvariant-%s-ref.html"/>\n\
+<meta name="assert" content="Verify that a single-char <mi> with a %s mathvariant is equivalent to an <mi> with the transformed unicode character.">\n'
+ reftest.write(source % (mathvariant, mathvariant))
+ source = '\
+<style>\n\
+ @font-face {\n\
+ font-family: TestFont;\n\
+ src: url("/fonts/math/mathvariant-%s.woff");\n\
+ }\n\
+ body > span {\n\
+ padding: 10px;\n\
+ }\n\
+ span > span {\n\
+ font-family: monospace;\n\
+ font-size: 10px;\n\
+ }\n\
+ math {\n\
+ font-family: TestFont;\n\
+ font-size: 10px;\n\
+ }\n\
+</style>\n\
+<body>\n\
+ <!-- Generated by mathml/tools/mathvariant.py; DO NOT EDIT. -->\n\
+ <p>Test passes if all the equalities below are true.</p>\n' % mathvariant
+ reftest.write(source)
+ reftestReference.write(source)
+ charIndex = 0
+ for baseChar in mathvariantTransforms[mathvariant]:
+ transformedChar = mathvariantTransforms[mathvariant][baseChar]
+ reftest.write(' <span><math><mi mathvariant="%s">&#x%0X;</mi></math>=<span>%05X</span></span>' % (mathvariant, baseChar, transformedChar))
+ reftestReference.write(' <span><math><mi>&#x%0X;</mi></math>=<span>%05X</span></span>' % (transformedChar, transformedChar))
+ charIndex += 1
+ if charIndex % 10 == 0:
+ reftest.write('<br/>')
+ reftestReference.write('<br/>')
+ reftest.write('\n')
+ reftestReference.write('\n')
+ source = '</body>\n</html>\n'
+ reftest.write(source)
+ reftestReference.write(source)
+ reftest.close()
+ reftestReference.close()
+ print(" done.")
diff --git a/tests/wpt/web-platform-tests/mathml/tools/radicals.py b/tests/wpt/web-platform-tests/mathml/tools/radicals.py
new file mode 100644
index 00000000000..90fe1d9cc1e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/tools/radicals.py
@@ -0,0 +1,109 @@
+#!/usr/bin/python
+
+from utils import mathfont
+import fontforge
+
+def createStretchyRadical(aFont):
+ radicalCodePoint = 0x221a
+ mathfont.createSquareGlyph(aFont, radicalCodePoint)
+ g = aFont.createChar(-1, "size1")
+ mathfont.drawRectangleGlyph(g, mathfont.em, 2 * mathfont.em, 0)
+ g = aFont.createChar(-1, "size2")
+ mathfont.drawRectangleGlyph(g, mathfont.em, 3 * mathfont.em, 0)
+ g = aFont.createChar(-1, "size3")
+ mathfont.drawRectangleGlyph(g, mathfont.em, 4 * mathfont.em, 0)
+ overlap = mathfont.em / 2
+ aFont[radicalCodePoint].verticalVariants = "radical size1 size2 size3"
+ aFont[radicalCodePoint].verticalComponents = \
+ (("size2", False, 0, mathfont.em, 3 * mathfont.em), \
+ ("size1", True, mathfont.em, mathfont.em, 2 * mathfont.em))
+
+v1 = 25
+v2 = 1 * mathfont.em
+f = mathfont.create("radical-degreebottomraisepercent%d-rulethickness%d" % (v1, v2))
+createStretchyRadical(f)
+f.math.RadicalDegreeBottomRaisePercent = v1
+f.math.RadicalDisplayStyleVerticalGap = 0
+f.math.RadicalExtraAscender = 0
+f.math.RadicalKernAfterDegree = 0
+f.math.RadicalKernBeforeDegree = 0
+f.math.RadicalRuleThickness = v2
+f.math.RadicalVerticalGap = 0
+mathfont.save(f)
+
+v1 = 7 * mathfont.em
+v2 = 1 * mathfont.em
+f = mathfont.create("radical-displaystyleverticalgap%d-rulethickness%d" % (v1, v2))
+createStretchyRadical(f)
+f.math.RadicalDegreeBottomRaisePercent = 0
+f.math.RadicalDisplayStyleVerticalGap = v1
+f.math.RadicalExtraAscender = 0
+f.math.RadicalKernAfterDegree = 0
+f.math.RadicalKernBeforeDegree = 0
+f.math.RadicalRuleThickness = v2
+f.math.RadicalVerticalGap = 0
+mathfont.save(f)
+
+v1 = 3 * mathfont.em
+v2 = 1 * mathfont.em
+f = mathfont.create("radical-extraascender%d-rulethickness%d" % (v1, v2))
+createStretchyRadical(f)
+f.math.RadicalDegreeBottomRaisePercent = 0
+f.math.RadicalDisplayStyleVerticalGap = 0
+f.math.RadicalExtraAscender = v1
+f.math.RadicalKernAfterDegree = 0
+f.math.RadicalKernBeforeDegree = 0
+f.math.RadicalRuleThickness = v2
+f.math.RadicalVerticalGap = 0
+mathfont.save(f)
+
+v1 = 5 * mathfont.em
+v2 = 1 * mathfont.em
+f = mathfont.create("radical-kernafterdegreeminus%d-rulethickness%d" % (v1, v2))
+createStretchyRadical(f)
+f.math.RadicalDegreeBottomRaisePercent = 0
+f.math.RadicalDisplayStyleVerticalGap = 0
+f.math.RadicalExtraAscender = 0
+f.math.RadicalKernAfterDegree = -v1
+f.math.RadicalKernBeforeDegree = 0
+f.math.RadicalRuleThickness = v2
+f.math.RadicalVerticalGap = 0
+mathfont.save(f)
+
+v1 = 4 * mathfont.em
+v2 = 1 * mathfont.em
+f = mathfont.create("radical-kernbeforedegree%d-rulethickness%d" % (v1, v2))
+createStretchyRadical(f)
+f.math.RadicalDegreeBottomRaisePercent = 0
+f.math.RadicalDisplayStyleVerticalGap = 0
+f.math.RadicalExtraAscender = 0
+f.math.RadicalKernAfterDegree = 0
+f.math.RadicalKernBeforeDegree = v1
+f.math.RadicalRuleThickness = v2
+f.math.RadicalVerticalGap = 0
+mathfont.save(f)
+
+v = 8 * mathfont.em
+f = mathfont.create("radical-rulethickness%d" % v)
+createStretchyRadical(f)
+f.math.RadicalDegreeBottomRaisePercent = 0
+f.math.RadicalDisplayStyleVerticalGap = 0
+f.math.RadicalExtraAscender = 0
+f.math.RadicalKernAfterDegree = 0
+f.math.RadicalKernBeforeDegree = 0
+f.math.RadicalRuleThickness = v
+f.math.RadicalVerticalGap = 0
+mathfont.save(f)
+
+v1 = 6 * mathfont.em
+v2 = 1 * mathfont.em
+f = mathfont.create("radical-verticalgap%d-rulethickness%d" % (v1, v2))
+createStretchyRadical(f)
+f.math.RadicalDegreeBottomRaisePercent = 0
+f.math.RadicalDisplayStyleVerticalGap = 0
+f.math.RadicalExtraAscender = 0
+f.math.RadicalKernAfterDegree = 0
+f.math.RadicalKernBeforeDegree = 0
+f.math.RadicalRuleThickness = v2
+f.math.RadicalVerticalGap = v1
+mathfont.save(f)
diff --git a/tests/wpt/web-platform-tests/mathml/tools/scripts.py b/tests/wpt/web-platform-tests/mathml/tools/scripts.py
new file mode 100644
index 00000000000..add16373845
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/tools/scripts.py
@@ -0,0 +1,145 @@
+#!/usr/bin/python
+
+from utils import mathfont
+import fontforge
+
+v = 3 * mathfont.em
+f = mathfont.create("scripts-spaceafterscript%d" % v)
+f.math.SpaceAfterScript = v
+f.math.SubSuperscriptGapMin = 0
+f.math.SubscriptBaselineDropMin = 0
+f.math.SubscriptShiftDown = 0
+f.math.SubscriptTopMax = 0
+f.math.SuperscriptBaselineDropMax = 0
+f.math.SuperscriptBottomMaxWithSubscript = 0
+f.math.SuperscriptBottomMin = 0
+f.math.SuperscriptShiftUp = 0
+f.math.SuperscriptShiftUpCramped = 0
+mathfont.save(f)
+
+v = 7 * mathfont.em
+f = mathfont.create("scripts-superscriptshiftup%d" % v)
+f.math.SpaceAfterScript = 0
+f.math.SubSuperscriptGapMin = 0
+f.math.SubscriptBaselineDropMin = 0
+f.math.SubscriptShiftDown = 0
+f.math.SubscriptTopMax = 0
+f.math.SuperscriptBaselineDropMax = 0
+f.math.SuperscriptBottomMaxWithSubscript = 0
+f.math.SuperscriptBottomMin = 0
+f.math.SuperscriptShiftUp = v
+f.math.SuperscriptShiftUpCramped = 0
+mathfont.save(f)
+
+v = 5 * mathfont.em
+f = mathfont.create("scripts-superscriptshiftupcramped%d" % v)
+f.math.SpaceAfterScript = 0
+f.math.SubSuperscriptGapMin = 0
+f.math.SubscriptBaselineDropMin = 0
+f.math.SubscriptShiftDown = 0
+f.math.SubscriptTopMax = 0
+f.math.SuperscriptBaselineDropMax = 0
+f.math.SuperscriptBottomMaxWithSubscript = 0
+f.math.SuperscriptBottomMin = 0
+f.math.SuperscriptShiftUp = 0
+f.math.SuperscriptShiftUpCramped = v
+mathfont.save(f)
+
+v = 6 * mathfont.em
+f = mathfont.create("scripts-subscriptshiftdown%d" % v)
+f.math.SpaceAfterScript = 0
+f.math.SubSuperscriptGapMin = 0
+f.math.SubscriptBaselineDropMin = 0
+f.math.SubscriptShiftDown = v
+f.math.SubscriptTopMax = 0
+f.math.SuperscriptBaselineDropMax = 0
+f.math.SuperscriptBottomMaxWithSubscript = 0
+f.math.SuperscriptBottomMin = 0
+f.math.SuperscriptShiftUp = 0
+f.math.SuperscriptShiftUpCramped = 0
+mathfont.save(f)
+
+v = 11 * mathfont.em
+f = mathfont.create("scripts-subsuperscriptgapmin%d" % v)
+f.math.SpaceAfterScript = 0
+f.math.SubSuperscriptGapMin = v
+f.math.SubscriptBaselineDropMin = 0
+f.math.SubscriptShiftDown = 0
+f.math.SubscriptTopMax = 0
+f.math.SuperscriptBaselineDropMax = 0
+f.math.SuperscriptBottomMaxWithSubscript = 0
+f.math.SuperscriptBottomMin = 0
+f.math.SuperscriptShiftUp = 0
+f.math.SuperscriptShiftUpCramped = 0
+mathfont.save(f)
+
+v1 = 11 * mathfont.em
+v2 = 3 * mathfont.em
+f = mathfont.create("scripts-subsuperscriptgapmin%d-superscriptbottommaxwithsubscript%d" % (v1, v2))
+f.math.SpaceAfterScript = 0
+f.math.SubSuperscriptGapMin = v1
+f.math.SubscriptBaselineDropMin = 0
+f.math.SubscriptShiftDown = 0
+f.math.SubscriptTopMax = 0
+f.math.SuperscriptBaselineDropMax = 0
+f.math.SuperscriptBottomMaxWithSubscript = v2
+f.math.SuperscriptBottomMin = 0
+f.math.SuperscriptShiftUp = 0
+f.math.SuperscriptShiftUpCramped = 0
+mathfont.save(f)
+
+v = 4 * mathfont.em
+f = mathfont.create("scripts-subscripttopmax%d" % v)
+f.math.SpaceAfterScript = 0
+f.math.SubSuperscriptGapMin = 0
+f.math.SubscriptBaselineDropMin = 0
+f.math.SubscriptShiftDown = 0
+f.math.SubscriptTopMax = v
+f.math.SuperscriptBaselineDropMax = 0
+f.math.SuperscriptBottomMaxWithSubscript = 0
+f.math.SuperscriptBottomMin = 0
+f.math.SuperscriptShiftUp = 0
+f.math.SuperscriptShiftUpCramped = 0
+mathfont.save(f)
+
+v = 8 * mathfont.em
+f = mathfont.create("scripts-superscriptbottommin%d" % v)
+f.math.SpaceAfterScript = 0
+f.math.SubSuperscriptGapMin = 0
+f.math.SubscriptBaselineDropMin = 0
+f.math.SubscriptShiftDown = 0
+f.math.SubscriptTopMax = 0
+f.math.SuperscriptBaselineDropMax = 0
+f.math.SuperscriptBottomMaxWithSubscript = 0
+f.math.SuperscriptBottomMin = v
+f.math.SuperscriptShiftUp = 0
+f.math.SuperscriptShiftUpCramped = 0
+mathfont.save(f)
+
+v = 9 * mathfont.em
+f = mathfont.create("scripts-subscriptbaselinedropmin%d" % v)
+f.math.SpaceAfterScript = 0
+f.math.SubSuperscriptGapMin = 0
+f.math.SubscriptBaselineDropMin = v
+f.math.SubscriptShiftDown = 0
+f.math.SubscriptTopMax = 0
+f.math.SuperscriptBaselineDropMax = 0
+f.math.SuperscriptBottomMaxWithSubscript = 0
+f.math.SuperscriptBottomMin = 0
+f.math.SuperscriptShiftUp = 0
+f.math.SuperscriptShiftUpCramped = 0
+mathfont.save(f)
+
+v = 10 * mathfont.em
+f = mathfont.create("scripts-superscriptbaselinedropmax%d" % v)
+f.math.SpaceAfterScript = 0
+f.math.SubSuperscriptGapMin = 0
+f.math.SubscriptBaselineDropMin = 0
+f.math.SubscriptShiftDown = 0
+f.math.SubscriptTopMax = 0
+f.math.SuperscriptBaselineDropMax = v
+f.math.SuperscriptBottomMaxWithSubscript = 0
+f.math.SuperscriptBottomMin = 0
+f.math.SuperscriptShiftUp = 0
+f.math.SuperscriptShiftUpCramped = 0
+mathfont.save(f)
diff --git a/tests/wpt/web-platform-tests/mathml/tools/stacks.py b/tests/wpt/web-platform-tests/mathml/tools/stacks.py
new file mode 100644
index 00000000000..81f79befb69
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/tools/stacks.py
@@ -0,0 +1,81 @@
+#!/usr/bin/python
+
+from utils import mathfont
+import fontforge
+
+v = 7 * mathfont.em
+f = mathfont.create("stack-axisheight%d" % v)
+f.math.AxisHeight = v
+f.math.StackBottomDisplayStyleShiftDown = 0
+f.math.StackBottomShiftDown = 0
+f.math.StackDisplayStyleGapMin = 0
+f.math.StackGapMin = 0
+f.math.StackTopDisplayStyleShiftUp = 0
+f.math.StackTopShiftUp = 0
+mathfont.save(f)
+
+v = 5 * mathfont.em
+f = mathfont.create("stack-bottomdisplaystyleshiftdown%d" % v)
+f.math.AxisHeight = 0
+f.math.StackBottomDisplayStyleShiftDown = v
+f.math.StackBottomShiftDown = 0
+f.math.StackDisplayStyleGapMin = 0
+f.math.StackGapMin = 0
+f.math.StackTopDisplayStyleShiftUp = 0
+f.math.StackTopShiftUp = 0
+mathfont.save(f)
+
+v = 6 * mathfont.em
+f = mathfont.create("stack-bottomshiftdown%d" % v)
+f.math.AxisHeight = 0
+f.math.StackBottomDisplayStyleShiftDown = 0
+f.math.StackBottomShiftDown = v
+f.math.StackDisplayStyleGapMin = 0
+f.math.StackGapMin = 0
+f.math.StackTopDisplayStyleShiftUp = 0
+f.math.StackTopShiftUp = 0
+mathfont.save(f)
+
+v = 4 * mathfont.em
+f = mathfont.create("stack-displaystylegapmin%d" % v)
+f.math.AxisHeight = 0
+f.math.StackBottomDisplayStyleShiftDown = 0
+f.math.StackBottomShiftDown = 0
+f.math.StackDisplayStyleGapMin = v
+f.math.StackGapMin = 0
+f.math.StackTopDisplayStyleShiftUp = 0
+f.math.StackTopShiftUp = 0
+mathfont.save(f)
+
+v = 8 * mathfont.em
+f = mathfont.create("stack-gapmin%d" % v)
+f.math.AxisHeight = 0
+f.math.StackBottomDisplayStyleShiftDown = 0
+f.math.StackBottomShiftDown = 0
+f.math.StackDisplayStyleGapMin = 0
+f.math.StackGapMin = v
+f.math.StackTopDisplayStyleShiftUp = 0
+f.math.StackTopShiftUp = 0
+mathfont.save(f)
+
+v = 3 * mathfont.em
+f = mathfont.create("stack-topdisplaystyleshiftup%d" % v)
+f.math.AxisHeight = 0
+f.math.StackBottomDisplayStyleShiftDown = 0
+f.math.StackBottomShiftDown = 0
+f.math.StackDisplayStyleGapMin = 0
+f.math.StackGapMin = 0
+f.math.StackTopDisplayStyleShiftUp = v
+f.math.StackTopShiftUp = 0
+mathfont.save(f)
+
+v = 9 * mathfont.em
+f = mathfont.create("stack-topshiftup%d" % v)
+f.math.AxisHeight = 0
+f.math.StackBottomDisplayStyleShiftDown = 0
+f.math.StackBottomShiftDown = 0
+f.math.StackDisplayStyleGapMin = 0
+f.math.StackGapMin = 0
+f.math.StackTopDisplayStyleShiftUp = 0
+f.math.StackTopShiftUp = v
+mathfont.save(f)
diff --git a/tests/wpt/web-platform-tests/mathml/tools/stretchstacks.py b/tests/wpt/web-platform-tests/mathml/tools/stretchstacks.py
new file mode 100644
index 00000000000..7b888f49e70
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/tools/stretchstacks.py
@@ -0,0 +1,74 @@
+#!/usr/bin/python
+
+from utils import mathfont
+import fontforge
+
+arrowCodePoint = 0x2192 # horizontal stretch operator
+
+v = 3 * mathfont.em
+f = mathfont.create("stretchstack-bottomshiftdown%d" % v)
+mathfont.createSquareGlyph(f, arrowCodePoint)
+f.math.LowerLimitBaselineDropMin = 0
+f.math.LowerLimitGapMin = 0
+f.math.OverbarExtraAscender = 0
+f.math.OverbarVerticalGap = 0
+f.math.StretchStackBottomShiftDown = v
+f.math.StretchStackGapAboveMin = 0
+f.math.StretchStackGapBelowMin = 0
+f.math.StretchStackTopShiftUp = 0
+f.math.UnderbarExtraDescender = 0
+f.math.UnderbarVerticalGap = 0
+f.math.UpperLimitBaselineRiseMin = 0
+f.math.UpperLimitGapMin = 0
+mathfont.save(f)
+
+v = 11 * mathfont.em
+f = mathfont.create("stretchstack-gapbelowmin%d" % v)
+mathfont.createSquareGlyph(f, arrowCodePoint)
+f.math.LowerLimitBaselineDropMin = 0
+f.math.LowerLimitGapMin = 0
+f.math.OverbarExtraAscender = 0
+f.math.OverbarVerticalGap = 0
+f.math.StretchStackBottomShiftDown = 0
+f.math.StretchStackGapAboveMin = 0
+f.math.StretchStackGapBelowMin = v
+f.math.StretchStackTopShiftUp = 0
+f.math.UnderbarExtraDescender = 0
+f.math.UnderbarVerticalGap = 0
+f.math.UpperLimitBaselineRiseMin = 0
+f.math.UpperLimitGapMin = 0
+mathfont.save(f)
+
+v = 5 * mathfont.em
+f = mathfont.create("stretchstack-topshiftup%d" % v)
+mathfont.createSquareGlyph(f, arrowCodePoint)
+f.math.LowerLimitBaselineDropMin = 0
+f.math.LowerLimitGapMin = 0
+f.math.OverbarExtraAscender = 0
+f.math.OverbarVerticalGap = 0
+f.math.StretchStackBottomShiftDown = 0
+f.math.StretchStackGapAboveMin = 0
+f.math.StretchStackGapBelowMin = 0
+f.math.StretchStackTopShiftUp = v
+f.math.UnderbarExtraDescender = 0
+f.math.UnderbarVerticalGap = 0
+f.math.UpperLimitBaselineRiseMin = 0
+f.math.UpperLimitGapMin = 0
+mathfont.save(f)
+
+v = 7 * mathfont.em
+f = mathfont.create("stretchstack-gapabovemin%d" % v)
+mathfont.createSquareGlyph(f, arrowCodePoint)
+f.math.LowerLimitBaselineDropMin = 0
+f.math.LowerLimitGapMin = 0
+f.math.OverbarExtraAscender = 0
+f.math.OverbarVerticalGap = 0
+f.math.StretchStackBottomShiftDown = 0
+f.math.StretchStackGapAboveMin = v
+f.math.StretchStackGapBelowMin = 0
+f.math.StretchStackTopShiftUp = 0
+f.math.UnderbarExtraDescender = 0
+f.math.UnderbarVerticalGap = 0
+f.math.UpperLimitBaselineRiseMin = 0
+f.math.UpperLimitGapMin = 0
+mathfont.save(f)
diff --git a/tests/wpt/web-platform-tests/mathml/tools/underover.py b/tests/wpt/web-platform-tests/mathml/tools/underover.py
new file mode 100644
index 00000000000..df34e799960
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/tools/underover.py
@@ -0,0 +1,84 @@
+#!/usr/bin/python
+
+from utils import mathfont
+import fontforge
+
+breveCodePoint = 0x2D8 # accent operator
+degreeCodePoint = 0xB0 # nonaccent operator
+accentBaseHeight = 4 * mathfont.em
+
+v = 3 * mathfont.em
+f = mathfont.create("underover-accentbaseheight%d-overbarextraascender%d" % (accentBaseHeight, v))
+mathfont.createSquareGlyph(f, breveCodePoint)
+mathfont.createSquareGlyph(f, degreeCodePoint)
+f.math.AccentBaseHeight = accentBaseHeight
+f.math.LowerLimitBaselineDropMin = 0
+f.math.LowerLimitGapMin = 0
+f.math.OverbarExtraAscender = v
+f.math.OverbarVerticalGap = 0
+f.math.StretchStackBottomShiftDown = 0
+f.math.StretchStackGapAboveMin = 0
+f.math.StretchStackGapBelowMin = 0
+f.math.StretchStackTopShiftUp = 0
+f.math.UnderbarExtraDescender = 0
+f.math.UnderbarVerticalGap = 0
+f.math.UpperLimitBaselineRiseMin = 0
+f.math.UpperLimitGapMin = 0
+mathfont.save(f)
+
+v = 11 * mathfont.em
+f = mathfont.create("underover-accentbaseheight%d-overbarverticalgap%d" % (accentBaseHeight, v))
+mathfont.createSquareGlyph(f, breveCodePoint)
+mathfont.createSquareGlyph(f, degreeCodePoint)
+f.math.AccentBaseHeight = accentBaseHeight
+f.math.LowerLimitBaselineDropMin = 0
+f.math.LowerLimitGapMin = 0
+f.math.OverbarExtraAscender = 0
+f.math.OverbarVerticalGap = v
+f.math.StretchStackBottomShiftDown = 0
+f.math.StretchStackGapAboveMin = 0
+f.math.StretchStackGapBelowMin = 0
+f.math.StretchStackTopShiftUp = 0
+f.math.UnderbarExtraDescender = 0
+f.math.UnderbarVerticalGap = 0
+f.math.UpperLimitBaselineRiseMin = 0
+f.math.UpperLimitGapMin = 0
+mathfont.save(f)
+
+v = 5 * mathfont.em
+f = mathfont.create("underover-accentbaseheight%d-underbarextradescender%d" % (accentBaseHeight, v))
+mathfont.createSquareGlyph(f, breveCodePoint)
+mathfont.createSquareGlyph(f, degreeCodePoint)
+f.math.AccentBaseHeight = accentBaseHeight
+f.math.LowerLimitBaselineDropMin = 0
+f.math.LowerLimitGapMin = 0
+f.math.OverbarExtraAscender = 0
+f.math.OverbarVerticalGap = 0
+f.math.StretchStackBottomShiftDown = 0
+f.math.StretchStackGapAboveMin = 0
+f.math.StretchStackGapBelowMin = 0
+f.math.StretchStackTopShiftUp = 0
+f.math.UnderbarExtraDescender = v
+f.math.UnderbarVerticalGap = 0
+f.math.UpperLimitBaselineRiseMin = 0
+f.math.UpperLimitGapMin = 0
+mathfont.save(f)
+
+v = 7 * mathfont.em
+f = mathfont.create("underover-accentbaseheight%d-underbarverticalgap%d" % (accentBaseHeight, v))
+mathfont.createSquareGlyph(f, breveCodePoint)
+mathfont.createSquareGlyph(f, degreeCodePoint)
+f.math.AccentBaseHeight = accentBaseHeight
+f.math.LowerLimitBaselineDropMin = 0
+f.math.LowerLimitGapMin = 0
+f.math.OverbarExtraAscender = 0
+f.math.OverbarVerticalGap = 0
+f.math.StretchStackBottomShiftDown = 0
+f.math.StretchStackGapAboveMin = 0
+f.math.StretchStackGapBelowMin = 0
+f.math.StretchStackTopShiftUp = 0
+f.math.UnderbarExtraDescender = 0
+f.math.UnderbarVerticalGap = v
+f.math.UpperLimitBaselineRiseMin = 0
+f.math.UpperLimitGapMin = 0
+mathfont.save(f)
diff --git a/tests/wpt/web-platform-tests/mathml/tools/use-typo-lineheight.py b/tests/wpt/web-platform-tests/mathml/tools/use-typo-lineheight.py
new file mode 100644
index 00000000000..9768979f488
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/tools/use-typo-lineheight.py
@@ -0,0 +1,54 @@
+#!/usr/bin/python
+
+from __future__ import print_function
+from utils.misc import MathMLAssociationCopyright
+import fontforge
+
+font = fontforge.font()
+font.em = 1000
+typoLineHeight = 2300
+winHeight = 5000
+name = "font-lineheight%d-typolineheight%d" % (winHeight, typoLineHeight)
+font.fontname = name
+font.familyname = name
+font.fullname = name
+font.copyright = MathMLAssociationCopyright
+
+glyph = font.createChar(ord(" "), "space")
+glyph.width = 1000
+glyph = font.createChar(ord("O"))
+pen = glyph.glyphPen()
+pen.moveTo(0, -200)
+pen.lineTo(0, 800)
+pen.lineTo(1000, 800)
+pen.lineTo(1000, -200)
+pen.closePath();
+
+font.os2_typoascent_add = False
+font.os2_typoascent = 800
+font.os2_typodescent_add = False
+font.os2_typodescent = -200
+font.os2_typolinegap = typoLineHeight - \
+ (font.os2_typoascent - font.os2_typodescent)
+
+font.hhea_ascent = winHeight / 2
+font.hhea_ascent_add = False
+font.hhea_descent = -winHeight / 2
+font.hhea_descent_add = False
+font.hhea_linegap = 0
+
+font.os2_winascent = winHeight / 2
+font.os2_winascent_add = False
+font.os2_windescent = winHeight / 2
+font.os2_windescent_add = False
+
+font.os2_use_typo_metrics = True
+
+path = "../../fonts/math/lineheight%d-typolineheight%d.woff" % (winHeight, typoLineHeight)
+print("Generating %s..." % path, end="")
+font.generate(path)
+if font.validate() == 0:
+ print(" done.")
+else:
+ print(" validation error!")
+ exit(1)
diff --git a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/.gitkeep b/tests/wpt/web-platform-tests/mathml/tools/utils/__init__.py
index e69de29bb2d..e69de29bb2d 100644
--- a/tests/wpt/web-platform-tests/html/semantics/grouping-content/the-li-element/.gitkeep
+++ b/tests/wpt/web-platform-tests/mathml/tools/utils/__init__.py
diff --git a/tests/wpt/web-platform-tests/mathml/tools/utils/mathfont.py b/tests/wpt/web-platform-tests/mathml/tools/utils/mathfont.py
new file mode 100644
index 00000000000..7664c6d2434
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/tools/utils/mathfont.py
@@ -0,0 +1,190 @@
+from __future__ import print_function
+import fontforge
+from misc import MathMLAssociationCopyright
+
+em = 1000
+
+def create(aName):
+ print("Generating %s.woff..." % aName, end="")
+ mathFont = fontforge.font()
+ mathFont.fontname = aName
+ mathFont.familyname = aName
+ mathFont.fullname = aName
+ mathFont.copyright = MathMLAssociationCopyright
+ mathFont.encoding = "UnicodeFull"
+
+ # Create a space character. Also force the creation of some MATH subtables
+ # so that OTS will not reject the MATH table.
+ g = mathFont.createChar(ord(" "), "space")
+ g.width = em
+ g.italicCorrection = 0
+ g.topaccent = 0
+ g.mathKern.bottomLeft = tuple([(0,0)])
+ g.mathKern.bottomRight = tuple([(0,0)])
+ g.mathKern.topLeft = tuple([(0,0)])
+ g.mathKern.topRight = tuple([(0,0)])
+ mathFont[ord(" ")].horizontalVariants = "space"
+ mathFont[ord(" ")].verticalVariants = "space"
+ return mathFont
+
+def drawRectangleGlyph(aGlyph, aWidth, aAscent, aDescent):
+ p = aGlyph.glyphPen()
+ p.moveTo(0, -aDescent)
+ p.lineTo(0, aAscent)
+ p.lineTo(aWidth, aAscent)
+ p.lineTo(aWidth, -aDescent)
+ p.closePath();
+ aGlyph.width = aWidth
+
+def createSquareGlyph(aFont, aCodePoint):
+ g = aFont.createChar(aCodePoint)
+ drawRectangleGlyph(g, em, em, 0)
+
+def drawHexaDigit(aGlyph, aX, aValue):
+ t = em / 10
+ p = aGlyph.glyphPen(replace = False)
+ if aValue == 0:
+ p.moveTo(aX + t, t)
+ p.lineTo(aX + t, em - t)
+ p.lineTo(aX + em / 2 - t, em - t)
+ p.lineTo(aX + em / 2 - t, t)
+ p.closePath()
+ elif aValue == 1:
+ p.moveTo(aX + em / 2 - t, em - t)
+ p.lineTo(aX + em / 2 - t, t)
+ p.endPath()
+ elif aValue == 2:
+ p.moveTo(aX + t, em - t)
+ p.lineTo(aX + em / 2 - t, em - t)
+ p.lineTo(aX + em / 2 - t, em / 2)
+ p.lineTo(aX + t, em / 2)
+ p.lineTo(aX + t, t)
+ p.lineTo(aX + em / 2 - t, t)
+ p.endPath()
+ elif aValue == 3:
+ p.moveTo(aX + t, em - t)
+ p.lineTo(aX + em / 2 - t, em - t)
+ p.lineTo(aX + em / 2 - t, t)
+ p.lineTo(aX + t, t)
+ p.endPath()
+ p.moveTo(aX + t, em / 2)
+ p.lineTo(aX + em / 2 - 2.5 * t, em / 2)
+ p.endPath()
+ elif aValue == 4:
+ p.moveTo(aX + em / 2 - t, em - t)
+ p.lineTo(aX + em / 2 - t, t)
+ p.endPath()
+ p.moveTo(aX + t, em - t)
+ p.lineTo(aX + t, em / 2)
+ p.lineTo(aX + em / 2 - 2.5 * t, em / 2)
+ p.endPath()
+ elif aValue == 5:
+ p.moveTo(aX + em / 2 - t, em - t)
+ p.lineTo(aX + t, em - t)
+ p.lineTo(aX + t, em / 2)
+ p.lineTo(aX + em / 2 - t, em / 2)
+ p.lineTo(aX + em / 2 - t, t)
+ p.lineTo(aX + t, t)
+ p.endPath()
+ elif aValue == 6:
+ p.moveTo(aX + em / 2 - t, em - t)
+ p.lineTo(aX + t, em - t)
+ p.lineTo(aX + t, t)
+ p.lineTo(aX + em / 2 - t, t)
+ p.lineTo(aX + em / 2 - t, em / 2)
+ p.lineTo(aX + 2.5 * t, em / 2)
+ p.endPath()
+ elif aValue == 7:
+ p.moveTo(aX + t, em - t)
+ p.lineTo(aX + em / 2 - t, em - t)
+ p.lineTo(aX + em / 2 - t, t)
+ p.endPath()
+ elif aValue == 8:
+ p.moveTo(aX + t, t)
+ p.lineTo(aX + t, em - t)
+ p.lineTo(aX + em / 2 - t, em - t)
+ p.lineTo(aX + em / 2 - t, t)
+ p.closePath()
+ p.moveTo(aX + 2.5 * t, em / 2)
+ p.lineTo(aX + em / 2 - 2.5 * t, em / 2)
+ p.endPath()
+ elif aValue == 9:
+ p.moveTo(aX + t, t)
+ p.lineTo(aX + em / 2 - t, t)
+ p.lineTo(aX + em / 2 - t, em - t)
+ p.lineTo(aX + t, em - t)
+ p.lineTo(aX + t, em / 2)
+ p.lineTo(aX + em / 2 - 2.5 * t, em / 2)
+ p.endPath()
+ elif aValue == 10: # A
+ p.moveTo(aX + t, t)
+ p.lineTo(aX + t, em - t)
+ p.lineTo(aX + em / 2 - t, em - t)
+ p.lineTo(aX + em / 2 - t, t)
+ p.endPath()
+ p.moveTo(aX + 2.5 * t, em / 2)
+ p.lineTo(aX + em / 2 - 2.5 * t, em / 2)
+ p.endPath()
+ elif aValue == 11: # b
+ p.moveTo(aX + t, em - t)
+ p.lineTo(aX + t, t)
+ p.lineTo(aX + em / 2 - t, t)
+ p.lineTo(aX + em / 2 - t, em / 2)
+ p.lineTo(aX + 2.5 * t, em / 2)
+ p.endPath()
+ elif aValue == 12: # C
+ p.moveTo(aX + em / 2 - t, em - t)
+ p.lineTo(aX + t, em - t)
+ p.lineTo(aX + t, t)
+ p.lineTo(aX + em / 2 - t, t)
+ p.endPath()
+ elif aValue == 13: # d
+ p.moveTo(aX + em / 2 - t, em - t)
+ p.lineTo(aX + em / 2 - t, t)
+ p.lineTo(aX + t, t)
+ p.lineTo(aX + t, em / 2)
+ p.lineTo(aX + em / 2 - 2.5 * t, em / 2)
+ p.endPath()
+ elif aValue == 14: # E
+ p.moveTo(aX + em / 2 - t, em - t)
+ p.lineTo(aX + t, em - t)
+ p.lineTo(aX + t, t)
+ p.lineTo(aX + em / 2 - t, t)
+ p.endPath()
+ p.moveTo(aX + em / 2 - t, em / 2)
+ p.lineTo(aX + 2.5 * t, em / 2)
+ p.endPath()
+ elif aValue == 15: # F
+ p.moveTo(aX + em / 2 - t, em - t)
+ p.lineTo(aX + t, em - t)
+ p.lineTo(aX + t, t)
+ p.endPath()
+ p.moveTo(aX + em / 2 - t, em / 2)
+ p.lineTo(aX + 2.5 * t, em / 2)
+ p.endPath()
+
+def createGlyphFromValue(aFont, aCodePoint):
+ g = aFont.createChar(aCodePoint)
+ value = aCodePoint
+ for i in range(0, 5):
+ drawHexaDigit(g, (5 - (i + 1)) * em / 2, value % 16)
+ value /= 16
+ g.width = 5 * em / 2
+ g.stroke("circular", em / 10, "square", "miter", "cleanup")
+
+def save(aFont):
+ aFont.em = em
+ aFont.ascent = aFont.hhea_ascent = aFont.os2_typoascent = em
+ aFont.descent = aFont.hhea_descent = aFont.os2_typodescent = 0
+ # aFont.os2_winascent, aFont.os2_windescent should be the maximum of
+ # ascent/descent for all glyphs. Does fontforge compute them automatically?
+ aFont.hhea_ascent_add = aFont.hhea_descent_add = 0
+ aFont.os2_typoascent_add = aFont.os2_typodescent_add = 0
+ aFont.os2_winascent_add = aFont.os2_windescent_add = 0
+ aFont.os2_use_typo_metrics = True
+ aFont.generate("../../fonts/math/%s.woff" % aFont.fontname)
+ if aFont.validate() == 0:
+ print(" done.")
+ else:
+ print(" validation error!")
+ exit(1)
diff --git a/tests/wpt/web-platform-tests/mathml/tools/utils/misc.py b/tests/wpt/web-platform-tests/mathml/tools/utils/misc.py
new file mode 100644
index 00000000000..3907abf1412
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/tools/utils/misc.py
@@ -0,0 +1,33 @@
+from __future__ import print_function
+import os
+import progressbar
+import urllib2
+
+MathMLAssociationCopyright = "Copyright (c) 2016 MathML Association"
+
+def downloadWithProgressBar(url, outputDirectory="./", forceDownload=False):
+
+ baseName = os.path.basename(url)
+ fileName = os.path.join(outputDirectory, baseName)
+
+ if not forceDownload and os.path.exists(fileName):
+ return fileName
+
+ request = urllib2.urlopen(url)
+ totalSize = int(request.info().getheader('Content-Length').strip())
+ bar = progressbar.ProgressBar(maxval=totalSize).start()
+
+ chunkSize = 16 * 1024
+ downloaded = 0
+ print("Downloading %s" % url)
+ os.umask(0002)
+ with open(fileName, 'wb') as fp:
+ while True:
+ chunk = request.read(chunkSize)
+ downloaded += len(chunk)
+ bar.update(downloaded)
+ if not chunk: break
+ fp.write(chunk)
+ bar.finish()
+
+ return fileName
diff --git a/tests/wpt/web-platform-tests/mathml/tools/xHeight.py b/tests/wpt/web-platform-tests/mathml/tools/xHeight.py
new file mode 100644
index 00000000000..724352bf916
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/tools/xHeight.py
@@ -0,0 +1,11 @@
+#!/usr/bin/python
+
+from utils import mathfont
+import fontforge
+
+v = mathfont.em / 2
+f = mathfont.create("xheight%d" % v)
+g = f.createChar(ord('x'))
+mathfont.drawRectangleGlyph(g, mathfont.em, v, 0)
+assert f.xHeight == v, "Bad x-height value!"
+mathfont.save(f)
diff --git a/tests/wpt/web-platform-tests/media-source/OWNERS b/tests/wpt/web-platform-tests/media-source/OWNERS
index 5315c9b71c1..25e332a3cab 100644
--- a/tests/wpt/web-platform-tests/media-source/OWNERS
+++ b/tests/wpt/web-platform-tests/media-source/OWNERS
@@ -1,3 +1,2 @@
@shishimaru
-@sideshowbarker
@wolenetz
diff --git a/tests/wpt/web-platform-tests/media-source/mediasource-remove.html b/tests/wpt/web-platform-tests/media-source/mediasource-remove.html
index ee5c07818bc..9a4eb3fc5cb 100644
--- a/tests/wpt/web-platform-tests/media-source/mediasource-remove.html
+++ b/tests/wpt/web-platform-tests/media-source/mediasource-remove.html
@@ -286,8 +286,8 @@
removeAppendedDataTests(function(test, mediaSource, sourceBuffer, duration, subType, segmentInfo)
{
var expectations = {
- webm: ("{ [3.187, " + duration + ") }"),
- mp4: ("{ [3.187, " + duration + ") }"),
+ webm: ("{ [3.315, " + duration + ") }"),
+ mp4: ("{ [3.298, " + duration + ") }"),
};
// Note: Range doesn't start exactly at the end of the remove range because there isn't
@@ -299,8 +299,8 @@
{
var start = Math.max(segmentInfo.media[0].timev, segmentInfo.media[0].timea).toFixed(3);
var expectations = {
- webm: ("{ [" + start + ", 1.012) [3.187, " + duration + ") }"),
- mp4: ("{ [" + start + ", 0.996) [3.187, " + duration + ") }"),
+ webm: ("{ [" + start + ", 1.005) [3.315, " + duration + ") }"),
+ mp4: ("{ [" + start + ", 0.997) [3.298, " + duration + ") }"),
};
// Note: The first resulting range ends slightly after start because the removal algorithm only removes
@@ -313,7 +313,7 @@
{
var start = Math.max(segmentInfo.media[0].timev, segmentInfo.media[0].timea).toFixed(3);
var expectations = {
- webm: "{ [" + start + ", 1.029) }",
+ webm: "{ [" + start + ", 1.013) }",
mp4: "{ [" + start + ", 1.022) }",
};
diff --git a/tests/wpt/web-platform-tests/media-source/mediasource-sequencemode-append-buffer.html b/tests/wpt/web-platform-tests/media-source/mediasource-sequencemode-append-buffer.html
index 808c5970b96..92a01abcc0e 100644
--- a/tests/wpt/web-platform-tests/media-source/mediasource-sequencemode-append-buffer.html
+++ b/tests/wpt/web-platform-tests/media-source/mediasource-sequencemode-append-buffer.html
@@ -61,7 +61,7 @@
// Prior to EOS, the buffered range end time may not have fully reached the next media
// segment's timecode (adjusted by any timestampOffset). It should not exceed it though.
// Therefore, an exact assertBufferedEquals() will not work here.
- assert_equals(sourceBuffer.buffered.length, 1, "sourceBuffer.buffered has 1 range before EOS");
+ assert_greater_than(sourceBuffer.buffered.length, 0, "sourceBuffer.buffered has at least 1 range before EOS");
assert_equals(threeDecimalPlaces(sourceBuffer.buffered.start(0)),
threeDecimalPlaces(expectedBufferedRangeStartTime),
"sourceBuffer.buffered range begins where expected before EOS");
diff --git a/tests/wpt/web-platform-tests/media-source/mediasource-util.js b/tests/wpt/web-platform-tests/media-source/mediasource-util.js
index 30c37e714ce..15a56e83faa 100644
--- a/tests/wpt/web-platform-tests/media-source/mediasource-util.js
+++ b/tests/wpt/web-platform-tests/media-source/mediasource-util.js
@@ -1,65 +1,37 @@
-// Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang).
-
(function(window) {
var SEGMENT_INFO_LIST = [
{
url: 'mp4/test.mp4',
type: 'video/mp4; codecs="mp4a.40.2,avc1.4d400d"',
- duration: 6.0756,
- init: { offset: 0, size: 1197 },
+ duration: 6.549,
+ init: { offset: 0, size: 1413 },
media: [
- { offset: 1241, size: 17845, timev: 0.033200, timea: 0, endtimev: 0.531200, endtimea: 0.510839 },
- { offset: 19130, size: 5551, timev: 0.464800, timea: 0.510839, endtimev: 0.796800, endtimea: 0.812698 },
- { offset: 24725, size: 10944, timev: 0.796800, timea: 0.812698, endtimev: 0.929600, endtimea: 0.905578 },
- { offset: 35713, size: 7131, timev: 0.863200, timea: 0.905578, endtimev: 1.195200, endtimea: 1.184217 },
- { offset: 42888, size: 2513, timev: 1.128800, timea: 1.184217, endtimev: 1.328000, endtimea: 1.300317 },
- { offset: 45457, size: 3022, timev: 1.261600, timea: 1.300317, endtimev: 1.460800, endtimea: 1.509297 },
- { offset: 48479, size: 815, timev: 1.494000, timea: 1.509297, endtimev: 1.527200, endtimea: 1.532517 },
- { offset: 49338, size: 2818, timev: 1.460800, timea: 1.532517, endtimev: 1.626800, endtimea: 1.648616 },
- { offset: 52200, size: 11581, timev: 1.626800, timea: 1.648616, endtimev: 1.792800, endtimea: 1.764716 },
- { offset: 63825, size: 3003, timev: 1.726400, timea: 1.764716, endtimev: 1.925600, endtimea: 1.973696 },
- { offset: 66872, size: 6390, timev: 1.925600, timea: 1.973696, endtimev: 2.191200, endtimea: 2.159455 },
- { offset: 73306, size: 3740, timev: 2.124800, timea: 2.159455, endtimev: 2.390400, endtimea: 2.368435 },
- { offset: 77102, size: 11779, timev: 2.324000, timea: 2.368435, endtimev: 2.523200, endtimea: 2.577414 },
- { offset: 88881, size: 851, timev: 2.556400, timea: 2.577414, endtimev: 2.589600, endtimea: 2.600634 },
- { offset: 89776, size: 4236, timev: 2.523200, timea: 2.600634, endtimev: 2.788800, endtimea: 2.832834 },
- { offset: 94056, size: 9538, timev: 2.788800, timea: 2.832834, endtimev: 3.187200, endtimea: 3.204353 },
- { offset: 103638, size: 13295, timev: 3.187200, timea: 3.204353, endtimev: 3.452800, endtimea: 3.436553 },
- { offset: 116977, size: 309, timev: 3.386400, timea: 3.436553, endtimev: 3.419600, endtimea: 3.506213 },
- { offset: 117330, size: 5806, timev: 3.452800, timea: 3.506213, endtimev: 3.784800, endtimea: 3.831292 },
- { offset: 123180, size: 4392, timev: 3.784800, timea: 3.831292, endtimev: 4.017200, endtimea: 4.040272 },
- { offset: 127616, size: 15408, timev: 4.017200, timea: 4.040272, endtimev: 4.249600, endtimea: 4.295691 },
- { offset: 143068, size: 9899, timev: 4.249600, timea: 4.295691, endtimev: 4.814000, endtimea: 4.829750 },
- { offset: 153011, size: 11562, timev: 4.814000, timea: 4.829750, endtimev: 4.980000, endtimea: 5.015510 },
- { offset: 164617, size: 7398, timev: 4.980000, timea: 5.015510, endtimev: 5.245600, endtimea: 5.294149 },
- { offset: 172059, size: 5698, timev: 5.245600, timea: 5.294149, endtimev: 5.577600, endtimea: 5.549569 },
- { offset: 177801, size: 11682, timev: 5.511200, timea: 5.549569, endtimev: 5.710400, endtimea: 5.758548 },
- { offset: 189527, size: 3023, timev: 5.710400, timea: 5.758548, endtimev: 5.909600, endtimea: 5.897868 },
- { offset: 192594, size: 5726, timev: 5.843200, timea: 5.897868, endtimev: 6.075600, endtimea: 6.037188 },
+ { offset: 1413, size: 24034, timev: 0.095000, timea: 0, endtimev: 0.896666, endtimea: 0.882358 },
+ { offset: 25447, size: 21757, timev: 0.896666, timea: 0.882358, endtimev: 1.696666, endtimea: 1.671836 },
+ { offset: 47204, size: 23591, timev: 1.696666, timea: 1.671836, endtimev: 2.498333, endtimea: 2.461315 },
+ { offset: 70795, size: 22614, timev: 2.498333, timea: 2.461315, endtimev: 3.298333, endtimea: 3.297233 },
+ { offset: 93409, size: 18353, timev: 3.298333, timea: 3.297233, endtimev: 4.100000, endtimea: 4.086712},
+ { offset: 111762, size: 23935, timev: 4.100000, timea: 4.086712, endtimev: 4.900000, endtimea: 4.876190 },
+ { offset: 135697, size: 21911, timev: 4.900000, timea: 4.876190, endtimev: 5.701666, endtimea: 5.665668 },
+ { offset: 157608, size: 23776, timev: 5.701666, timea: 5.665668, endtimev: 6.501666, endtimea: 6.501587 },
+ { offset: 181384, size: 5843, timev: 6.501666, timea: 6.501587, endtimev: 6.501666, endtimea: 6.501678 },
]
},
{
url: 'webm/test.webm',
type: 'video/webm; codecs="vp8, vorbis"',
- duration: 6.042,
- init: { offset: 0, size: 4357 },
+ duration: 6.552,
+ init: { offset: 0, size: 4116 },
media: [
- { offset: 4357, size: 11830, timev: 0, timea: 0, endtimev: 0.398000, endtimea: 0.384000 },
- { offset: 16187, size: 12588, timev: 0.398000, timea: 0.385000, endtimev: 0.798000, endtimea: 0.779000 },
- { offset: 28775, size: 14588, timev: 0.797000, timea: 0.779000, endtimev: 1.195000, endtimea: 1.174000 },
- { offset: 43363, size: 13023, timev: 1.195000, timea: 1.174000, endtimev: 1.593000, endtimea: 1.592000 },
- { offset: 56386, size: 13127, timev: 1.594000, timea: 1.592000, endtimev: 1.992000, endtimea: 1.988000 },
- { offset: 69513, size: 14456, timev: 1.992000, timea: 1.987000, endtimev: 2.390000, endtimea: 2.381000 },
- { offset: 83969, size: 13458, timev: 2.390000, timea: 2.381000, endtimev: 2.790000, endtimea: 2.776000 },
- { offset: 97427, size: 14566, timev: 2.789000, timea: 2.776000, endtimev: 3.187000, endtimea: 3.171000 },
- { offset: 111993, size: 13201, timev: 3.187000, timea: 3.171000, endtimev: 3.585000, endtimea: 3.565000 },
- { offset: 125194, size: 14061, timev: 3.586000, timea: 3.566000, endtimev: 3.984000, endtimea: 3.960000 },
- { offset: 139255, size: 15353, timev: 3.984000, timea: 3.960000, endtimev: 4.382000, endtimea: 4.378000 },
- { offset: 154608, size: 13618, timev: 4.382000, timea: 4.378000, endtimev: 4.782000, endtimea: 4.773000 },
- { offset: 168226, size: 15094, timev: 4.781000, timea: 4.773000, endtimev: 5.179000, endtimea: 5.169000 },
- { offset: 183320, size: 13069, timev: 5.179000, timea: 5.168000, endtimev: 5.577000, endtimea: 5.562000 },
- { offset: 196389, size: 13788, timev: 5.578000, timea: 5.563000, endtimev: 5.976000, endtimea: 5.957000 },
- { offset: 210177, size: 9009, timev: 5.976000, timea: 5.957000, endtimev: 6.042000, endtimea: 6.050000 },
+ { offset: 4116, size: 26583, timev: 0.112000, timea: 0, endtimev: 0.913000, endtimea: 0.912000 },
+ { offset: 30699, size: 20555, timev: 0.913000, timea: 0.912000, endtimev: 1.714000, endtimea: 1.701000 },
+ { offset: 51254, size: 22668, timev: 1.714000, timea: 1.701000, endtimev: 2.515000, endtimea: 2.514000 },
+ { offset: 73922, size: 21943, timev: 2.515000, timea: 2.514000, endtimev: 3.315000, endtimea: 3.303000 },
+ { offset: 95865, size: 23015, timev: 3.315000, timea: 3.303000, endtimev: 4.116000, endtimea: 4.093000},
+ { offset: 118880, size: 20406, timev: 4.116000, timea: 4.093000, endtimev: 4.917000, endtimea: 4.906000 },
+ { offset: 139286, size: 21537, timev: 4.917000, timea: 4.906000, endtimev: 5.718000, endtimea: 5.695000 },
+ { offset: 160823, size: 24027, timev: 5.718000, timea: 5.695000, endtimev: 6.519000, endtimea: 6.508000 },
+ { offset: 184850, size: 5955, timev: 6.519000, timea: 6.508000, endtimev: 6.577000, endtimea: 6.577000},
],
}
];
diff --git a/tests/wpt/web-platform-tests/media-source/mp4/test.mp4 b/tests/wpt/web-platform-tests/media-source/mp4/test.mp4
index eca97aad4bb..1b0e7b56a6b 100644
--- a/tests/wpt/web-platform-tests/media-source/mp4/test.mp4
+++ b/tests/wpt/web-platform-tests/media-source/mp4/test.mp4
Binary files differ
diff --git a/tests/wpt/web-platform-tests/media-source/webm/test.webm b/tests/wpt/web-platform-tests/media-source/webm/test.webm
index 6c2138d4eca..3a601805d79 100644
--- a/tests/wpt/web-platform-tests/media-source/webm/test.webm
+++ b/tests/wpt/web-platform-tests/media-source/webm/test.webm
Binary files differ
diff --git a/tests/wpt/web-platform-tests/mediacapture-record/BlobEvent-constructor.html b/tests/wpt/web-platform-tests/mediacapture-record/BlobEvent-constructor.html
new file mode 100644
index 00000000000..3bcf4296e68
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mediacapture-record/BlobEvent-constructor.html
@@ -0,0 +1,38 @@
+<!doctype html>
+<title>BlobEvent constructor</title>
+<link rel="help" href="https://w3c.github.io/mediacapture-record/MediaRecorder.html#blob-event">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+test(function() {
+ assert_equals(BlobEvent.length, 2);
+ assert_throws(new TypeError, function() {
+ new BlobEvent("type");
+ });
+ assert_throws(new TypeError, function() {
+ new BlobEvent("type", null);
+ });
+ assert_throws(new TypeError, function() {
+ new BlobEvent("type", undefined);
+ });
+}, "The BlobEventInit dictionary is required");
+
+test(function() {
+ assert_throws(new TypeError, function() {
+ new BlobEvent("type", {});
+ });
+ assert_throws(new TypeError, function() {
+ new BlobEvent("type", { data: null });
+ });
+ assert_throws(new TypeError, function() {
+ new BlobEvent("type", { data: undefined });
+ });
+}, "The BlobEventInit dictionary's data member is required.");
+
+test(function() {
+ var blob = new Blob();
+ var event = new BlobEvent("type", { data: blob });
+ assert_equals(event.type, "type");
+ assert_equals(event.data, blob);
+}, "The BlobEvent instance's data attribute is set.");
+</script>
diff --git a/tests/wpt/web-platform-tests/mediacapture-record/OWNERS b/tests/wpt/web-platform-tests/mediacapture-record/OWNERS
new file mode 100644
index 00000000000..ae224752b23
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mediacapture-record/OWNERS
@@ -0,0 +1 @@
+@miguelao \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/page-visibility/idlharness.html b/tests/wpt/web-platform-tests/page-visibility/idlharness.html
index c8086a1bc62..f5999eaa7eb 100644
--- a/tests/wpt/web-platform-tests/page-visibility/idlharness.html
+++ b/tests/wpt/web-platform-tests/page-visibility/idlharness.html
@@ -19,11 +19,16 @@ interface Document {
</pre>
<pre id='idl'>
-enum VisibilityState { "hidden", "visible", "prerender", "unloaded" };
+enum VisibilityState {
+ "hidden",
+ "visible",
+ "prerender"
+};
partial interface Document {
- readonly attribute boolean hidden;
- readonly attribute VisibilityState visibilityState;
+ readonly attribute boolean hidden;
+ readonly attribute VisibilityState visibilityState;
+ attribute EventHandler onvisibilitychange;
};
</pre>
diff --git a/tests/wpt/web-platform-tests/performance-timeline/case-sensitivity.html b/tests/wpt/web-platform-tests/performance-timeline/case-sensitivity.html
new file mode 100644
index 00000000000..99ef66ccec6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/performance-timeline/case-sensitivity.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>PerformanceTimeline: case sensitivity</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<h1>PerformanceTimeline: case sensitivity</h1>
+<div id="log"></div>
+<script>
+ test(function () {
+ assert_equals(typeof window.performance, "object");
+ assert_equals(typeof window.performance.getEntriesByType, "function");
+ var lowerList = window.performance.getEntriesByType("resource");
+ var upperList = window.performance.getEntriesByType("RESOURCE");
+ var mixedList = window.performance.getEntriesByType("ReSoUrCe");
+
+ assert_not_equals(lowerList.length, 0, "Resource entries exist");
+ assert_equals(upperList.length, 0, "getEntriesByType('RESOURCE').length");
+ assert_equals(mixedList.length, 0, "getEntriesByType('ReSoUrCe').length");
+
+ }, "getEntriesByType values are case sensitive");
+
+ test(function () {
+ assert_equals(typeof window.performance, "object");
+ assert_equals(typeof window.performance.getEntriesByName, "function");
+ var origin = window.location.protocol + "//" + window.location.host;
+ var location1 = origin.toUpperCase() + "/resources/testharness.js";
+ var location2 = window.location.protocol + "//"
+ + window.location.host.toUpperCase() + "/resources/testharness.js";
+ var lowerList = window.performance.getEntriesByName(origin + "/resources/testharness.js");
+ var upperList = window.performance.getEntriesByName(location1);
+ var mixedList = window.performance.getEntriesByName(location2);
+
+ assert_equals(lowerList.length, 1, "Resource entry exist");
+ assert_equals(upperList.length, 0, "getEntriesByName('" + location1 + "').length");
+ assert_equals(mixedList.length, 0, "getEntriesByName('" + location2 + "').length");
+
+ }, "getEntriesByName values are case sensitive");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/pointerevents/OWNERS b/tests/wpt/web-platform-tests/pointerevents/OWNERS
index 48ad3aa0ba7..65dc56a8a07 100644
--- a/tests/wpt/web-platform-tests/pointerevents/OWNERS
+++ b/tests/wpt/web-platform-tests/pointerevents/OWNERS
@@ -6,3 +6,4 @@
@scottgonzalez
@staktrace
@RByers
+@NavidZ
diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_capture_suppressing_mouse-manual.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_capture_suppressing_mouse-manual.html
index 81c5881dfab..763e17916e9 100644
--- a/tests/wpt/web-platform-tests/pointerevents/pointerevent_capture_suppressing_mouse-manual.html
+++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_capture_suppressing_mouse-manual.html
@@ -18,11 +18,10 @@
<li> Move your mouse out of the black rectangle. pointerout and pointerleave should be logged inside of it</li>
<li> Put your mouse over the purple rectangle. pointerover and pointerenter should be logged inside of it.</li>
<li> Move your mouse out of the purple rectangle. pointerout and pointerleave should be logged inside of it</li>
- <li> Press and hold left mouse button over "Set Capture" button. "gotpointercapture" should be logged in the black rectangle</li>
+ <li> Press and hold left mouse button over "Set Capture" button and move mouse a litte inside the button. "gotpointercapture", "pointerover", and "pointerenter" should be logged in the black rectangle</li>
<li> Put your mouse over the purple rectangle and then move it out. Nothing should happen</li>
- <li> Put your mouse over the black rectangle. pointerover and pointerenter should be logged inside of it.</li>
- <li> Move your mouse out of the black rectangle. pointerout and pointerleave should be logged inside of it</li>
- <li> Release left mouse button. "lostpointercapture" should be logged in the black rectangle</li>
+ <li> Put your mouse over the black rectangle and then move it out. Nothing should happen.</li>
+ <li> Put your mouse over the purple rectangle and then release left mouse button. "lostpointercapture" should be logged in the black rectangle. Move your mouse in the purple rectangle a little. "pointerout" and "pointerleave" should be logged in the black rectangle. Also "pointerover" and "pointerenter" should be logged in the purple rectangle"</li>
</ol>
</h4>
Test passes if the proper behaviour of the events is observed.
@@ -35,6 +34,7 @@
var isPointerCapture = false;
var isRelatedTargetValueTested = false;
var isTargetAuthenticityTested = false;
+ var lostPointerCaptureReceived = false;
var count = 0;
var detected_pointertypes = {};
@@ -51,13 +51,13 @@
var test_pointerover_capture = async_test("pointerover event with capture received");
var test_pointerout_no_capture = async_test("pointerout event without capture received");
- var test_pointerout_capture = async_test("pointerout event with capture received");
+ var test_pointerout_after_capture = async_test("pointerout event after lostpointercapture received");
var test_pointerenter_no_capture = async_test("pointerenter event without capture received");
var test_pointerenter_capture = async_test("pointerenter event with capture received");
var test_pointerleave_no_capture = async_test("pointerleave event without capture received");
- var test_pointerleave_capture = async_test("pointerleave event with capture received");
+ var test_pointerleave_after_capture = async_test("pointerleave event after lostpointercapture received");
window.onload = function() {
on_event(captureButton, 'pointerdown', function(e) {
@@ -74,6 +74,7 @@
on_event(target0, 'lostpointercapture', function(e) {
isPointerCapture = false;
+ lostPointerCaptureReceived = true;
test_lostpointercapture.done();
log("lostpointercapture", target0);
});
@@ -89,15 +90,15 @@
test_pointerover_capture.done();
if (!isRelatedTargetValueTested) {
test(function() {
- assert_true(event.relatedTarget==null, "relatedTarget is null when the capture is set")
- }, "relatedTarget is null when the capture is set. relatedTarget is " + event.relatedTarget);
+ assert_not_equals(event.relatedTarget, null, "relatedTarget should behave the same as when the capture is not set")
+ }, "relatedTarget is not null for boundary events even when the capture is set.");
isRelatedTargetValueTested = true;
}
var hitTest = document.elementFromPoint(event.clientX, event.clientY);
if(event.target !== hitTest && !isTargetAuthenticityTested) {
test(function () {
- assert_unreached("pointerover for this target shouldn't trigger events on capture target");
- }, "pointerover should only trigger over the black rectangle");
+ assert_not_equals(event.target, hitTest, "pointerover should be fired on capture target even if the pointer it not over the capture target");
+ }, "pointerover should trigger the black rectangle even when pointer is not over black rectangle.");
isTargetAuthenticityTested = true;
}
}
@@ -109,10 +110,16 @@
on_event(target0, "pointerout", function (event) {
log("pointerout", target0);
if(isPointerCapture) {
- test_pointerout_capture.done();
+ test(function() {
+ assert_unreached("pointerout shouldn't be sent to captured node as all the events are targeted at the capturing node");
+ }, "pointerout shouldn't be sent to captured node as all the events are targeted at the capturing node.");
}
else {
- test_pointerout_no_capture.done();
+ if (lostPointerCaptureReceived) {
+ test_pointerout_after_capture.done();
+ } else {
+ test_pointerout_no_capture.done();
+ }
}
});
@@ -129,10 +136,16 @@
on_event(target0, "pointerleave", function (event) {
log("pointerleave", target0);
if(isPointerCapture) {
- test_pointerleave_capture.done();
+ test(function() {
+ assert_unreached("pointerleave shouldn't be sent to captured node as all the events are targeted at the capturing node");
+ }, "pointerleave shouldn't be sent to captured node as all the events are targeted at the capturing node.");
}
else {
- test_pointerleave_no_capture.done();
+ if (lostPointerCaptureReceived) {
+ test_pointerleave_after_capture.done();
+ } else {
+ test_pointerleave_no_capture.done();
+ }
}
});
@@ -180,4 +193,4 @@
</div>
<div id="log"></div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_constructor.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_constructor.html
index bf883bdebb5..b2a779d1f73 100644
--- a/tests/wpt/web-platform-tests/pointerevents/pointerevent_constructor.html
+++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_constructor.html
@@ -30,6 +30,8 @@
var testHeight = 5;
var testTiltX = -45;
var testTiltY = 30;
+ var testButton = 0;
+ var testButtons = 1;
var testPressure = 0.4;
var testIsPrimary = true;
@@ -40,6 +42,8 @@
["custom cancelable", event.cancelable, testCancelable],
["custom pointerId", event.pointerId, testPointerId],
["custom pointerType", event.pointerType, testPointerType],
+ ["custom button", event.button, testButton],
+ ["custom buttons", event.buttons, testButtons],
["custom width", event.width, testWidth],
["custom height", event.height, testHeight],
["custom clientX", event.clientX, testClientX],
@@ -80,6 +84,8 @@
clientY: testClientY,
tiltX: testTiltX,
tiltY: testTiltY,
+ button: testButton,
+ buttons: testButtons,
pressure: testPressure,
isPrimary: testIsPrimary
});
diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_element_haspointercapture-manual.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_element_haspointercapture-manual.html
index 64afb8e02be..1b479a64fa5 100644
--- a/tests/wpt/web-platform-tests/pointerevents/pointerevent_element_haspointercapture-manual.html
+++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_element_haspointercapture-manual.html
@@ -35,6 +35,8 @@
test_pointerEvent.step(function () {
assert_equals(target0.hasPointerCapture(e.pointerId), false,
"after target1.setPointerCapture, target0.hasPointerCapture should be false");
+ assert_equals(target1.hasPointerCapture(e.pointerId), true,
+ "after target1.setPointerCapture, target1.hasPointerCapture should be true");
});
target0.setPointerCapture(e.pointerId);
set_capture_to_target0 = true;
@@ -49,6 +51,8 @@
test_pointerEvent.step(function () {
assert_equals(target0.hasPointerCapture(e.pointerId), false,
"after target0.releasePointerCapture, target0.hasPointerCapture should be false");
+ assert_equals(target1.hasPointerCapture(e.pointerId), false,
+ "after target0.releasePointerCapture, target1.hasPointerCapture should be false");
});
target0.setPointerCapture(e.pointerId);
set_capture_to_target0 = true;
@@ -89,6 +93,13 @@
assert_equals(target0.hasPointerCapture(e.pointerId), false,
"pointerup target0.hasPointerCapture should be false");
});
+ });
+
+ on_event(target1, "pointerup", function (e) {
+ test_pointerEvent.step(function () {
+ assert_equals(target1.hasPointerCapture(e.pointerId), false,
+ "pointerup target1.hasPointerCapture should be false");
+ });
test_pointerEvent.done();
});
}
@@ -99,17 +110,18 @@
<h4>
Test Description: This test checks if Element.hasPointerCapture returns value correctly
<ol>
- <li> Press black rectangle and do not release.
- <li> Move your pointer to yellow rectangle.
- <li> Release the pointer with no other move after that.
+ <li> Press black rectangle and do not release
+ <li> Move your pointer to purple rectangle
+ <li> Release the pointer
+ <li> Click purple rectangle
</ol>
</h4>
<p>
- <div id="target0" style="background:black"></div>
- <div id="target1" style="background:yellow"></div>
+ <div id="target0" touch-action:none></div>
+ <div id="target1" touch-action:none></div>
<div id="complete-notice">
<p>The following pointer types were detected: <span id="pointertype-log"></span>.</p>
</div>
<div id="log"></div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_element_haspointercapture_release_pending_capture-manual.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_element_haspointercapture_release_pending_capture-manual.html
new file mode 100644
index 00000000000..17ad3e24ba4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_element_haspointercapture_release_pending_capture-manual.html
@@ -0,0 +1,73 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Element.hasPointerCapture test after the pending pointer capture element releases pointer capture</title>
+ <meta name="viewport" content="width=device-width">
+ <link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script type="text/javascript" src="pointerevent_support.js"></script>
+ <script>
+ var detected_pointertypes = {};
+ add_completion_callback(showPointerTypes);
+ var test_pointerEvent = async_test("hasPointerCapture test after the pending pointer capture element releases pointer capture");
+
+ function run() {
+ var target0 = document.getElementById("target0");
+ var target1 = document.getElementById("target1");
+
+ on_event(target0, "pointerdown", function (e) {
+ detected_pointertypes[e.pointerType] = true;
+ target0.setPointerCapture(e.pointerId);
+ test_pointerEvent.step(function () {
+ assert_equals(target0.hasPointerCapture(e.pointerId), true, "After target0.setPointerCapture, target0.hasPointerCapture should return true");
+ });
+ });
+
+ on_event(target0, "gotpointercapture", function (e) {
+ test_pointerEvent.step(function () {
+ assert_equals(target0.hasPointerCapture(e.pointerId), true, "After target0 received gotpointercapture, target0.hasPointerCapture should return true");
+ });
+ target1.setPointerCapture(e.pointerId);
+ test_pointerEvent.step(function () {
+ assert_equals(target0.hasPointerCapture(e.pointerId), false, "After target1.setPointerCapture, target0.hasPointerCapture should return false");
+ assert_equals(target1.hasPointerCapture(e.pointerId), true, "After target1.setPointerCapture, target1.hasPointerCapture should return true");
+ });
+ target1.releasePointerCapture(e.pointerId);
+ test_pointerEvent.step(function () {
+ assert_equals(target0.hasPointerCapture(e.pointerId), false, "After target1.releasePointerCapture, target0.hasPointerCapture should be false");
+ assert_equals(target1.hasPointerCapture(e.pointerId), false, "After target1.releasePointerCapture, target1.hasPointerCapture should be false");
+ });
+ });
+
+ on_event(target1, "gotpointercapture", function (e) {
+ test_pointerEvent.step(function () {
+ assert_true(false, "target1 should never receive gotpointercapture in this test");
+ });
+ });
+
+ on_event(target0, "lostpointercapture", function (e) {
+ test_pointerEvent.done();
+ });
+ }
+ </script>
+ </head>
+ <body onload="run()">
+ <h1>Element.hasPointerCapture test after the pending pointer capture element releases pointer capture</h1>
+ <h4>
+ Test Description: This test checks if Element.hasPointerCapture returns value correctly after the pending pointer capture element releases pointer capture
+ <ol>
+ <li> Press black rectangle and do not release
+ <li> Move your pointer to purple rectangle
+ <li> Release the pointer
+ </ol>
+ </h4>
+ <p>
+ <div id="target0" touch-action:none></div>
+ <div id="target1" touch-action:none></div>
+ <div id="complete-notice">
+ <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p>
+ </div>
+ <div id="log"></div>
+ </body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_lostpointercapture_is_first-manual.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_lostpointercapture_is_first-manual.html
index 91f2b0d3869..e446d184429 100644
--- a/tests/wpt/web-platform-tests/pointerevents/pointerevent_lostpointercapture_is_first-manual.html
+++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_lostpointercapture_is_first-manual.html
@@ -16,7 +16,7 @@
This test checks if lostpointercapture is handled asynchronously and prior to all subsequent events.
Complete the following actions:
<ol>
- <li>Press and hold left mouse button over "Set Capture" button. "gotpointercapture" should be logged inside of the black rectangle
+ <li>Press and hold left mouse button over "Set Capture" button and move a little. "gotpointercapture" should be logged inside of the black rectangle
<li>"lostpointercapture" should be logged inside of the black rectangle after pointerup
</ol>
</h4>
@@ -28,6 +28,9 @@
var detected_pointertypes = {};
var detected_pointerEvents = new Array();
var pointerdown_event = null;
+ var firstPointermoveReceived = false; // To handle the first pointermove right after gotpointercapture which gotpointercapture was sent right before it.
+ var firstPointeroverReceived = false; // To handle the first pointerover right after gotpointercapture which gotpointercapture was sent right before it.
+ var firstPointerenterReceived = false; // To handle the first pointeenter right after gotpointercapture which gotpointercapture was sent right before it.
var test_pointerEvent = async_test("lostpointercapture is dispatched prior to subsequent events"); // set up test harness
@@ -97,9 +100,20 @@
test_pointerEvent.done(); // complete test
}
else {
- if (testStarted && pointerdown_event != null && pointerdown_event.pointerId === event.pointerId && event.type != "pointerup") {
- detected_pointerEvents.push(event.type);
- eventRcvd = true;
+ if (testStarted && pointerdown_event != null && pointerdown_event.pointerId === event.pointerId) {
+ if (event.type == "pointermove" && !firstPointermoveReceived) {
+ firstPointermoveReceived = true;
+ }
+ else if (event.type == "pointerenter" && !firstPointerenterReceived) {
+ firstPointerenterReceived = true;
+ }
+ else if (event.type == "pointerover" && !firstPointeroverReceived) {
+ firstPointeroverReceived = true;
+ }
+ else if (event.type != "pointerup") {
+ detected_pointerEvents.push(event.type);
+ eventRcvd = true;
+ }
}
}
});
@@ -112,4 +126,4 @@
</div>
<div id="log"></div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_pointermove-on-chorded-mouse-button.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_pointermove_on_chorded_mouse_button-manual.html
index 8bade63554d..8bade63554d 100644
--- a/tests/wpt/web-platform-tests/pointerevents/pointerevent_pointermove-on-chorded-mouse-button.html
+++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_pointermove_on_chorded_mouse_button-manual.html
diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_releasepointercapture_events_to_original_target-manual.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_releasepointercapture_events_to_original_target-manual.html
index f3991d98d74..904efa46b76 100644
--- a/tests/wpt/web-platform-tests/pointerevents/pointerevent_releasepointercapture_events_to_original_target-manual.html
+++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_releasepointercapture_events_to_original_target-manual.html
@@ -13,17 +13,21 @@
<script type="text/javascript">
var detected_pointertypes = {};
var test_pointerEvent = async_test("lostpointercapture: subsequent events to target."); // set up test harness
- var suppressedEventsFail = false;
// showPointerTypes is defined in pointerevent_support.js
// Requirements: the callback function will reference the test_pointerEvent object and
// will fail unless the async_test is created with the var name "test_pointerEvent".
add_completion_callback(showPointerTypes);
var captured_event;
+ var test_done = false;
+ var overEnterEventsFail = false;
+ var outLeaveEventsFail = false;
var f_gotPointerCapture = false;
var f_lostPointerCapture = false;
function listenerEventHandler(event) {
+ if (test_done)
+ return;
detected_pointertypes[event.pointerType] = true;
if (event.type == "gotpointercapture") {
f_gotPointerCapture = true;
@@ -34,12 +38,20 @@
f_gotPointerCapture = false;
check_PointerEvent(event);
}
- else if(event.type == "pointerover" || event.type == "pointerenter" || event.type == "pointerout" || event.type == "pointerleave") {
- if(!suppressedEventsFail) {
+ else if(event.type == "pointerover" || event.type == "pointerenter") {
+ if(!overEnterEventsFail) {
test(function() {
- assert_true(false, "Suppressed events were received");
- }, "Suppressed events were received");
- suppressedEventsFail = true;
+ assert_true(f_gotPointerCapture, "pointerover/enter should not be received when the target doesn't have capture and pointer is not over it.");
+ }, "pointerover/enter should not be received when the target doesn't have capture and pointer is not over it.");
+ overEnterEventsFail = true;
+ }
+ }
+ else if(event.type == "pointerout" || event.type == "pointerleave") {
+ if(!outLeaveEventsFail) {
+ test(function() {
+ assert_true(f_lostPointerCapture, "pointerout/leave should not be received unless the target just lost the capture.");
+ }, "pointerout/leave should not be received unless the target just lost the capture.");
+ outLeaveEventsFail = true;
}
}
else if (event.pointerId == captured_event.pointerId) {
@@ -49,19 +61,21 @@
}
else {
// if any other events are received after releaseCapture, then the test fails
- test_pointerEvent.step(function () {
- assert_true(false, event.target.id + "-" + event.type + " should be handled by target element handler");
- });
+ test(function () {
+ assert_unreached(event.target.id + "-" + event.type + " should be handled by target element handler");
+ }, "No other events should be recieved by capturing node after release");
}
}
}
function targetEventHandler(event) {
+ if (test_done)
+ return;
if (f_gotPointerCapture) {
if(event.type != "pointerout" && event.type != "pointerleave") {
- test_pointerEvent.step(function () {
- assert_true(false, "The Target element should not have received any events while capture is active. Event recieved:" + event.type + ". ");
- });
+ test(function () {
+ assert_unreached("The Target element should not have received any events while capture is active. Event recieved:" + event.type + ". ");
+ }, "The target element should not receive any events while capture is active");
}
}
@@ -77,6 +91,7 @@
});
if (event.type == "pointerup") {
test_pointerEvent.done(); // complete test
+ test_done = true;
}
}
}
@@ -113,4 +128,4 @@
</div>
<div id="log"></div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_releasepointercapture_release_right_after_capture-manual.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_releasepointercapture_release_right_after_capture-manual.html
new file mode 100644
index 00000000000..5a166a57a53
--- /dev/null
+++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_releasepointercapture_release_right_after_capture-manual.html
@@ -0,0 +1,61 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Release pointer capture right after setpointercapture</title>
+ <meta name="viewport" content="width=device-width">
+ <link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="pointerevent_support.js"></script>
+ <script type="text/javascript">
+ var detected_pointertypes = {};
+ add_completion_callback(showPointerTypes);
+ var test_setPointerCapture = async_test("Release pointer capture right after setpointercapture");
+
+ function run() {
+ var target0 = document.getElementById("target0");
+ var target1 = document.getElementById("target1");
+
+ on_event(target0, "pointerdown", function (event) {
+ detected_pointertypes[event.pointerType] = true;
+ target0.setPointerCapture(event.pointerId);
+ target0.releasePointerCapture(event.pointerId);
+ assert_equals(target0.hasPointerCapture(e.pointerId), false, "After target0.releasePointerCapture, target0.hasPointerCapture should be false");
+ });
+
+ on_event(target0, "gotpointercapture", function (event) {
+ test_setPointerCapture.step(function () {
+ assert_true(false, "target0 shouldn't receive gotpointercapture");
+ });
+ });
+
+ on_event(target0, "lostpointercapture", function (event) {
+ test_setPointerCapture.step(function () {
+ assert_true(false, "target0 shouldn't receive lostpointercapture");
+ });
+ });
+
+ on_event(target0, "pointerup", function (event) {
+ test_setPointerCapture.done();
+ });
+ }
+ </script>
+ </head>
+ <body onload="run()">
+ <h1>Release pointer capture right after setpointercapture</h1>
+ <h4>Test Description:
+ When calling releasePointer right after setPointerCapture method is invoked, the pending pointer capture should be cleared and no element should receive gotpointercapture and lostpointercapture events
+ <ol>
+ <li>Press and hold left mouse button over black box
+ <li>Move mouse and release mouse button
+ </ol>
+ </h4>
+ <br>
+ <div id="target0" touch-action:none></div>
+ <div id="target1" touch-action:none></div>
+ <div id="complete-notice">
+ <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p>
+ </div>
+ <div id="log"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_setpointercapture_override_pending_capture_element-manual.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_setpointercapture_override_pending_capture_element-manual.html
new file mode 100644
index 00000000000..4e4818c21b7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_setpointercapture_override_pending_capture_element-manual.html
@@ -0,0 +1,63 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Test overriding the pending pointer capture element</title>
+ <meta name="viewport" content="width=device-width">
+ <link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="pointerevent_support.js"></script>
+ <script type="text/javascript">
+ var detected_pointertypes = {};
+ add_completion_callback(showPointerTypes);
+ var test_setPointerCapture = async_test("setPointerCapture: override the pending pointer capture element");
+
+ function run() {
+ var target0 = document.getElementById("target0");
+ var target1 = document.getElementById("target1");
+
+ on_event(target0, "pointerdown", function (event) {
+ detected_pointertypes[event.pointerType] = true;
+ target0.setPointerCapture(event.pointerId);
+ test_setPointerCapture.step(function () {
+ assert_equals(target0.hasPointerCapture(event.pointerId), true, "Set capture to target0, target0.hasPointerCapture should be true");
+ });
+ target1.setPointerCapture(event.pointerId);
+ test_setPointerCapture.step(function () {
+ assert_equals(target0.hasPointerCapture(event.pointerId), false, "Set capture to target1, target0.hasPointerCapture should be false");
+ assert_equals(target1.hasPointerCapture(event.pointerId), true, "Set capture to target1, target1.hasPointerCapture should be true");
+ });
+ });
+
+ on_event(target0, "gotpointercapture", function (event) {
+ assert_true(false, "target0 shouldn't receive gotpointercapture");
+ });
+
+ on_event(target1, "gotpointercapture", function (event) {
+ assert_true(true, "target1 should receive gotpointercapture");
+ });
+
+ on_event(target1, "pointerup", function (event) {
+ test_setPointerCapture.done();
+ });
+ }
+ </script>
+ </head>
+ <body onload="run()">
+ <h1>Pointer Event: Test overriding the pending pointer capture element</h1>
+ <h4>Test Description:
+ After an element setPointerCapture, if another element also setPointerCapture and override it, the old pending pointer capture element shouldn't receive any gotpointercapture or lostpointercapture event
+ <ol>
+ <li>Press and hold left mouse button over black box
+ <li>Move mouse and release mouse button
+ </ol>
+ </h4>
+ <br>
+ <div id="target0" touch-action:none></div>
+ <div id="target1" touch-action:none></div>
+ <div id="complete-notice">
+ <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p>
+ </div>
+ <div id="log"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_setpointercapture_relatedtarget-manual.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_setpointercapture_relatedtarget-manual.html
index 45b67414b26..bc319512727 100644
--- a/tests/wpt/web-platform-tests/pointerevents/pointerevent_setpointercapture_relatedtarget-manual.html
+++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_setpointercapture_relatedtarget-manual.html
@@ -13,9 +13,9 @@
<h4>
Test Description: This test checks if setCapture/releaseCapture functions works properly. Complete the following actions:
<ol>
- <li> Put your mouse over the lower rectangle. pointerover should be received for the purple rectangle
+ <li> Put your mouse over the purple rectangle. pointerover should be received for the purple rectangle
<li> Press and hold left mouse button over "Set Capture" button
- <li> Put your mouse over the upper rectangle. pointerover should be received for the black rectangle
+ <li> Move your mouse. pointerover should be received for the black rectangle
<li> Release left mouse button to complete the test.
</ol>
</h4>
@@ -65,15 +65,14 @@
}
function run() {
- // After invoking the setPointerCapture method on an element, subsequent pointer events for the specified pointer must be targeted at that element.
- // Additionally, the relatedTarget property of all such pointer events must be set to null.
- // TA: 13.3
+ // After invoking the setPointerCapture method on an element, subsequent pointer events for the specified pointer must be targeted at that element
+ // and boundary events should be sent accordingly and relatedTarget should behave normally.
on_event(target0, "pointerover", function (event) {
log("pointerover", document.getElementById('target0'));
if(isPointerCapture && isPointeroverGot) {
test(function() {
- assert_true(event.relatedTarget==null, "relatedTarget is null when the capture is set")
- }, "relatedTarget is null when the capture is set. relatedTarget is " + event.relatedTarget);
+ assert_not_equals(event.relatedTarget, null, "relatedTarget should not be null even when the capture is set")
+ }, "relatedTarget should not be null even when the capture is set.");
done();
}
});
@@ -98,4 +97,4 @@
</div>
<div id="log"></div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_setpointercapture_to_same_element_twice-manual.html b/tests/wpt/web-platform-tests/pointerevents/pointerevent_setpointercapture_to_same_element_twice-manual.html
new file mode 100644
index 00000000000..161c5c2fcb9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_setpointercapture_to_same_element_twice-manual.html
@@ -0,0 +1,62 @@
+<!doctype html>
+<html>
+ <head>
+ <title>setPointerCapture() to the element which already captured the pointer</title>
+ <meta name="viewport" content="width=device-width">
+ <link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="pointerevent_support.js"></script>
+ <script type="text/javascript">
+ var detected_pointertypes = {};
+ add_completion_callback(showPointerTypes);
+ var test_setPointerCapture = async_test("setPointerCapture: set to the element which already captured the pointer");
+ var got_pointer_capture = false;
+
+ function run() {
+ var target0 = document.getElementById("target0");
+ var target1 = document.getElementById("target1");
+
+ on_event(target0, "pointerdown", function (event) {
+ detected_pointertypes[event.pointerType] = true;
+ target0.setPointerCapture(event.pointerId);
+ });
+
+ on_event(target0, "gotpointercapture", function (event) {
+ test_setPointerCapture.step(function () {
+ assert_equals(got_pointer_capture, false, "Target0 should receive gotpointercapture at the first time it captured the pointer");
+ assert_equals(target0.hasPointerCapture(event.pointerId), true, "Target 0 received gotpointercapture, target0.hasPointerCapture should be true");
+ });
+ got_pointer_capture = true;
+
+ target0.setPointerCapture(event.pointerId);
+ test_setPointerCapture.step(function () {
+ assert_equals(target0.hasPointerCapture(event.pointerId), true, "Set capture to target0, target0.hasPointerCapture should be true");
+ assert_equals(target1.hasPointerCapture(event.pointerId), false, "Set capture to target0, target1.hasPointerCapture should be false");
+ });
+ });
+
+ on_event(target0, "pointerup", function (event) {
+ test_setPointerCapture.done();
+ });
+ }
+ </script>
+ </head>
+ <body onload="run()">
+ <h1>Pointer Event: setPointerCapture to the element which already captured the pointer</h1>
+ <h4>Test Description:
+ When the setPointerCapture method is invoked, if the target element had already captured the pointer, it should not trigger any gotpointercapture or lostpointercapture event
+ <ol>
+ <li>Press and hold left mouse button over black box
+ <li>Move mouse and release mouse button
+ </ol>
+ </h4>
+ <br>
+ <div id="target0" touch-action:none></div>
+ <div id="target1" touch-action:none></div>
+ <div id="complete-notice">
+ <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p>
+ </div>
+ <div id="log"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/pointerevents/pointerevent_support.js b/tests/wpt/web-platform-tests/pointerevents/pointerevent_support.js
index a7e5d4f1ab4..ee479c7d6ad 100644
--- a/tests/wpt/web-platform-tests/pointerevents/pointerevent_support.js
+++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_support.js
@@ -90,6 +90,9 @@ function check_PointerEvent(event, testNamePrefix) {
assert_greater_than_equal(event.pressure, 0, "pressure is greater than or equal to 0");
assert_less_than_equal(event.pressure, 1, "pressure is less than or equal to 1");
+ if (event.type === "pointerup") {
+ assert_equals(event.pressure, 0, "pressure is 0 during pointerup");
+ }
// TA: 1.7, 1.8
if (event.pointerType === "mouse") {
diff --git a/tests/wpt/web-platform-tests/pointerevents/resources/pointerevent_pointerId_scope-iframe.html b/tests/wpt/web-platform-tests/pointerevents/resources/pointerevent_pointerId_scope-iframe.html
index ad1a57fb492..ab33560b352 100644
--- a/tests/wpt/web-platform-tests/pointerevents/resources/pointerevent_pointerId_scope-iframe.html
+++ b/tests/wpt/web-platform-tests/pointerevents/resources/pointerevent_pointerId_scope-iframe.html
@@ -12,8 +12,6 @@ http://www.w3.org/wiki/PointerEvents/TestAssertions
<script>
function run() {
var target1 = document.getElementById("target1");
- var pointerover_event;
- var ponterId = null;
var eventList = ['pointerenter', 'pointerover', 'pointermove', 'pointerout', 'pointerleave'];
diff --git a/tests/wpt/web-platform-tests/pointerlock/pointerlock_shadow-manual.html b/tests/wpt/web-platform-tests/pointerlock/pointerlock_shadow-manual.html
new file mode 100644
index 00000000000..8e70915bb89
--- /dev/null
+++ b/tests/wpt/web-platform-tests/pointerlock/pointerlock_shadow-manual.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta name='author' title='Takayoshi Kochi' href='mailto:kochi@chromium.org'>
+<meta name='assert' content='Test for DocumentOrShadowRoot.pointerLockElement.'>
+<link rel='help' href='https://w3c.github.io/pointerlock/#widl-DocumentOrShadowRoot-pointerLockElement'>
+<meta name='flags' content='interact'>
+<meta name='timeout' content='long'>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<script src='../shadow-dom/resources/shadow-dom.js'></script>
+</head>
+<body>
+<div id='host'>
+ <template data-mode='open' id='root'>
+ <slot></slot>
+ </template>
+ <div id='host2'>
+ <template data-mode='open' id='root2'>
+ <div id='host3'>
+ <template data-mode='open' id='root3'>
+ <canvas id='canvas'></canvas>
+ <div id='host4'>
+ <template data-mode='open' id='root4'>
+ <div></div>
+ </template>
+ </div>
+ </template>
+ </div>
+ <div id='host5'>
+ <template data-mode='open' id='root5'>
+ <div></div>
+ </template>
+ </div>
+ </template>
+ </div>
+</div>
+
+<script>
+function run_test() {
+ async_test((test) => {
+ document.onpointerlockerror = test.unreached_func('onpointerlockerror is not expected.');
+
+ document.onpointerlockchange = test.step_func(() => {
+ // Not interested in handling before or after exitPointerLock.
+ if (document.pointerLockElement === null)
+ return;
+
+ assert_equals(document.pointerLockElement, ids.host2, 'document.pointerLockElement should be shadow #host2.');
+ assert_equals(ids.root.pointerLockElement, null, '#root\'s shadowRoot.pointerLockElement should be null.');
+ assert_equals(ids.root2.pointerLockElement, ids.host3, '#root2\'s shadowRoot.pointerLockElement should be host3.');
+ assert_equals(ids.root3.pointerLockElement, ids.canvas, '#root3\'s shadowRoot.pointerLockElement should be canvas element.');
+ assert_equals(ids.root4.pointerLockElement, null, '#root4\'s shadowRoot.pointerLockElement should be null.');
+ assert_equals(ids.root5.pointerLockElement, null, '#root5\'s shadowRoot.pointerLockElement should be null.');
+
+ document.exitPointerLock();
+ test.done();
+ });
+
+ var ids = createTestTree(host);
+ document.body.appendChild(ids.host);
+
+ // All pointerLockElement should default to null.
+ test.step(() => {
+ assert_equals(document.pointerLockElement, null);
+ assert_equals(ids.root.pointerLockElement, null);
+ assert_equals(ids.root2.pointerLockElement, null);
+ assert_equals(ids.root3.pointerLockElement, null);
+ assert_equals(ids.root4.pointerLockElement, null);
+ assert_equals(ids.root5.pointerLockElement, null);
+ });
+
+ var canvas = ids.canvas;
+ canvas.requestPointerLock();
+ }, 'Test for pointerLockElement adjustment for Shadow DOM.');
+}
+</script>
+<div>
+ <h2>Description</h2>
+ <p>Click the button below to trigger pointer lock on an element in a shadow root.</p>
+ <button onclick="run_test()">Click Me!</button>
+</div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onclosed-manual.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onclosed-manual.html
index c83f659dd39..f6d912bcbc9 100644
--- a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onclosed-manual.html
+++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onclosed-manual.html
@@ -7,6 +7,7 @@
<link rel="help" href="http://w3c.github.io/presentation-api/#interface-presentationconnection">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="common.js"></script>
<h2>Description</h2>
<p>
This test validates that after connection close,<br/>
@@ -15,15 +16,14 @@
</p>
<br/>
<p>Click the button below to start the test.</p>
-<button id="presentStartBtn" onclick="startPresentation()">Start Presentation Test</button>
+<button id="presentBtn" onclick="startPresentation()">Start Presentation Test</button>
<script>
setup({explicit_timeout: true});
var startPresentation = function () {
+ document.getElementById('presentBtn').disabled = true;
async_test(function(t) {
- var client_id = String(new Date().getTime()) + String(Math.floor(Math.random() * 1e5));
- var url = "support/presentation.html#__castAppId__=C2335F62/__castClientId__="+ client_id;
- var request = new PresentationRequest(url);
+ var request = new PresentationRequest(presentationUrls);
request.start()
.then(function(connection) {
assert_true(connection instanceof PresentationConnection, 'the connection is setup');
diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onconnected-manual.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onconnected-manual.html
index ce6b9cb2e2b..0d26062e8b6 100644
--- a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onconnected-manual.html
+++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onconnected-manual.html
@@ -7,6 +7,7 @@
<link rel="help" href="http://w3c.github.io/presentation-api/#interface-presentationconnection">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="common.js"></script>
<h2>Description</h2>
<p>
This test validates that after connection starts,<br/>
@@ -14,15 +15,14 @@
</p>
<br/>
<p>Click the button below to start the test.</p>
-<button id="presentStartBtn" onclick="startPresentation()">Start Presentation Test</button>
+<button id="presentBtn" onclick="startPresentation()">Start Presentation Test</button>
<script>
setup({explicit_timeout: true});
var startPresentation = function () {
+ document.getElementById('presentBtn').disabled = true;
async_test(function(t) {
- var client_id = String(new Date().getTime()) + String(Math.floor(Math.random() * 1e5));
- var url = "support/presentation.html#__castAppId__=C2335F62/__castClientId__="+ client_id;
- var request = new PresentationRequest(url);
+ var request = new PresentationRequest(presentationUrls);
request.start()
.then(function(connection) {
assert_true(connection instanceof PresentationConnection);
diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onterminated-manual.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onterminated-manual.html
index 48c026a2ea2..b4f5f4e46a9 100644
--- a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onterminated-manual.html
+++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationConnection_onterminated-manual.html
@@ -7,6 +7,7 @@
<link rel="help" href="http://w3c.github.io/presentation-api/#starting-a-presentation">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="common.js"></script>
<h2>Description</h2>
<p>
This test validates that after connection terminate,<br/>
@@ -15,18 +16,21 @@
</p>
<br/>
<p>Click the button below to start the test.</p>
-<button id="presentStartBtn" onclick="startPresentation()">Start Presentation Test</button>
+<button id="presentBtn" onclick="startPresentation()">Start Presentation Test</button>
<script>
setup({explicit_timeout: true});
var startPresentation = function () {
+ document.getElementById('presentBtn').disabled = true;
async_test(function(t) {
- var client_id = String(new Date().getTime()) + String(Math.floor(Math.random() * 1e5));
- var url = "support/presentation.html#__castAppId__=C2335F62/__castClientId__="+ client_id;
- var request = new PresentationRequest(url);
+ var request = new PresentationRequest(presentationUrls);
request.start()
.then(function(connection) {
assert_true(connection instanceof PresentationConnection);
+ connection.onconnected = t.step_func(function(evt) {
+ assert_equals(evt.state, "connected");
+ connection.terminate();
+ });
connection.onterminate = t.step_func_done(function(evt) {
assert_equals(evt.type, "terminate");
assert_equals(connection.state, "terminated");
@@ -34,7 +38,6 @@
connection.onclose = t.step_func_done(function(evt) {
assert_unreached("Wrong, the onclose shouldn't be triggered!");
});
- connection.terminate();
})
.catch(function(ex) {
assert_unreached(ex.name + ":" + ex.message);
diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationRequest_error.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationRequest_error.html
index d4c1dc92fe3..d6324ea56ba 100644
--- a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationRequest_error.html
+++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationRequest_error.html
@@ -14,12 +14,6 @@
}, 'Call PresentationRequest() constructor without presentation URL. TypeError Exception expected.');
test(function() {
- assert_throws(new TypeError(), function() {
- new PresentationRequest(null);
- });
- }, 'Call PresentationRequest constructor with null presentation URL. TypeError Exception expected.');
-
- test(function() {
assert_throws('NotSupportedError', function() {
new PresentationRequest([]);
});
@@ -27,13 +21,13 @@
test(function() {
assert_throws('SyntaxError', function() {
- new PresentationRequest(':invalid');
+ new PresentationRequest('http://@');
});
}, 'Call PresentationRequest constructor with an invalid URL. SyntaxError Exception expected.');
test(function() {
assert_throws('SyntaxError', function() {
- new PresentationRequest(['presentation.html', ':invalid']);
+ new PresentationRequest(['presentation.html', 'http://@']);
});
}, 'Call PresentationRequest constructor with a sequence of URLs, one of them invalid. SyntaxError Exception expected.');
-</script> \ No newline at end of file
+</script>
diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationRequest_onconnectionavailable-manual.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationRequest_onconnectionavailable-manual.html
new file mode 100644
index 00000000000..78c17443014
--- /dev/null
+++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/PresentationRequest_onconnectionavailable-manual.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>PresentationRequest.onconnectionavailable (manual test)</title>
+<link rel="author" title="Tomoyuki Shimizu" href="https://github.com/tomoyukilabs">
+<link rel="help" href="https://w3c.github.io/presentation-api/#starting-a-presentation">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="common.js"></script>
+<p>Click the button below and select the available presentation display, to start the manual test.</p>
+<button id="presentBtn">Start Presentation Test</button>
+
+
+<script>
+ // disable the timeout function for the tests
+ setup({explicit_timeout: true});
+
+ // ----------
+ // DOM Object
+ // ----------
+ var presentBtn = document.getElementById("presentBtn");
+
+ // --------------------------------------------------------------------------
+ // Start New PresentationRequest.onconnectionavailable Test (success) - begin
+ // --------------------------------------------------------------------------
+ var startPresentation = function () {
+ presentBtn.disabled = true;
+ promise_test(function (t) {
+ // Note: During starting a presentation, the connectionavailable event is fired (step 20)
+ // after the promise P is resolved (step 19).
+ return new Promise(function(resolve, reject) {
+ var request = new PresentationRequest(presentationUrls);
+ request.onconnectionavailable = function (evt) {
+ resolve(evt.connection);
+ };
+ // This test fails if request.onconnectionavailable is not invoked although the presentation is started successfully
+ // or the presentation fails to be started
+ request.start().then(function() {
+ t.step_timeout(function() { assert_unreached('The connectionavailable event was not fired.'); }, 5000);
+ }, reject);
+ }).then(function(connection) {
+ // Check the initial state of a presentation connection
+ assert_equals(connection.state, 'connecting', 'The initial state of the presentation connection is "connecting".');
+
+ // Check, if the connection ID is set
+ assert_true(!!connection.id, 'The connection ID is set.');
+
+ // Check the type of the connection.id
+ assert_true(typeof connection.id === 'string', 'The connection ID is a string.');
+
+ // Check the instance of the connection
+ assert_true(connection instanceof PresentationConnection, 'The connection is an instance of PresentationConnection.');
+ });
+ }, 'The connectionavailable event was fired successfully.');
+ }
+ presentBtn.onclick = startPresentation;
+ // ------------------------------------------------------------------------
+ // Start New PresentationRequest.onconnectionavailable Test (success) - end
+ // ------------------------------------------------------------------------
+</script>
+
diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/common.js b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/common.js
new file mode 100644
index 00000000000..a86cb7d955e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/common.js
@@ -0,0 +1,16 @@
+(function (window) {
+ // Cast ID of the main custom receiver application linked with the test suite
+ // That application ID, maintained by W3C team, points at:
+ // https://[W3C test server]/presentation-api/controlling-ua/support/presentation.html
+ //
+ // NB: this mechanism should be improved later on as tests should not depend
+ // on something that directly or indirectly maps to a resource on the W3C test
+ // server.
+ var castAppId = '915D2A2C';
+ var castUrl = 'https://google.com/cast#__castAppId__=' + castAppId;
+
+ window.presentationUrls = [
+ 'support/presentation.html',
+ castUrl
+ ];
+})(window); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/defaultRequest_success-manual.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/defaultRequest_success-manual.html
index 8535d83374c..993343a58bd 100644
--- a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/defaultRequest_success-manual.html
+++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/defaultRequest_success-manual.html
@@ -1,50 +1,58 @@
<!DOCTYPE html>
<meta charset="utf-8">
-<title>Presentation API, testing to start a new presentation with an default request setup. (success - manual)</title>
+<title>[Optional] Starting a presentation from the browser using a default presentation request.</title>
<link rel="author" title="Marius Wessel" href="http://www.fokus.fraunhofer.de">
-<link rel="help" href="http://w3c.github.io/presentation-api/#dfn-controlling-user-agent">
+<link rel="author" title="Tomoyuki Shimizu" href="https://github.com/tomoyukilabs">
+<link rel="help" href="http://w3c.github.io/presentation-api/#dom-presentation-defaultrequest">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="common.js"></script>
-<p>Click the button below and select the available casting device, to start the manual test.</p>
-<button onclick="startPresentation()">Start Presentation Test</button>
+<p>
+ Click the button or the menu item for presentation on your browser (for example, "Cast"), <br>
+ to start the manual test, and select a presentation display when prompted to do so.<br>
+ The test passes if a "PASS" result appears.
+</p>
+<p id="notice">
+ If your browser does not support <code>defaultRequest</code>, please click this button: <button id="notsupported">Not Supported</button>
+</p>
<script>
// disable the timeout function for the tests
// and call 'done()' when the tests cases are finished.
setup({explicit_timeout: true});
- // -------------------
- // defaultRequest init
- // -------------------
- var validUnixDate = new Date().getTime() + String(Math.floor(Math.random() * 1e5)),
- validPresURL = '../receiving-ua/idlharness.html#__castAppId__=2334D33A/__castClientId__=' + validUnixDate;
+ // -----------
+ // DOM Element
+ // -----------
+ var button = document.getElementById('notsupported'),
+ notice = document.getElementById('notice');
- navigator.presentation.defaultRequest = new PresentationRequest(validPresURL);
-
- var startPresentation = function () {
- promise_test(function () {
- return navigator.presentation.defaultRequest.start();
- }, "The presentation was started successfully.");
- }
// ------------------------------
// Start New Presentation with
// 'default request' Test - BEGIN
// ------------------------------
- navigator.presentation.defaultRequest.onconnectionavailable = function (evt) {
- var connection = evt.connection;
-
- test(function () {
-
- assert_equals(connection.state, "connected", "The presentation has an connected state.");
- assert_true(!!connection.id, "The connection ID is set.");
- assert_true(typeof connection.id === 'string', "The connection ID is a string.");
- assert_true(connection instanceof PresentationConnection, "The connection is an instance of PresentationConnection.");
-
- }, "The presentation was started successfully.");
-
- done();
- };
+ async_test(function(t) {
+ // clean up the instruction notice when the test ends
+ t.add_cleanup(function() {
+ notice.parentNode.removeChild(notice);
+ });
+ // set an event handler to make the test fail when the button is clicked
+ button.onclick = t.step_func_done(function() {
+ assert_unreached('This browser does not support defaultRequest.');
+ });
+ // set up a default presentation request
+ var request = new PresentationRequest(presentationUrls);
+ navigator.presentation.defaultRequest = request;
+ request.onconnectionavailable = t.step_func_done(function (evt) {
+ var connection = evt.connection;
+ // check the presentation connection and its attributes
+ assert_equals(connection.state, 'connecting', 'The initial state of the presentation connection is "connecting".');
+ assert_true(!connection.id, 'The connection ID is set.');
+ assert_true(typeof connection.id === 'string', 'The connection ID is a string.');
+ assert_true(connection instanceof PresentationConnection, 'The connection is an instance of PresentationConnection.');
+ });
+ });
// ----------------------------
// Start New Presentation with
// 'default request' Test - END
diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/getAvailability.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/getAvailability.html
index de6ca2b74fb..20712e35fa9 100644
--- a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/getAvailability.html
+++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/getAvailability.html
@@ -5,15 +5,14 @@
<link rel="help" href="http://w3c.github.io/presentation-api/#dfn-controlling-user-agent">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="common.js"></script>
<script>
// ---------------------------------
// Helper Function
// ---------------------------------
var createRequestObject = function () {
- var validUnixDate = new Date().getTime() + String(Math.floor(Math.random() * 1e5)),
- presUrl = "../receiving-ua/idlharness.html#__castAppId__=2334D33A/__castClientId__=" + validUnixDate,
- request = new PresentationRequest(presUrl);
+ var request = new PresentationRequest(presentationUrls);
return request;
}
@@ -64,19 +63,6 @@
assert_true(availability.value);
});
}, "There is an availability.");
-
-
- // Invalid Presentation URL Test
- promise_test(function () {
- var validUnixDate = new Date().getTime() + String(Math.floor(Math.random() * 1e5)),
- invalidPresUrl = "../receiving-ua/idlharness.html#__castAppId__=3445E44B/__castClientId__=" + validUnixDate,
- request = new PresentationRequest(invalidPresUrl);
-
- return request.getAvailability()
- .then(function (availability) {
- assert_false(availability.value);
- });
- }, "There is no availability for an invalid presentation URL.");
// -------------------------------
// Screen Availability Tests - end
// -------------------------------
diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/idlharness.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/idlharness.html
index bfc0e14b2f7..8c3268af228 100644
--- a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/idlharness.html
+++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/idlharness.html
@@ -96,7 +96,7 @@ enum PresentationConnectionClosedReason {
"wentaway"
};
-[Constructor(DOMString type, PresentationConnectionClosedEventInit eventInitDict)]
+[Constructor(DOMString type, PresentationConnectionCloseEventInit eventInitDict)]
interface PresentationConnectionCloseEvent : Event {
readonly attribute PresentationConnectionClosedReason reason;
readonly attribute DOMString message;
diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/reconnectToPresentation_error-manual.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/reconnectToPresentation_error-manual.html
deleted file mode 100644
index 7d340e8f64b..00000000000
--- a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/reconnectToPresentation_error-manual.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!doctype html>
-<meta charset="utf-8">
-<title>Presentation API reconnect a presentation for Controlling User Agent (Error - manual test)</title>
-<link rel="author" title="Franck William Taffo" href="http://www.fokus.fraunhofer.de">
-<link rel="help" href="http://w3c.github.io/presentation-api/#dfn-controlling-user-agent">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script>
-
- /**
- *
- * Test if reconnect returns a NotFoundError() by wrong presentation ID
- */
-
- var client_id = String(new Date().getTime()) + String(Math.floor(Math.random() * 1e5));
- //relative presentation URL
- var presentation_url = "../receiving-ua/idlharness.html#__castAppId__=2334D33A/__castClientId__="+ client_id;
- var request = new PresentationRequest(presentation_url);
- var wrong_presentationId = null;
-
- var reconnect = function () {
- promise_test(function () {
-
- var presId = "presId";
- // presId is mandatory when reconnecting to a presentation.
- return request.reconnect(presId)
- .then(function (setConnection) {
- assert_unreached("reconnect should not return a Promise resolve by wrong presentation ID");
- })
- }, "Check that the promise is rejected by wrong presentation Id");
- };
-
- setup({explicit_timeout: true})
-</script>
-<p>click on the button to the perfom the test</p>
-<button id="reconnectBtn" onclick="reconnect()">Reconnect</button> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/reconnectToPresentation_notfound_error.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/reconnectToPresentation_notfound_error.html
new file mode 100644
index 00000000000..390e42eae77
--- /dev/null
+++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/reconnectToPresentation_notfound_error.html
@@ -0,0 +1,16 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Calling "reconnect" with an unknown presentation ID fails with a NotFoundError exception</title>
+<link rel="author" title="Franck William Taffo" href="http://www.fokus.fraunhofer.de">
+<link rel="author" title="Louay Bassbouss" href="http://www.fokus.fraunhofer.de">
+<link rel="help" href="http://w3c.github.io/presentation-api/#dom-presentationrequest-reconnect">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="common.js"></script>
+<script>
+ promise_test(function (t) {
+ var wrongPresentationId = "wrongPresentationId";
+ var request = new PresentationRequest(presentationUrls);
+ return promise_rejects(t, 'NotFoundError', request.reconnect(wrongPresentationId));
+ });
+</script>
diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/reconnectToPresentation_success-manual.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/reconnectToPresentation_success-manual.html
index f2c9ac32f8c..db06cf6d86a 100644
--- a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/reconnectToPresentation_success-manual.html
+++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/reconnectToPresentation_success-manual.html
@@ -5,6 +5,7 @@
<link rel="help" href="http://w3c.github.io/presentation-api/#dfn-controlling-user-agent">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="common.js"></script>
<ol>
<li>Start the presentation with the blue button.</li>
@@ -31,9 +32,7 @@
// ------------
// Request init
// ------------
- var validUnixDate = new Date().getTime() + String(Math.floor(Math.random() * 1e5)),
- validPresURL = '../receiving-ua/idlharness.html#__castAppId__=2334D33A/__castClientId__=' + validUnixDate,
- request = new PresentationRequest(validPresURL);
+ var request = new PresentationRequest(presentationUrls);
// ----------------------------------------
diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_displaynotallowed-manual.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_displaynotallowed-manual.html
new file mode 100644
index 00000000000..63f5564d822
--- /dev/null
+++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_displaynotallowed-manual.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Calling "start" when the user denied permission to use the display returns a Promise rejected with a NotAllowedError exception.</title>
+<link rel="author" title="Tomoyuki Shimizu" href="https://github.com/tomoyukilabs/">
+<link rel="help" href="http://w3c.github.io/presentation-api/#dfn-controlling-user-agent">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="common.js"></script>
+
+<p>Before starting this test, confirm that there are one or more available presentation display on your local network.</p>
+<p>Click the button below to start the manual test. If prompted to select a device, please dismiss the dialog box. The test passes if a "PASS" result appears.
+</p>
+<button id="presentBtn" onclick="startPresentation()">Start Presentation Test</button>
+
+<script>
+ // ----------
+ // DOM Object
+ // ----------
+ var presentBtn = document.getElementById("presentBtn");
+
+ // -------------------------------------------
+ // Start New Presentation Test (error) - begin
+ // -------------------------------------------
+ var startPresentation = function () {
+ presentBtn.disabled = true;
+ promise_test(function (t) {
+ var request = new PresentationRequest(presentationUrls);
+ return promise_rejects(t, 'NotAllowedError', request.start());
+ });
+ };
+ // -----------------------------------------
+ // Start New Presentation Test (error) - end
+ // -----------------------------------------
+</script>
diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_displaynotfound-manual.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_displaynotfound-manual.html
new file mode 100644
index 00000000000..69d27f7edc7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_displaynotfound-manual.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Calling "start" when there is no available presentation display returns a Promise rejected with a NotFoundError exception.</title>
+<link rel="author" title="Tomoyuki Shimizu" href="https://github.com/tomoyukilabs/">
+<link rel="help" href="http://w3c.github.io/presentation-api/#dfn-controlling-user-agent">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="common.js"></script>
+
+<p>Before starting this test, confirm that there is no available presentation display on your local network.</p>
+<p>Click the button below to start the manual test. If prompted to select a device, please dismiss the dialog box. The test passes if a "PASS" result appears.
+</p>
+<button id="presentBtn" onclick="startPresentation()">Start Presentation Test</button>
+
+<script>
+ // ----------
+ // DOM Object
+ // ----------
+ var presentBtn = document.getElementById("presentBtn");
+
+ // -------------------------------------------
+ // Start New Presentation Test (error) - begin
+ // -------------------------------------------
+ var startPresentation = function () {
+ presentBtn.disabled = true;
+ promise_test(function (t) {
+ var request = new PresentationRequest(presentationUrls);
+ return promise_rejects(t, 'NotFoundError', request.start());
+ });
+ };
+ // -----------------------------------------
+ // Start New Presentation Test (error) - end
+ // -----------------------------------------
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_error-manual.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_error-manual.html
deleted file mode 100644
index bd62a372ca3..00000000000
--- a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_error-manual.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>Presentation API, start new presentation tests for Controlling User Agent (error - manual test)</title>
-<link rel="author" title="Marius Wessel" href="http://www.fokus.fraunhofer.de">
-<link rel="help" href="http://w3c.github.io/presentation-api/#dfn-controlling-user-agent">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-
-<p>Click the button below and abort the selection for an device, to start the manual test.</p>
-<button id="presentBtn" onclick="startPresentation()">Start Presentation Test</button>
-
-<script>
- // ----------
- // DOM Object
- // ----------
- var presentBtn = document.getElementById("presentBtn");
-
- // ------------
- // Request init
- // ------------
- var validUnixDate = new Date().getTime() + String(Math.floor(Math.random() * 1e5)),
- validPresURL = '../receiving-ua/idlharness.html#__castAppId__=2334D33A/__castClientId__=' + validUnixDate,
- request = new PresentationRequest(validPresURL);
-
- // -------------------------------------------
- // Start New Presentation Test (error) - begin
- // -------------------------------------------
- var startPresentation = function () {
- promise_test(function () {
- return request.start()
- .catch(function (err) {
-
- test(function () {
- assert_true(err.code == 20, 'The error code is equal to 20.');
- }, 'Check, if the error code is correct.')
-
- test(function () {
- assert_true(err.message === 'Dialog closed.', 'The error message is equal to "Dialog closed."');
- }, 'Check, if the error message is correct.')
-
- assert_true(err.name === 'AbortError', 'The error name is AbortError.');
-
- });
- }, "The starting process for the presentation has been aborted.");
- }
- // -----------------------------------------
- // Start New Presentation Test (error) - end
- // -----------------------------------------
-</script>
-
diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_error.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_error.html
index a677b08a01a..8a4e6282410 100644
--- a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_error.html
+++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_error.html
@@ -6,24 +6,12 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
-
-
- // ------------
- // Request init
- // ------------
- var validUnixDate = new Date().getTime() + String(Math.floor(Math.random() * 1e5)),
- validPresURL = '../receiving-ua/idlharness.html#__castAppId__=2334D33A/__castClientId__=' + validUnixDate,
- request = new PresentationRequest(validPresURL);
-
// -----------------------------------
// Start New Presentation Test - begin
// -----------------------------------
- promise_test(function () {
- return request.start()
- .catch(function (error) {
- assert_true(error instanceof InvalidAccessError);
- });
-
+ promise_test(function (t) {
+ var request = new PresentationRequest('presentation.html');
+ promise_rejects(t, 'InvalidAccessError', request.start());
}, "The presentation could not start, because a user gesture is required.");
// ----------------------------------
// Launch New Presentation Test - end
diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_success-manual.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_success-manual.html
index 8e1cc7b83ac..f8e7f18a357 100644
--- a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_success-manual.html
+++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_success-manual.html
@@ -1,59 +1,90 @@
<!DOCTYPE html>
<meta charset="utf-8">
-<title>Presentation API, start new presentation tests for Controlling User Agent (success - manual test)</title>
+<title>Checking the chain of events when starting a new presentation</title>
<link rel="author" title="Marius Wessel" href="http://www.fokus.fraunhofer.de">
+<link rel="author" title="Tomoyuki Shimizu" href="https://github.com/tomoyukilabs">
<link rel="help" href="http://w3c.github.io/presentation-api/#dfn-controlling-user-agent">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="common.js"></script>
-<p>Click the button below and select the available casting device, to start the manual test.</p>
-<button id="presentBtn" onclick="startPresentation()">Start Presentation Test</button>
+<p>Click the button below and select the available presentation display, to start the manual test.</p>
+<button id="presentBtn">Start Presentation Test</button>
<script>
+ // description of event order
+ var description = [
+ "Phase #1: Promise is resolved",
+ "Phase #2: 'connectionavailable' event fired",
+ "Phase #3: 'connect' event fired"
+ ];
+ var step = 0;
+
+ // presentation connection
+ var connection;
+
+ // disable the timeout function for the tests
+ setup({explicit_timeout: true});
+
// ----------
// DOM Object
// ----------
var presentBtn = document.getElementById("presentBtn");
- // ------------
- // Request init
- // ------------
- var validUnixDate = new Date().getTime() + String(Math.floor(Math.random() * 1e5)),
- validPresURL = '../receiving-ua/idlharness.html#__castAppId__=2334D33A/__castClientId__=' + validUnixDate,
- request = new PresentationRequest(validPresURL);
-
// ---------------------------------------------
// Start New Presentation Test (success) - begin
// ---------------------------------------------
- var startPresentation = function () {
- promise_test(function () {
- return request.start()
- .then(function (connection) {
-
- // assert case for the promise_test
- assert_equals(connection.state, "connected", "The presentation has an connected state.");
-
- // Check, if the connection ID is set
- test(function () {
- assert_true(!!connection.id);
- }, 'The connection ID is set.');
-
- // Check the type of the connection.id
- test(function () {
- assert_true(typeof connection.id === 'string');
- }, 'The connection ID is a string.');
-
- // Check the instance of the connection
- test(function () {
- assert_true(connection instanceof PresentationConnection);
- }, 'The connection is an instance of PresentationConnection.');
- });
-
- }, "The presentation was started successfully.");
+ presentBtn.onclick = function () {
+ presentBtn.disabled = true;
+ promise_test(function (t) {
+ var phase = -1, actual = -1;
+
+ // increment the count in the actual event order
+ var count = function(evt) { actual++; return evt; };
+ // increment the count in the expected event order and compare it with the actual event order
+ var checkPhase = function(evt) { phase++; assert_equals(description[actual], description[phase], 'Event order is incorrect.'); return evt; };
+
+ var request = new PresentationRequest(presentationUrls);
+ var eventWatcher = new EventWatcher(t, request, 'connectionavailable');
+ var waitConnectionavailable = eventWatcher.wait_for('connectionavailable').then(count);
+ var waitConnect;
+
+ return request.start().then(count)
+ .then(checkPhase).then(function (c) {
+ // Phase #1: Promise is resolved
+ connection = c;
+
+ // No more user input needed, re-enable timeout
+ t.step_timeout(function() {
+ t.force_timeout();
+ t.done();
+ }, 5000);
+
+ // Check the initial state of the presentation connection
+ assert_equals(connection.state, 'connecting', 'Check the initial state of the presentation connection.');
+ assert_true(!!connection.id, 'The connection ID is set.');
+ assert_true(typeof connection.id === 'string', 'The connection ID is a string.');
+ assert_true(connection instanceof PresentationConnection, 'The connection is an instance of PresentationConnection.');
+
+ var eventWatcher = new EventWatcher(t, connection, 'connect');
+ waitConnect = eventWatcher.wait_for('connect').then(count);
+
+ return waitConnectionavailable;
+ })
+ .then(checkPhase).then(function (evt) {
+ // Phase #2: "connectionavailable" event fired
+ assert_equals(connection, evt.connection, 'Both Promise from PresentationRequest() and a "connectionavailable" event handler receive the same presentation connection.');
+
+ return waitConnect;
+ })
+ .then(checkPhase).then(function () {
+ // Phase #3: "connect" event fired
+ assert_equals(connection.state, 'connected', 'The state of the presentation connection is "connected" when a "connect" event fires.');
+ });
+ });
}
// -------------------------------------------
// Start New Presentation Test (success) - end
// -------------------------------------------
-</script>
-
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_unsettledpromise-manual.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_unsettledpromise-manual.html
new file mode 100644
index 00000000000..192b4790002
--- /dev/null
+++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/startNewPresentation_unsettledpromise-manual.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Calling "start" when there is already an unsettled Promise returns a Promise rejected with an OperationError exception.</title>
+<link rel="author" title="Tomoyuki Shimizu" href="https://github.com/tomoyukilabs/">
+<link rel="help" href="http://w3c.github.io/presentation-api/#dfn-controlling-user-agent">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="common.js"></script>
+
+<p>Click the button below to start the manual test. If prompted to select a device, please dismiss the dialog box. The test passes if a "PASS" result appears.</p>
+<button id="presentBtn" onclick="startPresentation()">Start Presentation Test</button>
+
+<script>
+ // ----------
+ // DOM Object
+ // ----------
+ var presentBtn = document.getElementById("presentBtn");
+
+ // -------------------------------------------
+ // Start New Presentation Test (error) - begin
+ // -------------------------------------------
+ var startPresentation = function () {
+ presentBtn.disabled = true;
+ promise_test(function (t) {
+ var request1 = new PresentationRequest(presentationUrls),
+ request2 = new PresentationRequest(presentationUrls);
+ request1.start().catch(function(){});
+ return promise_rejects(t, 'OperationError', request2.start());
+ });
+ };
+ // -----------------------------------------
+ // Start New Presentation Test (error) - end
+ // -----------------------------------------
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/support/iframe.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/support/iframe.html
index 60f94b69d2a..b061a35271a 100644
--- a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/support/iframe.html
+++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/support/iframe.html
@@ -3,10 +3,21 @@
<title>Presentation API - controlling ua - sandboxing</title>
<link rel="author" title="Francois Daoust" href="https://www.w3.org/People/#fd">
<link rel="help" href="http://w3c.github.io/presentation-api/#dom-presentationrequest-start">
+<script src="../common.js"></script>
<script>
window.onmessage = function (ev) {
try {
- var request = new PresentationRequest('presentation.html');;
+ // Presentation URLs are relative to the "controlling-ua" folder,
+ // update relative URLs for this folder
+ var urls = presentationUrls.map(function (url) {
+ if (/:\/\//.test(url)) {
+ return url;
+ }
+ else {
+ return '../' + url;
+ }
+ });
+ var request = new PresentationRequest(urls);
if (ev.data === 'start') {
request.start()
.then(function () {
diff --git a/tests/wpt/web-platform-tests/presentation-api/receiving-ua/idlharness.html b/tests/wpt/web-platform-tests/presentation-api/receiving-ua/idlharness.html
index 3e39ed8f468..24b0859a683 100644
--- a/tests/wpt/web-platform-tests/presentation-api/receiving-ua/idlharness.html
+++ b/tests/wpt/web-platform-tests/presentation-api/receiving-ua/idlharness.html
@@ -81,13 +81,13 @@ enum PresentationConnectionClosedReason {
"wentaway"
};
-[Constructor(DOMString type, PresentationConnectionClosedEventInit eventInitDict)]
-interface PresentationConnectionClosedEvent : Event {
+[Constructor(DOMString type, PresentationConnectionCloseEventInit eventInitDict)]
+interface PresentationConnectionCloseEvent : Event {
readonly attribute PresentationConnectionClosedReason reason;
readonly attribute DOMString message;
};
-dictionary PresentationConnectionClosedEventInit : EventInit {
+dictionary PresentationConnectionCloseEventInit : EventInit {
required PresentationConnectionClosedReason reason;
DOMString message = "";
};
diff --git a/tests/wpt/web-platform-tests/referrer-policy/generic/common.js b/tests/wpt/web-platform-tests/referrer-policy/generic/common.js
index 492031859c8..4b7feb4777b 100644
--- a/tests/wpt/web-platform-tests/referrer-policy/generic/common.js
+++ b/tests/wpt/web-platform-tests/referrer-policy/generic/common.js
@@ -33,20 +33,30 @@ function appendIframeToBody(url, attributes) {
return iframe;
}
-function loadImage(src, callback, attributes) {
- var image = new Image();
+function loadImageInWindow(src, callback, attributes, w) {
+ var image = new w.Image();
image.crossOrigin = "Anonymous";
image.onload = function() {
callback(image);
}
- image.src = src;
+
// Extend element with attributes. (E.g. "referrerPolicy" or "rel")
if (attributes) {
for (var attr in attributes) {
image[attr] = attributes[attr];
}
}
- document.body.appendChild(image)
+
+ image.src = src;
+ w.document.body.appendChild(image)
+}
+
+function extractImageData(img) {
+ var canvas = document.createElement("canvas");
+ var context = canvas.getContext('2d');
+ context.drawImage(img, 0, 0);
+ var imgData = context.getImageData(0, 0, img.clientWidth, img.clientHeight);
+ return imgData.data;
}
function decodeImageData(rgba) {
@@ -73,16 +83,6 @@ function decodeImageData(rgba) {
return JSON.parse(string_data);
}
-function decodeImage(url, callback, referrer_policy) {
- loadImage(url, function(img) {
- var canvas = document.createElement("canvas");
- var context = canvas.getContext('2d');
- context.drawImage(img, 0, 0);
- var imgData = context.getImageData(0, 0, img.clientWidth, img.clientHeight);
- callback(decodeImageData(imgData.data))
- }, referrer_policy);
-}
-
function normalizePort(targetPort) {
var defaultPorts = [80, 443];
var isDefaultPortForProtocol = (defaultPorts.indexOf(targetPort) >= 0);
@@ -112,9 +112,22 @@ function queryIframe(url, callback, referrer_policy) {
}
function queryImage(url, callback, referrer_policy) {
- decodeImage(url, function(server_data) {
- callback(wrapResult(url, server_data), url);
- }, referrer_policy)
+ // For images, we'll test both images in a top-level document as well as
+ // images in a `srcdoc` frame to ensure that the latter has the same referrer
+ // as the former.
+ var i = document.createElement('iframe');
+ i.srcdoc = "Hello, world.";
+ i.onload = function () {
+ loadImageInWindow(url, function (img) {
+ var srcdocData = decodeImageData(extractImageData(img));
+ loadImageInWindow(url, function (img) {
+ var topLevelData = decodeImageData(extractImageData(img));
+ assert_equals(srcdocData.referrer, topLevelData.referrer, "Referrer inside 'srcdoc' should be the same as embedder's referrer.");
+ callback(wrapResult(url, topLevelData), url);
+ }, referrer_policy, window);
+ }, referrer_policy, i.contentWindow);
+ };
+ document.body.appendChild(i);
}
function queryXhr(url, callback) {
diff --git a/tests/wpt/web-platform-tests/resource-timing/resources/gzip_xml.py b/tests/wpt/web-platform-tests/resource-timing/resources/gzip_xml.py
new file mode 100644
index 00000000000..3346da6c969
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resource-timing/resources/gzip_xml.py
@@ -0,0 +1,17 @@
+import gzip as gzip_module
+from cStringIO import StringIO
+
+def main(request, response):
+ f = open('resource-timing/resources/resource_timing_test0.xml', 'r')
+ output = f.read()
+
+ out = StringIO()
+ with gzip_module.GzipFile(fileobj=out, mode="w") as f:
+ f.write(output)
+ output = out.getvalue()
+
+ headers = [("Content-type", "text/plain"),
+ ("Content-Encoding", "gzip"),
+ ("Content-Length", len(output))]
+
+ return headers, output
diff --git a/tests/wpt/web-platform-tests/resource-timing/test_resource_timing.js b/tests/wpt/web-platform-tests/resource-timing/test_resource_timing.js
index 60c8c88f548..d632a0d5f57 100644
--- a/tests/wpt/web-platform-tests/resource-timing/test_resource_timing.js
+++ b/tests/wpt/web-platform-tests/resource-timing/test_resource_timing.js
@@ -12,7 +12,9 @@ setup(function() {
tests[type] = {
"entry": async_test("window.performance.getEntriesByName() and window.performance.getEntriesByNameType() return same data (" + type + ")"),
"simple_attrs": async_test("PerformanceEntry has correct name, initiatorType, startTime, and duration (" + type + ")"),
- "timing_attrs": async_test("PerformanceEntry has correct order of timing attributes (" + type + ")")
+ "timing_attrs": async_test("PerformanceEntry has correct order of timing attributes (" + type + ")"),
+ "network_attrs": async_test("PerformanceEntry has correct network transfer attributes (" + type + ")"),
+ "protocol": async_test("PerformanceEntry has correct protocol attribute (" + type + ")")
};
}
});
@@ -44,6 +46,8 @@ onload = function()
var type;
var startTime;
var element;
+ var encodedBodySize;
+ var decodedBodySize;
for (var i in initiatorTypes) {
startTime = window.performance.now();
type = initiatorTypes[i];
@@ -56,32 +60,45 @@ onload = function()
case "iframe":
url = resolve("resources/resource_timing_test0.html");
element.src = url;
+ encodedBodySize = 215;
+ decodedBodySize = 215;
break;
case "img":
url = resolve("resources/resource_timing_test0.png");
element.src = url;
+ encodedBodySize = 249;
+ decodedBodySize = 249;
break;
case "link":
element.rel = "stylesheet";
url = resolve("resources/resource_timing_test0.css");
element.href = url;
+ encodedBodySize = 44;
+ decodedBodySize = 44;
break;
case "script":
element.type = "text/javascript";
url = resolve("resources/resource_timing_test0.js");
element.src = url;
+ encodedBodySize = 133;
+ decodedBodySize = 133;
break;
case "xmlhttprequest":
var xmlhttp = new XMLHttpRequest();
- url = resolve("resources/resource_timing_test0.xml");
+ url = resolve("resources/gzip_xml.py");
xmlhttp.open('GET', url, true);
xmlhttp.send();
+ encodedBodySize = 112;
+ decodedBodySize = 125;
break;
}
expected_entry = {name:url,
startTime: startTime,
- initiatorType: type};
+ initiatorType: type,
+ encodedBodySize: encodedBodySize,
+ decodedBodySize: decodedBodySize
+ };
switch (type) {
case "link":
@@ -108,6 +125,8 @@ onload = function()
};
function poll_for_stylesheet_load(expected_entry) {
+ var t = tests[expected_entry.initiatorType];
+
function inner() {
for(var i=0; i<document.styleSheets.length; i++) {
var sheet = document.styleSheets[i];
@@ -120,14 +139,14 @@ function poll_for_stylesheet_load(expected_entry) {
hasRules = false;
}
if (hasRules) {
- setTimeout(function() {
+ t["entry"].step_timeout(function() {
resource_load(expected_entry);
}, 200);
return;
}
}
}
- setTimeout(inner, 100);
+ t["entry"].step_timeout(inner, 100);
}
inner();
}
@@ -183,4 +202,22 @@ function resource_load(expected)
this.done();
});
+ t["network_attrs"].step(function test() {
+ var actual = window.performance.getEntriesByName(expected.name)[0];
+ assert_equals(actual.encodedBodySize, expected.encodedBodySize, "encodedBodySize size");
+ assert_equals(actual.decodedBodySize, expected.decodedBodySize, "decodedBodySize size");
+
+ // Transfer size will vary from browser to browser based on default headers, etc. This
+ // test verifies that transferSize for uncached resources is greater than on-the-wire
+ // body size.
+ assert_greater_than(actual.transferSize, actual.encodedBodySize, "transferSize size");
+ this.done();
+ });
+
+ t["protocol"].step(function() {
+ var actual = window.performance.getEntriesByName(expected.name)[0];
+ assert_equals(actual.nextHopProtocol, "http/1.1", "expected protocol");
+ this.done();
+ });
+
}
diff --git a/tests/wpt/web-platform-tests/resources/idlharness.js b/tests/wpt/web-platform-tests/resources/idlharness.js
index 6089646591f..7d0abf4bfc3 100644
--- a/tests/wpt/web-platform-tests/resources/idlharness.js
+++ b/tests/wpt/web-platform-tests/resources/idlharness.js
@@ -447,6 +447,14 @@ IdlArray.prototype.assert_type_is = function(value, type)
return;
}
+ if (type.generic === "Promise") {
+ assert_own_property(value, "then", "Attribute with a Promise type has a then property");
+ // TODO: Ideally, we would check on project fulfillment
+ // that we get the right type
+ // but that would require making the type check async
+ return;
+ }
+
type = type.idlType;
switch(type)
diff --git a/tests/wpt/web-platform-tests/resources/testharness.js b/tests/wpt/web-platform-tests/resources/testharness.js
index 5b924b10948..49e386754ba 100644
--- a/tests/wpt/web-platform-tests/resources/testharness.js
+++ b/tests/wpt/web-platform-tests/resources/testharness.js
@@ -527,7 +527,11 @@ policies and contribution forms [3].
tests.promise_tests = Promise.resolve();
}
tests.promise_tests = tests.promise_tests.then(function() {
- return Promise.resolve(test.step(func, test, test))
+ var promise = test.step(func, test, test);
+ test.step(function() {
+ assert_not_equals(promise, undefined);
+ });
+ return Promise.resolve(promise)
.then(
function() {
test.done();
@@ -1247,6 +1251,7 @@ policies and contribution forms [3].
ReadOnlyError: 0,
VersionError: 0,
OperationError: 0,
+ NotAllowedError: 0
};
if (!(name in name_code_map)) {
@@ -2463,6 +2468,11 @@ policies and contribution forms [3].
}
}
+ // 'Error.stack' is not supported in all browsers/versions
+ if (!stack) {
+ return "(Stack trace unavailable)";
+ }
+
var lines = stack.split("\n");
// Create a pattern to match stack frames originating within testharness.js. These include the
diff --git a/tests/wpt/web-platform-tests/secure-contexts/basic-dedicated-worker.html b/tests/wpt/web-platform-tests/secure-contexts/basic-dedicated-worker.html
new file mode 100644
index 00000000000..737f31b1dcf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/secure-contexts/basic-dedicated-worker.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Test WorkerGlobalScope.isSecureContext for HTTP creator</title>
+ <meta name="help" href="https://w3c.github.io/webappsec-secure-contexts/#monkey-patching-global-object">
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+ <script src="server-locations.sub.js"></script>
+ </head>
+ <body>
+ <script>
+ var t1 = async_test("HTTP worker");
+ var t2 = async_test("HTTPS worker");
+ var t3 = async_test("HTTP nested worker");
+ var t4 = async_test("HTTPS nested worker");
+ var t5 = async_test("HTTP worker from HTTPS subframe");
+ var t6 = async_test("HTTPS worker from HTTPS subframe");
+
+ var w1 = new Worker(http_dir + "support/dedicated-worker-script.js");
+ w1.onmessage = t1.step_func_done(function(e) {
+ assert_false(e.data);
+ });
+ w1.onerror = t1.step_func_done(function(e) {
+ assert_unreached("isSecureContext should be supported");
+ });
+
+ var w2 = new Worker(https_dir + "support/dedicated-worker-script.js");
+ w2.onmessage = t2.step_func_done(function(e) {
+ assert_unreached("cross-origin workers should not be loaded");
+ });
+ w2.onerror = t2.step_func_done(function(e) {
+ e.preventDefault();
+ });
+
+ var w3 = new Worker(http_dir + "support/parent-dedicated-worker-script.js");
+ w3.onmessage = t3.step_func_done(function(e) {
+ assert_false(e.data);
+ });
+ w3.onerror = t3.step_func_done(function(e) {
+ assert_unreached("isSecureContext should be supported");
+ });
+
+ var w4 = new Worker(https_dir + "support/parent-dedicated-worker-script.js");
+ w4.onmessage = t4.step_func_done(function(e) {
+ assert_unreached("cross-origin workers should not be loaded");
+ });
+ w4.onerror = t4.step_func_done(function(e) {
+ e.preventDefault();
+ });
+
+ onmessage = function(e) {
+ var data = e.data;
+ if (data.type == "http") {
+ t5.step(function() {
+ assert_true(data.error);
+ });
+ t5.done();
+ } else if (data.type == "https") {
+ t6.step(function() {
+ assert_false(data.error);
+ assert_false(data.isSecureContext);
+ });
+ t6.done();
+ } else {
+ t5.step(function() {
+ assert_unreached("Unknown message");
+ });
+ t5.done();
+ t6.step(function() {
+ assert_unreached("Unknown message");
+ });
+ t6.done();
+ }
+ }
+
+ var ifr = document.createElement("iframe");
+ ifr.src = https_dir + "support/https-subframe-dedicated.html";
+ document.body.appendChild(ifr);
+ </script>
+ </body>
+</html>
+
diff --git a/tests/wpt/web-platform-tests/secure-contexts/basic-dedicated-worker.https.html b/tests/wpt/web-platform-tests/secure-contexts/basic-dedicated-worker.https.html
new file mode 100644
index 00000000000..012c7b1da16
--- /dev/null
+++ b/tests/wpt/web-platform-tests/secure-contexts/basic-dedicated-worker.https.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Test WorkerGlobalScope.isSecureContext for HTTPS creator</title>
+ <meta name="help" href="https://w3c.github.io/webappsec-secure-contexts/#monkey-patching-global-object">
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+ <script src="server-locations.sub.js"></script>
+ </head>
+ <body>
+ <script>
+ var t1 = async_test("HTTP worker");
+ var t2 = async_test("HTTPS worker");
+ var t3 = async_test("HTTP nested worker");
+ var t4 = async_test("HTTPS nested worker");
+ var t5 = async_test("HTTP worker from HTTPS subframe");
+ var t6 = async_test("HTTPS worker from HTTPS subframe");
+
+ var w1 = new Worker(http_dir + "support/dedicated-worker-script.js");
+ w1.onmessage = t1.step_func_done(function(e) {
+ assert_unreached("cross-origin workers should not be loaded");
+ });
+ w1.onerror = t1.step_func_done(function(e) {
+ e.preventDefault();
+ });
+
+ var w2 = new Worker(https_dir + "support/dedicated-worker-script.js");
+ w2.onmessage = t2.step_func_done(function(e) {
+ assert_true(e.data);
+ });
+ w2.onerror = t2.step_func_done(function(e) {
+ assert_unreached("isSecureContext should be supported");
+ });
+
+ var w3 = new Worker(http_dir + "support/parent-dedicated-worker-script.js");
+ w3.onmessage = t3.step_func_done(function(e) {
+ assert_unreached("cross-origin workers should not be loaded");
+ });
+ w3.onerror = t3.step_func_done(function(e) {
+ e.preventDefault();
+ });
+
+ var w4 = new Worker(https_dir + "support/parent-dedicated-worker-script.js");
+ w4.onmessage = t4.step_func_done(function(e) {
+ assert_true(e.data);
+ });
+ w4.onerror = t4.step_func_done(function(e) {
+ assert_unreached("isSecureContext should be supported");
+ });
+
+ onmessage = function(e) {
+ var data = e.data;
+ if (data.type == "http") {
+ t5.step(function() {
+ assert_true(data.error);
+ });
+ t5.done();
+ } else if (data.type == "https") {
+ t6.step(function() {
+ assert_false(data.error);
+ assert_true(data.isSecureContext);
+ });
+ t6.done();
+ } else {
+ t5.step(function() {
+ assert_unreached("Unknown message");
+ });
+ t5.done();
+ t6.step(function() {
+ assert_unreached("Unknown message");
+ });
+ t6.done();
+ }
+ }
+
+ var ifr = document.createElement("iframe");
+ ifr.src = https_dir + "support/https-subframe-dedicated.html";
+ document.body.appendChild(ifr);
+ </script>
+ </body>
+</html>
+
diff --git a/tests/wpt/web-platform-tests/secure-contexts/basic-shared-worker.html b/tests/wpt/web-platform-tests/secure-contexts/basic-shared-worker.html
new file mode 100644
index 00000000000..76c28a36e4f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/secure-contexts/basic-shared-worker.html
@@ -0,0 +1,69 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Test SharedWorkerGlobalScope.isSecureContext for HTTP creator</title>
+ <meta name="help" href="https://w3c.github.io/webappsec-secure-contexts/#monkey-patching-global-object">
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+ <script src="server-locations.sub.js"></script>
+ </head>
+ <body>
+ <script>
+ var t1 = async_test("Shared worker");
+ var t2 = async_test("Nested worker in shared worker");
+ var t3 = async_test("Shared worker from https subframe");
+ var t4 = async_test("Nested worker from shared worker from https subframe");
+ // Tests for SharedWorkers used from other workers (not supported right
+ // now) would go here.
+
+ t1.step(function() {
+ var w = new SharedWorker("support/shared-worker-script.js");
+ w.port.onmessage = t1.step_func_done(function(e) {
+ assert_false(e.data);
+ });
+ w.port.start();
+ });
+
+ t2.step(function() {
+ var w = new SharedWorker("support/parent-shared-worker-script.js");
+ w.port.onmessage = t2.step_func_done(function(e) {
+ assert_false(e.data);
+ });
+ w.port.start();
+ });
+
+ onmessage = function(e) {
+ var data = e.data;
+ if (data.type == "shared") {
+ t3.step(function() {
+ assert_false(data.exception);
+ assert_false(data.error);
+ assert_false(data.isSecureContext);
+ });
+ t3.done();
+ } else if (data.type == "nested") {
+ t4.step(function() {
+ assert_false(data.exception);
+ assert_false(data.error);
+ assert_false(data.isSecureContext);
+ });
+ t4.done();
+ } else {
+ t3.step(function() {
+ assert_unreached("Unknown message");
+ });
+ t3.done();
+ t4.step(function() {
+ assert_unreached("Unknown message");
+ });
+ t4.done();
+ }
+ }
+
+ var ifr = document.createElement("iframe");
+ ifr.src = https_dir2 + "support/https-subframe-shared.html";
+ document.body.appendChild(ifr);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/secure-contexts/basic-shared-worker.https.html b/tests/wpt/web-platform-tests/secure-contexts/basic-shared-worker.https.html
new file mode 100644
index 00000000000..e7c78383a82
--- /dev/null
+++ b/tests/wpt/web-platform-tests/secure-contexts/basic-shared-worker.https.html
@@ -0,0 +1,67 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Test SharedWorkerGlobalScope.isSecureContext for HTTP creator</title>
+ <meta name="help" href="https://w3c.github.io/webappsec-secure-contexts/#monkey-patching-global-object">
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+ <script src="server-locations.sub.js"></script>
+ </head>
+ <body>
+ <script>
+ var t1 = async_test("Shared worker");
+ var t2 = async_test("Nested worker in shared worker");
+ var t3 = async_test("Shared worker from https subframe");
+ var t4 = async_test("Nested worker from shared worker from https subframe");
+
+ t1.step(function() {
+ var w = new SharedWorker("support/shared-worker-script.js");
+ w.port.onmessage = t1.step_func_done(function(e) {
+ assert_true(e.data);
+ });
+ w.port.start();
+ });
+
+ t2.step(function() {
+ var w = new SharedWorker("support/parent-shared-worker-script.js");
+ w.port.onmessage = t2.step_func_done(function(e) {
+ assert_true(e.data);
+ });
+ w.port.start();
+ });
+
+ onmessage = function(e) {
+ var data = e.data;
+ if (data.type == "shared") {
+ t3.step(function() {
+ assert_false(data.exception);
+ assert_false(data.error);
+ assert_true(data.isSecureContext);
+ });
+ t3.done();
+ } else if (data.type == "nested") {
+ t4.step(function() {
+ assert_false(data.exception);
+ assert_false(data.error);
+ assert_true(data.isSecureContext);
+ });
+ t4.done();
+ } else {
+ t3.step(function() {
+ assert_unreached("Unknown message");
+ });
+ t3.done();
+ t4.step(function() {
+ assert_unreached("Unknown message");
+ });
+ t4.done();
+ }
+ }
+
+ var ifr = document.createElement("iframe");
+ ifr.src = https_dir3 + "support/https-subframe-shared.html";
+ document.body.appendChild(ifr);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/secure-contexts/server-locations.sub.js b/tests/wpt/web-platform-tests/secure-contexts/server-locations.sub.js
index 46754b631e6..6b29c5328c7 100644
--- a/tests/wpt/web-platform-tests/secure-contexts/server-locations.sub.js
+++ b/tests/wpt/web-platform-tests/secure-contexts/server-locations.sub.js
@@ -4,3 +4,14 @@ https_dir = https_dir.substr(0, https_dir.lastIndexOf("/") + 1);
var http_dir = "http://{{location[hostname]}}:{{ports[http][0]}}{{location[path]}}";
http_dir = http_dir.substr(0, http_dir.lastIndexOf("/") + 1);
+var https_dir2 = "https://{{domains[www]}}:{{ports[https][0]}}{{location[path]}}";
+https_dir2 = https_dir2.substr(0, https_dir2.lastIndexOf("/") + 1);
+
+var https_dir3 = "https://{{domains[www1]}}:{{ports[https][0]}}{{location[path]}}";
+https_dir3 = https_dir3.substr(0, https_dir3.lastIndexOf("/") + 1);
+
+var https_dir4 = "https://{{domains[www2]}}:{{ports[https][0]}}{{location[path]}}";
+https_dir4 = https_dir4.substr(0, https_dir4.lastIndexOf("/") + 1);
+
+var https_dir5 = "https://{{domains[élève]}}:{{ports[https][0]}}{{location[path]}}";
+https_dir5 = https_dir5.substr(0, https_dir5.lastIndexOf("/") + 1);
diff --git a/tests/wpt/web-platform-tests/secure-contexts/shared-worker-insecure-first.https.html b/tests/wpt/web-platform-tests/secure-contexts/shared-worker-insecure-first.https.html
new file mode 100644
index 00000000000..074b21c10a6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/secure-contexts/shared-worker-insecure-first.https.html
@@ -0,0 +1,111 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Test SharedWorkerGlobalScope.isSecureContext for HTTP creator</title>
+ <meta name="help" href="https://w3c.github.io/webappsec-secure-contexts/#monkey-patching-global-object">
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+ <script src="server-locations.sub.js"></script>
+ </head>
+ <body>
+ <script>
+ /*
+ * The goal of this test is to check that we do the right thing if the
+ * same SharedWorker is used first from an insecure context and then from
+ * a secure context.
+ *
+ * To do this, we first open an insecure (http) popup, which loads a
+ * subframe that is same-origin with us but not a secure context, since
+ * its parent is http, not https. Then this subframe loads a SharedWorker
+ * and communicates back to us whether that worker and a child dedicated
+ * worker it spawns think they are secure contexts. Async tests t3 and t4
+ * track these two workers.
+ *
+ * After we have heard from both workers in the popup, we directly load
+ * the same exact subframe ourselves and see what the workers in it
+ * report. Async tests t1 and t2 track these two workers.
+ */
+ var t1 = async_test("Shared worker in subframe");
+ var t2 = async_test("Nested worker in shared worker in subframe");
+ var t3 = async_test("Shared worker in popup");
+ var t4 = async_test("Nested worker from shared worker in popup");
+
+ var messageCount = 0;
+ var popup = null;
+ onmessage = function(e) {
+ ++messageCount;
+ // Make sure to not close the popup until we've run the iframe part of
+ // the test! We need to keep those shared workers alive.
+ if (messageCount == 4 && popup) {
+ popup.close();
+ }
+ var data = e.data;
+ if (data.type == "shared") {
+ // This is a message from our shared worker; check whether it's the
+ // one in the popup or in our subframe.
+ if (data.fromPopup) {
+ t3.step(function() {
+ assert_false(data.exception);
+ assert_false(data.error);
+ assert_false(data.isSecureContext);
+ });
+ t3.done();
+ } else {
+ t1.step(function() {
+ assert_false(data.exception);
+ assert_true(data.error);
+ });
+ t1.done();
+ }
+ } else if (data.type == "nested") {
+ // This is a message from our shared worker's nested dedicated worker;
+ // check whether it's the one in the popup or in our subframe.
+ if (data.fromPopup) {
+ t4.step(function() {
+ assert_false(data.exception);
+ assert_false(data.error);
+ assert_false(data.isSecureContext);
+ });
+ t4.done();
+ } else {
+ t2.step(function() {
+ assert_false(data.exception);
+ assert_true(data.error);
+ });
+ t2.done();
+ }
+ } else {
+ if (popup) {
+ popup.close();
+ }
+ t1.step(function() {
+ assert_unreached("Unknown message");
+ });
+ t1.done();
+ t2.step(function() {
+ assert_unreached("Unknown message");
+ });
+ t2.done();
+ t3.step(function() {
+ assert_unreached("Unknown message");
+ });
+ t3.done();
+ t4.step(function() {
+ assert_unreached("Unknown message");
+ });
+ t4.done();
+ }
+
+ if (messageCount == 2) {
+ // Got both messages from our popup; time to create our child.
+ var ifr = document.createElement("iframe");
+ ifr.src = https_dir5 + "support/https-subframe-shared.html";
+ document.body.appendChild(ifr);
+ }
+ }
+
+ popup = window.open(http_dir + "support/shared-worker-insecure-popup.html?https_dir5");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/secure-contexts/shared-worker-secure-first.https.html b/tests/wpt/web-platform-tests/secure-contexts/shared-worker-secure-first.https.html
new file mode 100644
index 00000000000..27697d62087
--- /dev/null
+++ b/tests/wpt/web-platform-tests/secure-contexts/shared-worker-secure-first.https.html
@@ -0,0 +1,111 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset=utf-8>
+ <title>Test SharedWorkerGlobalScope.isSecureContext for HTTP creator</title>
+ <meta name="help" href="https://w3c.github.io/webappsec-secure-contexts/#monkey-patching-global-object">
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+ <script src="server-locations.sub.js"></script>
+ </head>
+ <body>
+ <script>
+ /*
+ * The goal of this test is to check that we do the right thing if the
+ * same SharedWorker is used first from an secure context and then from
+ * an insecure context.
+ *
+ * To do this, we load a subframe which loads a SharedWorker
+ * and communicates back to us whether that worker and a child dedicated
+ * worker it spawns think they are secure contexts. Async tests t1 and t2
+ * track these two workers.
+ *
+ * After we have heard from both workers in the subframe, we open an
+ * insecure (http) popup, which loads the same exact subframe. This
+ * subframe is still is same-origin with
+ * us but not a secure context, since its parent is http, not https. Then
+ * we wait to hear about the status of the workers in the popup's
+ * subframe. Async tests t3 and t4 track these two workers.
+ *
+ */
+ var t1 = async_test("Shared worker in subframe");
+ var t2 = async_test("Nested worker in shared worker in subframe");
+ var t3 = async_test("Shared worker in popup");
+ var t4 = async_test("Nested worker from shared worker in popup");
+
+ var messageCount = 0;
+ var popup = null;
+ onmessage = function(e) {
+ ++messageCount;
+ if (messageCount == 4 && popup) {
+ popup.close();
+ }
+ var data = e.data;
+ if (data.type == "shared") {
+ // This is a message from our shared worker; check whether it's the
+ // one in the popup or in our subframe.
+ if (data.fromPopup) {
+ t3.step(function() {
+ assert_false(data.exception);
+ assert_true(data.error);
+ });
+ t3.done();
+ } else {
+ t1.step(function() {
+ assert_false(data.exception);
+ assert_false(data.error);
+ assert_true(data.isSecureContext);
+ });
+ t1.done();
+ }
+ } else if (data.type == "nested") {
+ // This is a message from our shared worker's nested dedicated worker;
+ // check whether it's the one in the popup or in our subframe.
+ if (data.fromPopup) {
+ t4.step(function() {
+ assert_false(data.exception);
+ assert_true(data.error);
+ });
+ t4.done();
+ } else {
+ t2.step(function() {
+ assert_false(data.exception);
+ assert_false(data.error);
+ assert_true(data.isSecureContext);
+ });
+ t2.done();
+ }
+ } else {
+ if (popup) {
+ popup.close();
+ }
+ t1.step(function() {
+ assert_unreached("Unknown message");
+ });
+ t1.done();
+ t2.step(function() {
+ assert_unreached("Unknown message");
+ });
+ t2.done();
+ t3.step(function() {
+ assert_unreached("Unknown message");
+ });
+ t3.done();
+ t4.step(function() {
+ assert_unreached("Unknown message");
+ });
+ t4.done();
+ }
+
+ if (messageCount == 2) {
+ // Got both messages from our child; time to open our popup
+ popup = window.open(http_dir + "support/shared-worker-insecure-popup.html?https_dir4");
+ }
+ }
+
+ var ifr = document.createElement("iframe");
+ ifr.src = https_dir4 + "support/https-subframe-shared.html";
+ document.body.appendChild(ifr);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/secure-contexts/support/dedicated-worker-script.js b/tests/wpt/web-platform-tests/secure-contexts/support/dedicated-worker-script.js
new file mode 100644
index 00000000000..69ffdf34426
--- /dev/null
+++ b/tests/wpt/web-platform-tests/secure-contexts/support/dedicated-worker-script.js
@@ -0,0 +1 @@
+postMessage(isSecureContext);
diff --git a/tests/wpt/web-platform-tests/secure-contexts/support/https-subframe-dedicated.html b/tests/wpt/web-platform-tests/secure-contexts/support/https-subframe-dedicated.html
new file mode 100644
index 00000000000..85005df2929
--- /dev/null
+++ b/tests/wpt/web-platform-tests/secure-contexts/support/https-subframe-dedicated.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<script src="../server-locations.sub.js"></script>
+<script>
+ var w1 = new Worker(http_dir + "support/dedicated-worker-script.js");
+ w1.onmessage = function(e) {
+ parent.postMessage({ type: "http", error: false,
+ isSecureContext: e.data }, "*");
+ };
+ w1.onerror = function(e) {
+ parent.postMessage({ type: "http", error: true }, "*");
+ };
+
+ var w2 = new Worker(https_dir + "support/dedicated-worker-script.js");
+ w2.onmessage = function(e) {
+ parent.postMessage({ type: "https", error: false,
+ isSecureContext: e.data }, "*");
+ };
+ w2.onerror = function(e) {
+ parent.postMessage({ type: "https", error: true }, "*");
+ }
+</script>
diff --git a/tests/wpt/web-platform-tests/secure-contexts/support/https-subframe-shared.html b/tests/wpt/web-platform-tests/secure-contexts/support/https-subframe-shared.html
new file mode 100644
index 00000000000..5ae7cde5b0a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/secure-contexts/support/https-subframe-shared.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<script>
+ try {
+ var w = new SharedWorker("shared-worker-script.js");
+ w.port.onmessage = function(e) {
+ parent.postMessage({ type: "shared", error: false, exception: false,
+ isSecureContext: e.data }, "*");
+ };
+ w.onerror = function(e) {
+ parent.postMessage({ type: "shared", error: true, exception: false },
+ "*");
+ }
+ w.port.start();
+ } catch (e) {
+ parent.postMessage({ type: "shared", exception: true }, "*");
+ }
+
+ try {
+ var w = new SharedWorker("parent-shared-worker-script.js");
+ w.port.onmessage = function(e) {
+ parent.postMessage({ type: "nested", error: false, exception: false,
+ isSecureContext: e.data }, "*");
+ };
+ w.onerror = function(e) {
+ parent.postMessage({ type: "nested", error: true, exception: false },
+ "*");
+ }
+ w.port.start();
+ } catch (e) {
+ parent.postMessage({ type: "nested", exception: true }, "*");
+ }
+</script>
diff --git a/tests/wpt/web-platform-tests/secure-contexts/support/parent-dedicated-worker-script.js b/tests/wpt/web-platform-tests/secure-contexts/support/parent-dedicated-worker-script.js
new file mode 100644
index 00000000000..a8447552df0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/secure-contexts/support/parent-dedicated-worker-script.js
@@ -0,0 +1,4 @@
+var w = new Worker("dedicated-worker-script.js");
+w.onmessage = function (e) {
+ postMessage(e.data);
+}
diff --git a/tests/wpt/web-platform-tests/secure-contexts/support/parent-shared-worker-script.js b/tests/wpt/web-platform-tests/secure-contexts/support/parent-shared-worker-script.js
new file mode 100644
index 00000000000..7f999f93847
--- /dev/null
+++ b/tests/wpt/web-platform-tests/secure-contexts/support/parent-shared-worker-script.js
@@ -0,0 +1,8 @@
+addEventListener("connect", function (e) {
+ var port = e.ports[0];
+ port.start();
+ var w = new Worker("dedicated-worker-script.js");
+ w.onmessage = function (e) {
+ port.postMessage(e.data);
+ }
+});
diff --git a/tests/wpt/web-platform-tests/secure-contexts/support/shared-worker-insecure-popup.html b/tests/wpt/web-platform-tests/secure-contexts/support/shared-worker-insecure-popup.html
new file mode 100644
index 00000000000..740679dc4f2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/secure-contexts/support/shared-worker-insecure-popup.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<script src="../server-locations.sub.js"></script>
+<body>
+ <script>
+ var url = self[location.search.substr(1)] + "support/https-subframe-shared.html";
+ onmessage = function(e) {
+ var data = e.data;
+ data.fromPopup = true;
+ opener.postMessage(data, "*");
+ }
+ var ifr = document.createElement("iframe");
+ ifr.src = url;
+ document.body.appendChild(ifr);
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/secure-contexts/support/shared-worker-script.js b/tests/wpt/web-platform-tests/secure-contexts/support/shared-worker-script.js
new file mode 100644
index 00000000000..faed70a5c86
--- /dev/null
+++ b/tests/wpt/web-platform-tests/secure-contexts/support/shared-worker-script.js
@@ -0,0 +1,5 @@
+addEventListener("connect", function (e) {
+ var port = e.ports[0];
+ port.start();
+ port.postMessage(isSecureContext);
+});
diff --git a/tests/wpt/web-platform-tests/selectors/child-indexed-pseudo-class.html b/tests/wpt/web-platform-tests/selectors/child-indexed-pseudo-class.html
new file mode 100644
index 00000000000..1c58a5e87f0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/selectors/child-indexed-pseudo-class.html
@@ -0,0 +1,42 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Matching of child-indexed pseudo-classes</title>
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:ecoal95@gmail.com">
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#child-index">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+test(function() {
+ var check = function(element, selectors) {
+ for (var i = 0; i < selectors.length; ++i) {
+ var selector = selectors[i][0];
+ var expected = selectors[i][1];
+ assert_equals(expected, element.matches(selector),
+ "Expected " + element.tagName + " element to " +
+ (expected ? "match " : "not match ") + selector);
+ }
+ }
+
+ var rootOfSubtreeSelectors = [
+ [ ":first-child", true ],
+ [ ":last-child", true ],
+ [ ":first-of-type", true ],
+ [ ":last-of-type", true ],
+ [ ":nth-child(1)", true ],
+ [ ":nth-child(n)", true ],
+ [ ":nth-last-child(1)", true ],
+ [ ":nth-last-child(n)", true ],
+ [ ":nth-of-type(1)", true ],
+ [ ":nth-of-type(n)", true ],
+ [ ":nth-last-of-type(1)", true ],
+ [ ":nth-last-of-type(n)", true ],
+ [ ":nth-child(2)", false ],
+ [ ":nth-last-child(2)", false],
+ [ ":nth-of-type(2)", false ],
+ [ ":nth-last-of-type(2)", false],
+ ];
+
+ check(document.documentElement, rootOfSubtreeSelectors);
+ check(document.createElement('div'), rootOfSubtreeSelectors);
+}, "child-indexed pseudo-classes should match without a parent")
+</script>
diff --git a/tests/wpt/web-platform-tests/serve.py b/tests/wpt/web-platform-tests/serve.py
index a65e61f618a..db92a67f44c 100644
--- a/tests/wpt/web-platform-tests/serve.py
+++ b/tests/wpt/web-platform-tests/serve.py
@@ -1,4 +1,12 @@
-from tools.serve import serve
+import sys
+import logging
+
+try:
+ from tools.serve import serve
+except ImportError:
+ logging.error("tools.serve not found. Did you forget to run "
+ '"git submodule update --init --recursive"?')
+ sys.exit(2)
def main():
serve.main()
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event.https.html
index b7eda16494a..a9b0d6ca286 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event.https.html
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event.https.html
@@ -533,5 +533,44 @@ async_test(function(t) {
.catch(unreached_rejection(t));
}, 'Service Worker should intercept EventSource');
+async_test(function(t) {
+ var scope = 'resources/simple.html?integrity';
+ var frame;
+ var integrity_metadata = 'gs0nqru8KbsrIt5YToQqS9fYao4GQJXtcId610g7cCU=';
+
+ 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;
+ // A request has associated integrity metadata (a string).
+ // Unless stated otherwise, it is the empty string.
+ assert_equals(
+ frame.contentDocument.body.textContent, '');
+
+ return new Promise(function(resolve, reject) {
+ return frame.contentWindow.fetch(scope,
+ {'integrity': integrity_metadata})
+ .then(function(response) {
+ return response.text();
+ })
+ .then(function(response_text) {
+ // Should get the same integrity metadata.
+ assert_equals(response_text, integrity_metadata,
+ 'Service Worker should respond to fetch with the correct integrity');
+ })
+ .then(resolve())
+ .catch(reject());
+ });
+ })
+ .then(function() {
+ frame.remove();
+ return service_worker_unregister_and_done(t, scope);
+ })
+ .catch(unreached_rejection(t));
+ }, 'Service Worker responds to fetch event with the correct integrity_metadata');
+
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-request-resources.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-request-resources.https.html
index 0584cafb075..7a64e9444dc 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-request-resources.https.html
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-request-resources.https.html
@@ -8,56 +8,84 @@
var url_count = 0;
var expected_results = {};
-function image_test(frame, url, cross_origin, expexted_mode,
+function image_test(frame, url, cross_origin, expected_mode,
expected_credentials) {
var actual_url = url + (++url_count);
expected_results[actual_url] = {
cross_origin: cross_origin,
- mode: expexted_mode,
+ mode: expected_mode,
credentials: expected_credentials,
+ integrity: '',
message: 'Image load (url:' +
actual_url + ' cross_origin:' + cross_origin + ')'
};
return frame.contentWindow.load_image(actual_url, cross_origin);
}
-function script_test(frame, url, cross_origin, expexted_mode,
+function script_test(frame, url, cross_origin, expected_mode,
expected_credentials) {
var actual_url = url + (++url_count);
expected_results[actual_url] = {
cross_origin: cross_origin,
- mode: expexted_mode,
+ mode: expected_mode,
credentials: expected_credentials,
+ integrity: '',
message: 'Script load (url:' +
actual_url + ' cross_origin:' + cross_origin + ')'
};
return frame.contentWindow.load_script(actual_url, cross_origin);
}
-function css_test(frame, url, cross_origin, expexted_mode,
+function css_test(frame, url, cross_origin, expected_mode,
expected_credentials) {
var actual_url = url + (++url_count);
expected_results[actual_url] = {
cross_origin: cross_origin,
- mode: expexted_mode,
+ mode: expected_mode,
credentials: expected_credentials,
+ integrity: '',
message: 'CSS load (url:' +
actual_url + ' cross_origin:' + cross_origin + ')'
};
return frame.contentWindow.load_css(actual_url, cross_origin);
}
-function font_face_test(frame, url, expexted_mode, expected_credentials) {
+function font_face_test(frame, url, expected_mode, expected_credentials) {
var actual_url = url + (++url_count);
expected_results[actual_url] = {
url: actual_url,
- mode: expexted_mode,
+ mode: expected_mode,
credentials: expected_credentials,
+ integrity: '',
message: 'FontFace load (url:' + actual_url + ')'
};
return frame.contentWindow.load_font(actual_url);
}
+function script_integrity_test(frame, url, integrity, expected_integrity) {
+ var actual_url = url + (++url_count);
+ expected_results[actual_url] = {
+ url: actual_url,
+ mode: 'no-cors',
+ credentials: 'include',
+ integrity: expected_integrity,
+ message: 'Script load (url:' + actual_url + ')'
+ };
+ return frame.contentWindow.load_script_with_integrity(actual_url, integrity);
+}
+
+function css_integrity_test(frame, url, integrity, expected_integrity) {
+ var actual_url = url + (++url_count);
+ expected_results[actual_url] = {
+ url: actual_url,
+ mode: 'no-cors',
+ credentials: 'include',
+ integrity: expected_integrity,
+ message: 'CSS load (url:' + actual_url + ')'
+ };
+ return frame.contentWindow.load_css_with_integrity(actual_url, integrity);
+}
+
async_test(function(t) {
var SCOPE = 'resources/fetch-request-resources-iframe.https.html';
var SCRIPT = 'resources/fetch-request-resources-worker.js';
@@ -94,6 +122,10 @@ async_test(function(t) {
result.credentials, expected.credentials,
'credentials of ' + expected.message + ' must be ' +
expected.credentials + '.');
+ assert_equals(
+ result.integrity, expected.integrity,
+ 'integrity of ' + expected.message + ' must be ' +
+ expected.integrity + '.');
--url_count;
delete expected_results[result.url];
if (url_count == 0) {
@@ -134,6 +166,23 @@ async_test(function(t) {
font_face_test(f, LOCAL_URL, 'cors', 'same-origin');
font_face_test(f, REMOTE_URL, 'cors', 'same-origin');
+ script_integrity_test(f, LOCAL_URL, ' ', ' ');
+ script_integrity_test(f, LOCAL_URL,
+ 'This is not a valid integrity because it has no dashes',
+ 'This is not a valid integrity because it has no dashes');
+ script_integrity_test(f, LOCAL_URL, 'sha256-', 'sha256-');
+ script_integrity_test(f, LOCAL_URL, 'sha256-foo?123', 'sha256-foo?123');
+ script_integrity_test(f, LOCAL_URL, 'sha256-foo sha384-abc ', 'sha256-foo sha384-abc ');
+ script_integrity_test(f, LOCAL_URL, 'sha256-foo sha256-abc', 'sha256-foo sha256-abc');
+
+ css_integrity_test(f, LOCAL_URL, ' ', ' ');
+ css_integrity_test(f, LOCAL_URL,
+ 'This is not a valid integrity because it has no dashes',
+ 'This is not a valid integrity because it has no dashes');
+ css_integrity_test(f, LOCAL_URL, 'sha256-', 'sha256-');
+ css_integrity_test(f, LOCAL_URL, 'sha256-foo?123', 'sha256-foo?123');
+ css_integrity_test(f, LOCAL_URL, 'sha256-foo sha384-abc ', 'sha256-foo sha384-abc ');
+ css_integrity_test(f, LOCAL_URL, 'sha256-foo sha256-abc', 'sha256-foo sha256-abc');
})
.catch(unreached_rejection(t));
}, 'Verify FetchEvent for resources.');
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/postmessage-to-client.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/postmessage-to-client.https.html
index a031ee2edf3..2ee98084680 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/postmessage-to-client.https.html
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/postmessage-to-client.https.html
@@ -29,11 +29,14 @@ t.step(function() {
var expected = ['Sending message via clients'];
function onMessage(e) {
+ assert_equals(e.constructor, frame.contentWindow.MessageEvent,
+ 'message events should use MessageEvent interface.');
assert_equals(e.bubbles, false, 'message events should not bubble.');
- assert_equals(e.cancelable, false, 'message events should not be cancelable.');
- assert_equals(e.origin, host_info['HTTPS_ORIGIN'], 'message event\'s origin should be set correctly.');
-// XXXkhuey fixme!
-// assert_equals(e.source, sw.controller, 'source should be ServiceWorker.');
+ assert_equals(e.cancelable, false,
+ 'message events should not be cancelable.');
+ assert_equals(e.origin, host_info['HTTPS_ORIGIN'],
+ 'message event\'s origin should be set correctly.');
+ assert_equals(e.source, sw.controller, 'source should be ServiceWorker.');
var message = e.data;
if (message === 'quit') {
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-event-test-worker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-event-test-worker.js
index 44ea828c686..32a1b4f2497 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-event-test-worker.js
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-event-test-worker.js
@@ -111,6 +111,10 @@ function handleEventSource(event) {
));
}
+function handleIntegrity(event) {
+ event.respondWith(new Response(event.request.integrity));
+}
+
self.addEventListener('fetch', function(event) {
var url = event.request.url;
var handlers = [
@@ -129,6 +133,7 @@ self.addEventListener('fetch', function(event) {
{ pattern: '?fragment-check', fn: handleFragmentCheck },
{ pattern: '?cache', fn: handleCache },
{ pattern: '?eventsource', fn: handleEventSource },
+ { pattern: '?integrity', fn: handleIntegrity },
];
var handler = null;
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-request-resources-iframe.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-request-resources-iframe.https.html
index cadbff45cae..93b038dd67c 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-request-resources-iframe.https.html
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-request-resources-iframe.https.html
@@ -47,5 +47,21 @@ function load_css_image_set(url, type) {
div.style[type] = '-webkit-image-set(url(' + url + ') 1x)';
}
+function load_script_with_integrity(url, integrity) {
+ var script = document.createElement('script');
+ script.src = url;
+ script.integrity = integrity;
+ document.body.appendChild(script);
+}
+
+function load_css_with_integrity(url, integrity) {
+ var link = document.createElement('link');
+ link.rel = 'stylesheet'
+ link.href = url;
+ link.type = 'text/css';
+ link.integrity = integrity;
+ document.body.appendChild(link);
+}
+
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-request-resources-worker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-request-resources-worker.js
index 9ec1dc62822..900b63c62fc 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-request-resources-worker.js
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-request-resources-worker.js
@@ -17,7 +17,8 @@ self.addEventListener('fetch', function(event) {
port.postMessage({
url: url,
mode: event.request.mode,
- credentials: event.request.credentials
+ credentials: event.request.credentials,
+ integrity: event.request.integrity
});
event.respondWith(Promise.reject());
});
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/serviceworker-message-event-historical.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/serviceworker-message-event-historical.https.html
new file mode 100644
index 00000000000..2f780a60428
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/serviceworker-message-event-historical.https.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<title>Service Worker: ServiceWorkerMessageEvent</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<script>
+
+promise_test(function(t) {
+ var scope = 'resources/blank.html';
+ var url = 'resources/postmessage-to-client-worker.js';
+ return service_worker_unregister_and_register(t, url, scope)
+ .then(function(r) {
+ return wait_for_state(t, r.installing, 'activated');
+ })
+ .then(function() {
+ return with_iframe(scope);
+ })
+ .then(function(frame) {
+ var w = frame.contentWindow;
+ var worker = w.navigator.serviceWorker.controller;
+ assert_equals(
+ self.ServiceWorkerMessageEvent, undefined,
+ 'ServiceWorkerMessageEvent should not be defined.');
+ return new Promise(function(resolve) {
+ w.navigator.serviceWorker.onmessage = t.step_func(function(e) {
+ assert_true(
+ e instanceof w.MessageEvent,
+ 'message events should use MessageEvent interface.');
+ assert_true(e.source instanceof w.ServiceWorker);
+ assert_equals(e.type, 'message');
+ assert_equals(e.source, worker,
+ 'source should equal to the controller.');
+ assert_equals(e.ports.length, 0);
+ resolve();
+ });
+ worker.postMessage('PING');
+ });
+ })
+ .then(function() {
+ return service_worker_unregister_and_done(t, scope);
+ });
+ }, 'Test MessageEvent supplants ServiceWorkerMessageEvent.');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/stub-3.1-service-worker-obj.html b/tests/wpt/web-platform-tests/service-workers/stub-3.1-service-worker-obj.html
index b1c7f1ad0fc..99c2cbe8597 100644
--- a/tests/wpt/web-platform-tests/service-workers/stub-3.1-service-worker-obj.html
+++ b/tests/wpt/web-platform-tests/service-workers/stub-3.1-service-worker-obj.html
@@ -30,7 +30,7 @@ enum ServiceWorkerState {
"activated",
"redundant"
};
-</pre>
+</script>
<!--
The `ServiceWorker` interface represents the document-side view of a Service
@@ -45,7 +45,7 @@ provide meaningful functionality.
<script type=text/plain id="untested_idls">
interface EventHandler {};
interface Worker {};
- </pre>
+ </script>
<script>
var idl_array = new IdlArray();
diff --git a/tests/wpt/web-platform-tests/service-workers/stub-3.2-navigator-service-worker.html b/tests/wpt/web-platform-tests/service-workers/stub-3.2-navigator-service-worker.html
index 2654c60f066..d5b51475aa8 100644
--- a/tests/wpt/web-platform-tests/service-workers/stub-3.2-navigator-service-worker.html
+++ b/tests/wpt/web-platform-tests/service-workers/stub-3.2-navigator-service-worker.html
@@ -64,7 +64,7 @@ interface ReloadPageEvent : Event {
interface EventHandler {};
interface EventTarget {};
interface Event {};
- </pre>
+ </script>
<script>
var idl_array = new IdlArray();
diff --git a/tests/wpt/web-platform-tests/service-workers/stub-4.1-service-worker-global-scope.html b/tests/wpt/web-platform-tests/service-workers/stub-4.1-service-worker-global-scope.html
index 48697f01e62..c11feaca4c8 100644
--- a/tests/wpt/web-platform-tests/service-workers/stub-4.1-service-worker-global-scope.html
+++ b/tests/wpt/web-platform-tests/service-workers/stub-4.1-service-worker-global-scope.html
@@ -37,7 +37,7 @@ interface ServiceWorkerGlobalScope : WorkerGlobalScope {
// close() method inherited from WorkerGlobalScope is not exposed.
};
-</pre>
+</script>
<!--
The `ServiceWorkerGlobalScope` interface represents the global execution
@@ -58,7 +58,7 @@ synchronous requests MUST NOT be initiated inside of a Service Worker.
interface ScalarValueString {};
interface EventHandler {};
interface WorkerGlobalScope {};
- </pre>
+ </script>
<script>
var idl_array = new IdlArray();
diff --git a/tests/wpt/web-platform-tests/service-workers/stub-4.2-client.html b/tests/wpt/web-platform-tests/service-workers/stub-4.2-client.html
index 4e8c3639df5..fda0e298f5e 100644
--- a/tests/wpt/web-platform-tests/service-workers/stub-4.2-client.html
+++ b/tests/wpt/web-platform-tests/service-workers/stub-4.2-client.html
@@ -19,7 +19,7 @@ interface Client {
void postMessage(any message, DOMString targetOrigin,
optional sequence<Transferable> transfer);
};
-</pre>
+</script>
<!--
The `Client` interface represents the window or the worker (defined as client)
@@ -44,7 +44,7 @@ targetOrigin, transfer)` method of a `[Client][3]`, when called, causes a
<script type=text/plain id="untested_idls">
interface Transferable {};
- </pre>
+ </script>
<script>
var idl_array = new IdlArray();
diff --git a/tests/wpt/web-platform-tests/service-workers/stub-4.3-service-worker-clients.html b/tests/wpt/web-platform-tests/service-workers/stub-4.3-service-worker-clients.html
index c8a967a734b..475df1952fb 100644
--- a/tests/wpt/web-platform-tests/service-workers/stub-4.3-service-worker-clients.html
+++ b/tests/wpt/web-platform-tests/service-workers/stub-4.3-service-worker-clients.html
@@ -19,7 +19,7 @@ interface ServiceWorkerClients {
Promise<sequence<Client>?> getServiced();
Promise<any> reloadAll();
};
-</pre>
+</script>
<!--
The `ServiceWorkerClients` interface represents a container for a list of
@@ -31,7 +31,7 @@ The `ServiceWorkerClients` interface represents a container for a list of
<script type=text/plain id="untested_idls">
interface Client {};
- </pre>
+ </script>
<script>
var idl_array = new IdlArray();
diff --git a/tests/wpt/web-platform-tests/service-workers/stub-4.4-request-objects.html b/tests/wpt/web-platform-tests/service-workers/stub-4.4-request-objects.html
index bad4ea15986..2f471f80f60 100644
--- a/tests/wpt/web-platform-tests/service-workers/stub-4.4-request-objects.html
+++ b/tests/wpt/web-platform-tests/service-workers/stub-4.4-request-objects.html
@@ -49,7 +49,7 @@ enum Mode {
[MapClass(DOMString, DOMString)]
interface HeaderMap {
};
-</pre>
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/stub-4.5-response-objects.html b/tests/wpt/web-platform-tests/service-workers/stub-4.5-response-objects.html
index 5ebf3431448..445982f51a3 100644
--- a/tests/wpt/web-platform-tests/service-workers/stub-4.5-response-objects.html
+++ b/tests/wpt/web-platform-tests/service-workers/stub-4.5-response-objects.html
@@ -47,14 +47,14 @@ dictionary ResponseInit {
ByteString statusText = "OK";
HeaderMap headers;
};
-</pre>
+</script>
<script type=text/plain id="untested_idls">
interface HeaderMap {};
interface Blob {};
- </pre>
+ </script>
<script>
var idl_array = new IdlArray();
diff --git a/tests/wpt/web-platform-tests/service-workers/stub-4.6.2-cache.html b/tests/wpt/web-platform-tests/service-workers/stub-4.6.2-cache.html
index 8999a4dd529..9270481d183 100644
--- a/tests/wpt/web-platform-tests/service-workers/stub-4.6.2-cache.html
+++ b/tests/wpt/web-platform-tests/service-workers/stub-4.6.2-cache.html
@@ -37,7 +37,7 @@ dictionary CacheBatchOperation {
Response response;
CacheQueryOptions options;
};
-</pre>
+</script>
@@ -45,7 +45,7 @@ dictionary CacheBatchOperation {
interface AbstractResponse {};
interface Request {};
interface ScalarValueString {};
- </pre>
+ </script>
<script>
var idl_array = new IdlArray();
diff --git a/tests/wpt/web-platform-tests/service-workers/stub-4.6.3-cache-storage.html b/tests/wpt/web-platform-tests/service-workers/stub-4.6.3-cache-storage.html
index 3f9e9b438f0..29666d837fc 100644
--- a/tests/wpt/web-platform-tests/service-workers/stub-4.6.3-cache-storage.html
+++ b/tests/wpt/web-platform-tests/service-workers/stub-4.6.3-cache-storage.html
@@ -29,7 +29,7 @@ interface CacheStorage {
};
callback CacheStorageIterationCallback = void (Cache value, DOMString key, CacheStorage map);
-</pre>
+</script>
<!--
**Note**:[CacheStorage][1]interface is designed to largely conform
@@ -44,7 +44,7 @@ convenience methods.
<script type=text/plain id="untested_idls">
interface ScalarValueString {};
interface Cache {};
- </pre>
+ </script>
<script>
var idl_array = new IdlArray();
diff --git a/tests/wpt/web-platform-tests/service-workers/stub-4.7.1-install-phase-event.html b/tests/wpt/web-platform-tests/service-workers/stub-4.7.1-install-phase-event.html
index 994da020010..8b7ab81c5ef 100644
--- a/tests/wpt/web-platform-tests/service-workers/stub-4.7.1-install-phase-event.html
+++ b/tests/wpt/web-platform-tests/service-workers/stub-4.7.1-install-phase-event.html
@@ -16,7 +16,7 @@
interface InstallPhaseEvent : Event {
Promise<any> waitUntil(Promise<any> f);
};
-</pre>
+</script>
<!--
Service Workers have two [Lifecycle events][1], `[install][2]` and
@@ -34,7 +34,7 @@ from the `[InstallPhaseEvent][4]` interface, for `[install][2]` event.
<script type=text/plain id="untested_idls">
interface Event {};
- </pre>
+ </script>
<script>
var idl_array = new IdlArray();
diff --git a/tests/wpt/web-platform-tests/service-workers/stub-4.7.2.1-install-event-section.html b/tests/wpt/web-platform-tests/service-workers/stub-4.7.2.1-install-event-section.html
index 17d52c6b03a..d9b47e195af 100644
--- a/tests/wpt/web-platform-tests/service-workers/stub-4.7.2.1-install-event-section.html
+++ b/tests/wpt/web-platform-tests/service-workers/stub-4.7.2.1-install-event-section.html
@@ -17,7 +17,7 @@ interface InstallEvent : InstallPhaseEvent {
readonly attribute ServiceWorker? activeWorker;
void replace();
};
-</pre>
+</script>
<!--
Service Workers use the `[InstallEvent][1]` interface for `[install][2]` event.
@@ -30,7 +30,7 @@ Service Workers use the `[InstallEvent][1]` interface for `[install][2]` event.
<script type=text/plain id="untested_idls">
interface ServiceWorker {};
interface InstallPhaseEvent {};
- </pre>
+ </script>
<script>
var idl_array = new IdlArray();
diff --git a/tests/wpt/web-platform-tests/service-workers/stub-4.7.4.1-fetch-event-section.html b/tests/wpt/web-platform-tests/service-workers/stub-4.7.4.1-fetch-event-section.html
index 84d8c3880fb..ace71967bdf 100644
--- a/tests/wpt/web-platform-tests/service-workers/stub-4.7.4.1-fetch-event-section.html
+++ b/tests/wpt/web-platform-tests/service-workers/stub-4.7.4.1-fetch-event-section.html
@@ -37,7 +37,7 @@ enum Context {
"child",
"navigate"
};
-</pre>
+</script>
<!--
Service Workers use the `[FetchEvent][1]` interface for `[fetch][2]` event.
@@ -53,7 +53,7 @@ Service Workers use the `[FetchEvent][1]` interface for `[fetch][2]` event.
interface AbstractResponse {};
interface ScalarValueString {};
interface Event {};
- </pre>
+ </script>
<script>
var idl_array = new IdlArray();
diff --git a/tests/wpt/web-platform-tests/shadow-dom/OWNERS b/tests/wpt/web-platform-tests/shadow-dom/OWNERS
index 957c6b51b88..b9891886cf1 100644
--- a/tests/wpt/web-platform-tests/shadow-dom/OWNERS
+++ b/tests/wpt/web-platform-tests/shadow-dom/OWNERS
@@ -1,7 +1,4 @@
@kojiishi
@rniwa
-@sideshowbarker
-@sizuhiko
-@yutak
@takayoshikochi
@hayatoito
diff --git a/tests/wpt/web-platform-tests/shadow-dom/event-composed-path-with-related-target.html b/tests/wpt/web-platform-tests/shadow-dom/event-composed-path-with-related-target.html
index 24072aa15d3..675a7d7b12f 100644
--- a/tests/wpt/web-platform-tests/shadow-dom/event-composed-path-with-related-target.html
+++ b/tests/wpt/web-platform-tests/shadow-dom/event-composed-path-with-related-target.html
@@ -27,7 +27,7 @@ test(() => {
let path = ['target', 'test1'];
assert_event_path_equals(log, [['target', 'target', 'target', path],
['test1', 'target', 'target', path]]);
-}, 'Event path for an event with a relatedTarget. Event shoul be dispatched if 1) target and relatedTarget are same, and 2) they are not in a shadow tree.');
+}, 'Event path for an event with a relatedTarget. Event should be dispatched even when target and relatedTarget are same.');
</script>
<div id="test2">
@@ -51,8 +51,10 @@ test(() => {
test(() => {
let n = createTestTree(test2);
let log = dispatchEventWithLog(n, n.target, new FocusEvent('my-focus', { bubbles: true, composed: true, relatedTarget: n.target }));
- assert_event_path_equals(log, []);
-}, 'Event path for an event with a relatedTarget. Event should not be dispatched if 1) target and relatedTarget are same, and 2) both are in a shadow tree.');
+ let path = ['target', 'sr'];
+ assert_event_path_equals(log, [['target', 'target', 'target', path],
+ ['sr', 'target', 'target', path]]);
+}, 'Event path for an event with a relatedTarget which is identical to target. Event should be dispatched and should stop at the shadow root.');
</script>
<div id="test3_1">
@@ -134,7 +136,9 @@ test(() => {
test(() => {
let n = createTestTree(test4);
let log = dispatchEventWithLog(n, n.host1, new FocusEvent('my-focus', { bubbles: true, composed: true, relatedTarget: n.target }));
- assert_event_path_equals(log, []);
+ let path = ['host1', 'test4'];
+ assert_event_path_equals(log, [['host1', 'host1', 'host1', path],
+ ['test4', 'host1', 'host1', path]]);
}, 'Event path for an event with a relatedTarget. target is a shadow-including ancestor of relatedTarget.');
</script>
diff --git a/tests/wpt/web-platform-tests/streams/readable-streams/count-queuing-strategy-integration.js b/tests/wpt/web-platform-tests/streams/readable-streams/count-queuing-strategy-integration.js
index fb9a1aa2ba6..65c8b8cf002 100644
--- a/tests/wpt/web-platform-tests/streams/readable-streams/count-queuing-strategy-integration.js
+++ b/tests/wpt/web-platform-tests/streams/readable-streams/count-queuing-strategy-integration.js
@@ -162,7 +162,7 @@ promise_test(() => {
assert_equals(controller.desiredSize, -2, '0 reads, 6 enqueues: desiredSize should be -2');
- reader.read()
+ return reader.read()
.then(result => {
assert_object_equals(result, { value: 'a', done: false },
'1st read gives back the 1st chunk enqueued (queue now contains 5 chunks)');
diff --git a/tests/wpt/web-platform-tests/svg/OWNERS b/tests/wpt/web-platform-tests/svg/OWNERS
index aeee0aac345..6bd6b758932 100644
--- a/tests/wpt/web-platform-tests/svg/OWNERS
+++ b/tests/wpt/web-platform-tests/svg/OWNERS
@@ -1,2 +1,3 @@
@heycam
@Ms2ger
+@nikosandronikos
diff --git a/tests/wpt/web-platform-tests/svg/historical.html b/tests/wpt/web-platform-tests/svg/historical.html
index 8f28002e85d..de15f81839f 100644
--- a/tests/wpt/web-platform-tests/svg/historical.html
+++ b/tests/wpt/web-platform-tests/svg/historical.html
@@ -57,6 +57,9 @@ var removedMembers = {
"currentView",
"useCurrentView",
"viewport"
+ ],
+ "SVGViewElement": [
+ "viewTarget"
]
}
for (var name in removedMembers) {
diff --git a/tests/wpt/web-platform-tests/svg/import/shapes-rect-01-t-manual.svg b/tests/wpt/web-platform-tests/svg/import/shapes-rect-01-t-manual.svg
deleted file mode 100644
index 219a4764fca..00000000000
--- a/tests/wpt/web-platform-tests/svg/import/shapes-rect-01-t-manual.svg
+++ /dev/null
@@ -1,73 +0,0 @@
-<svg version="1.1" baseProfile="tiny" id="svg-root"
- width="100%" height="100%" viewBox="0 0 480 360"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
- <!--======================================================================-->
- <!--= SVG 1.1 2nd Edition Test Case =-->
- <!--======================================================================-->
- <!--= Copyright 2009 World Wide Web Consortium, (Massachusetts =-->
- <!--= Institute of Technology, European Research Consortium for =-->
- <!--= Informatics and Mathematics (ERCIM), Keio University). =-->
- <!--= All Rights Reserved. =-->
- <!--= See http://www.w3.org/Consortium/Legal/. =-->
- <!--======================================================================-->
- <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
- template-version="1.4" reviewer="SVGWG" author="Kelvin R" status="accepted"
- version="$Revision: 1.7 $" testname="$RCSfile: shapes-rect-01-t.svg,v $">
- <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/shapes.html#RectElement">
- <p>
- This is a simple test of the rect element.
- </p>
- </d:testDescription>
- <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
- <p>
- Run the test. No interaction required.
- </p>
- </d:operatorScript>
- <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
- <p>
- The test passes if all four sets of two rectangles are drawn and
- they match the reference image.
- </p>
- </d:passCriteria>
- </d:SVGTestCase>
- <title id="test-title">$RCSfile: shapes-rect-01-t.svg,v $</title>
- <defs>
- <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
- <font-face-src>
- <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
- </font-face-src>
- </font-face>
- </defs>
- <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
- <!-- ====================================================================== -->
- <!-- First of all draw two simple rectangles. One stroked , one filled. -->
- <!-- ====================================================================== -->
- <rect id="Simple-rect-no-fill" fill="none" stroke="#000000" x="30" y="46" width="50" height="80"/>
- <rect id="Simple-rect-filled" fill="fuchsia" x="130" y="46" width="50" height="80"/>
- <!-- ====================================================================== -->
- <!-- Second set of rectangles this time with rounded corners. -->
- <!-- ====================================================================== -->
- <rect id="Simple-round-rect-no-fill" fill="none" stroke="#000000" x="250" y="46" width="50" height="80" rx="30"/>
- <rect id="Simple-round-rect-filled" fill="fuchsia" x="350" y="46" width="50" height="80" rx="30"/>
- <!-- ====================================================================== -->
- <!-- Third set of rectangles. -->
- <!-- ====================================================================== -->
- <rect id="rect-03" fill="none" stroke="#0000FF" stroke-width="8" x="30" y="196" width="50" height="80"/>
- <rect id="rect-04" fill="#00FF00" stroke="#0000FF" stroke-width="8" x="130" y="196" width="50" height="80"/>
- <!-- ====================================================================== -->
- <!-- Fourth set of rectangles. -->
- <!-- ====================================================================== -->
- <rect id="rect-05" fill="none" stroke="#0000FF" stroke-width="8" x="250" y="196" width="50" height="80" rx="30" ry="50"/>
- <rect id="rect-06" fill="#00FF00" x="350" y="196" width="50" height="80" rx="30" ry="50"/>
- </g>
- <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
- <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
- </g>
- <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
- <!-- comment out this watermark once the test is approved -->
- <!--<g id="draft-watermark">
- <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
- <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
- text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
- </g>-->
-</svg>
diff --git a/tests/wpt/web-platform-tests/svg/interfaces.html b/tests/wpt/web-platform-tests/svg/interfaces.html
index 3fb951baa39..c4d7a2740d7 100644
--- a/tests/wpt/web-platform-tests/svg/interfaces.html
+++ b/tests/wpt/web-platform-tests/svg/interfaces.html
@@ -391,8 +391,12 @@ interface SVGGraphicsElement : SVGElement {
SVGGraphicsElement implements SVGTests;
interface SVGGeometryElement : SVGGraphicsElement {
+ [SameObject] readonly attribute SVGAnimatedNumber pathLength;
+
boolean isPointInFill(DOMPoint point);
boolean isPointInStroke(DOMPoint point);
+ float getTotalLength();
+ DOMPoint getPointAtLength(float distance);
};
interface SVGNumber {
@@ -739,11 +743,6 @@ interface SVGAnimatedPreserveAspectRatio {
};
interface SVGPathElement : SVGGeometryElement {
-
- [SameObject] readonly attribute SVGAnimatedNumber pathLength;
-
- float getTotalLength();
- DOMPoint getPointAtLength(float distance);
};
interface SVGRectElement : SVGGeometryElement {
diff --git a/tests/wpt/web-platform-tests/svg/linking/reftests/href-a-element-attr-change.html b/tests/wpt/web-platform-tests/svg/linking/reftests/href-a-element-attr-change.html
new file mode 100644
index 00000000000..ceb0f18801f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/reftests/href-a-element-attr-change.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html class="retest-wait">
+<meta charset="utf-8">
+<title>href - a element</title>
+<meta name="assert"
+ content="The a element should keep its link status after removing href if there is still xlink:href">
+<link rel="match" href="href-a-element-ref.html">
+<style>
+a:link rect {
+ fill: lime;
+}
+</style>
+<body>
+ <svg width="100" height="100" viewBox="0 0 100 100"
+ xmlns:xlink="http://www.w3.org/1999/xlink" onload="loaded();">
+ <a id="link" href="abc.html" xlink:href="def.html">
+ <rect width="100%" height="100%" fill="red"/>
+ </a>
+ </svg>
+</body>
+<script>
+ function loaded() {
+ document.getElementById('link').removeAttribute('href');
+ requestAnimationFrame(function() {
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ }
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/svg/linking/reftests/href-a-element-ref.html b/tests/wpt/web-platform-tests/svg/linking/reftests/href-a-element-ref.html
new file mode 100644
index 00000000000..0c67c98b020
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/reftests/href-a-element-ref.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>href - a element reference</title>
+<body>
+ <svg width="100" height="100" viewBox="0 0 100 100">
+ <rect width="100%" height="100%" fill="lime"/>
+ </svg>
+</body>
diff --git a/tests/wpt/web-platform-tests/svg/linking/reftests/href-feImage-element-ref.html b/tests/wpt/web-platform-tests/svg/linking/reftests/href-feImage-element-ref.html
new file mode 100644
index 00000000000..cb3758dfa71
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/reftests/href-feImage-element-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>href - feImage element reference</title>
+<body>
+ <svg width="300" height="300" viewBox="0 0 300 300"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <filter id="Fitted" primitiveUnits="objectBoundingBox">
+ <feImage xlink:href="/images/rgrg-256x256.png"
+ x="0" y="0" width="100%" height="100%"
+ preserveAspectRatio="none"/>
+ </filter>
+ <rect x="20" y="25" width="100" height="110" filter="url(#Fitted)"/>
+ <rect x="20" y="25" width="100" height="110" fill="none" stroke="green"/>
+ </svg>
+</body>
diff --git a/tests/wpt/web-platform-tests/svg/linking/reftests/href-feImage-element.html b/tests/wpt/web-platform-tests/svg/linking/reftests/href-feImage-element.html
new file mode 100644
index 00000000000..efdbe63a1fa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/reftests/href-feImage-element.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>href - feImage element</title>
+<meta name="assert" content="The feImage element should accept href">
+<link rel="match" href="href-feImage-element-ref.html">
+<body>
+ <svg width="300" height="300" viewBox="0 0 300 300"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <filter id="Fitted" primitiveUnits="objectBoundingBox">
+ <feImage href="/images/rgrg-256x256.png"
+ xlink:href="/images/grgr-256x256.png"
+ x="0" y="0" width="100%" height="100%"
+ preserveAspectRatio="none"/>
+ </filter>
+ <rect x="20" y="25" width="100" height="110" filter="url(#Fitted)"/>
+ <rect x="20" y="25" width="100" height="110" fill="none" stroke="green"/>
+ </svg>
+</body>
diff --git a/tests/wpt/web-platform-tests/svg/linking/reftests/href-filter-element-ref.html b/tests/wpt/web-platform-tests/svg/linking/reftests/href-filter-element-ref.html
new file mode 100644
index 00000000000..9b009e31d1b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/reftests/href-filter-element-ref.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>href - filter element reference</title>
+<body>
+ <svg width="300" height="300" viewBox="0 0 300 300"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <filter id="blurMe">
+ <feGaussianBlur in="SourceGraphic" stdDeviation="5" />
+ </filter>
+ <circle cx="60" cy="60" r="50" fill="green" filter="url(#blurMe)" />
+ </svg>
+</body>
diff --git a/tests/wpt/web-platform-tests/svg/linking/reftests/href-filter-element.html b/tests/wpt/web-platform-tests/svg/linking/reftests/href-filter-element.html
new file mode 100644
index 00000000000..3f718d0c55c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/reftests/href-filter-element.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>href - filter element</title>
+<meta name="assert" content="The filter element should accept href">
+<link rel="match" href="href-filter-element-ref.html">
+<body>
+ <svg width="300" height="300" viewBox="0 0 300 300"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <filter id="blurMe">
+ <feGaussianBlur in="SourceGraphic" stdDeviation="5" />
+ </filter>
+ <filter id="dropShadow">
+ <feGaussianBlur in="SourceAlpha" stdDeviation="3" />
+ <feOffset dx="2" dy="4" />
+ <feMerge>
+ <feMergeNode />
+ <feMergeNode in="SourceGraphic" />
+ </feMerge>
+ </filter>
+ <filter id="Copied" href="#blurMe" xlink:href="#dropShadow">
+ </filter>
+ <circle cx="60" cy="60" r="50" fill="green" filter="url(#Copied)"/>
+ </svg>
+</body>
diff --git a/tests/wpt/web-platform-tests/svg/linking/reftests/href-gradient-element-ref.html b/tests/wpt/web-platform-tests/svg/linking/reftests/href-gradient-element-ref.html
new file mode 100644
index 00000000000..279be683df7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/reftests/href-gradient-element-ref.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>href - gradient element reference</title>
+<body>
+ <svg width="300" height="300" viewBox="0 0 300 300"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="MyGradient">
+ <stop offset="5%" stop-color="green"/>
+ <stop offset="95%" stop-color="gold"/>
+ </linearGradient>
+ <rect fill="url(#MyGradient)" stroke="black" x="0" y="0"
+ width="100" height="100"/>
+
+ <radialGradient id="MyRadialGradient">
+ <stop offset="0%" stop-color="red"/>
+ <stop offset="100%" stop-color="blue"/>
+ </radialGradient>
+ <rect x="110" y="0" rx="15" ry="15" width="100" height="100"
+ fill="url(#MyRadialGradient)"/>
+ </svg>
+</body>
diff --git a/tests/wpt/web-platform-tests/svg/linking/reftests/href-gradient-element.html b/tests/wpt/web-platform-tests/svg/linking/reftests/href-gradient-element.html
new file mode 100644
index 00000000000..2442b6f3d49
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/reftests/href-gradient-element.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>href - gradient element</title>
+<meta name="assert" content="The gradient element should accept href">
+<link rel="match" href="href-gradient-element-ref.html">
+<body>
+ <svg width="300" height="300" viewBox="0 0 300 300"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <linearGradient id="MyGradient">
+ <stop offset="5%" stop-color="green"/>
+ <stop offset="95%" stop-color="gold"/>
+ </linearGradient>
+ <linearGradient id="MyGradient2">
+ <stop offset="5%" stop-color="red"/>
+ <stop offset="95%" stop-color="blue"/>
+ </linearGradient>
+ <linearGradient id="CopiedGradient" href="#MyGradient"
+ xlink:href="#MyGradient2">
+ </linearGradient>
+ <rect fill="url(#CopiedGradient)" stroke="black" x="0" y="0"
+ width="100" height="100"/>
+
+ <radialGradient id="MyRadialGradient">
+ <stop offset="0%" stop-color="red"/>
+ <stop offset="100%" stop-color="blue"/>
+ </radialGradient>
+ <radialGradient id="CopiedRadialGradient" href="#MyRadialGradient"/>
+ <rect x="110" y="0" rx="15" ry="15" width="100" height="100"
+ fill="url(#CopiedRadialGradient)"/>
+ </svg>
+</body>
diff --git a/tests/wpt/web-platform-tests/svg/linking/reftests/href-image-element-ref.html b/tests/wpt/web-platform-tests/svg/linking/reftests/href-image-element-ref.html
new file mode 100644
index 00000000000..c51906fdeca
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/reftests/href-image-element-ref.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>href - image element reference</title>
+<body>
+ <svg width="300" height="300" viewBox="0 0 300 300"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <image xlink:href="/images/green.png" width="100px" height="100px"/>
+ </svg>
+</body>
diff --git a/tests/wpt/web-platform-tests/svg/linking/reftests/href-image-element.html b/tests/wpt/web-platform-tests/svg/linking/reftests/href-image-element.html
new file mode 100644
index 00000000000..779e33f6209
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/reftests/href-image-element.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>href - image element</title>
+<meta name="assert" content="The image should accept href">
+<link rel="match" href="href-image-element-ref.html">
+<body>
+ <svg width="300" height="300" viewBox="0 0 300 300"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <image href="/images/green.png" xlink:href="/images/red.png"
+ width="100px" height="100px"/>
+ </svg>
+</body>
diff --git a/tests/wpt/web-platform-tests/svg/linking/reftests/href-pattern-element-ref.html b/tests/wpt/web-platform-tests/svg/linking/reftests/href-pattern-element-ref.html
new file mode 100644
index 00000000000..bd8770c9747
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/reftests/href-pattern-element-ref.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>href - pattern element reference</title>
+<body>
+ <svg width="300" height="300" viewBox="0 0 300 300"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <pattern id="Pattern" x="0" y="0" width=".25" height=".25">
+ <rect x="0" y="0" width="25" height="25" fill="skyblue"/>
+ <circle cx="25" cy="25" r="20" fill="green" fill-opacity="0.5"/>
+ </pattern>
+ <rect fill="url(#Pattern)" stroke="black" x="0" y="0"
+ width="200" height="200"/>
+ </svg>
+</body>
diff --git a/tests/wpt/web-platform-tests/svg/linking/reftests/href-pattern-element.html b/tests/wpt/web-platform-tests/svg/linking/reftests/href-pattern-element.html
new file mode 100644
index 00000000000..89aa243152e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/reftests/href-pattern-element.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>href - pattern element</title>
+<meta name="assert" content="The pattern element should accept href">
+<link rel="match" href="href-pattern-element-ref.html">
+<body>
+ <svg width="300" height="300" viewBox="0 0 300 300">
+ <pattern id="Pattern" x="0" y="0" width=".25" height=".25">
+ <rect x="0" y="0" width="25" height="25" fill="skyblue"/>
+ <circle cx="25" cy="25" r="20" fill="green" fill-opacity="0.5"/>
+ </pattern>
+ <pattern id="Pattern2" x="0" y="0" width=".25" height=".25">
+ <rect x="0" y="0" width="25" height="25" fill="skyblue"/>
+ <circle cx="25" cy="25" r="20" fill="red" fill-opacity="0.5"/>
+ </pattern>
+ <pattern id="CopiedPattern" href="#Pattern" xlink:href="#Pattern2">
+ </pattern>
+ <rect fill="url(#CopiedPattern)" stroke="black" x="0" y="0"
+ width="200" height="200"/>
+ </svg>
+</body>
diff --git a/tests/wpt/web-platform-tests/svg/linking/reftests/href-textPath-element-ref.html b/tests/wpt/web-platform-tests/svg/linking/reftests/href-textPath-element-ref.html
new file mode 100644
index 00000000000..4e1fd3531d7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/reftests/href-textPath-element-ref.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>href - textPath element reference</title>
+<body>
+ <svg width="100%" height="100%" viewBox="0 0 1000 300"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <path id="MyPath"
+ d="M 100 200
+ C 200 100 300 0 400 100
+ C 500 200 600 300 700 200
+ C 800 100 900 100 900 100" />
+ </defs>
+ <text font-family="Verdana" font-size="40">
+ <textPath xlink:href="#MyPath">
+ We go up, then we go down, then up again
+ </textPath>
+ </text>
+ </svg>
+</body>
diff --git a/tests/wpt/web-platform-tests/svg/linking/reftests/href-textPath-element.html b/tests/wpt/web-platform-tests/svg/linking/reftests/href-textPath-element.html
new file mode 100644
index 00000000000..b31e92224ae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/reftests/href-textPath-element.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>href - textPath element</title>
+<meta name="assert" content="The textPath element should accept href">
+<link rel="match" href="href-textPath-element-ref.html">
+<body>
+ <svg width="100%" height="100%" viewBox="0 0 1000 300"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <path id="MyPath"
+ d="M 100 200
+ C 200 100 300 0 400 100
+ C 500 200 600 300 700 200
+ C 800 100 900 100 900 100" />
+ <path id="MyPath2" d="M 100 100 L 900 100" />
+ </defs>
+ <text font-family="Verdana" font-size="40">
+ <textPath href="#MyPath" xlink:href="#MyPath2">
+ We go up, then we go down, then up again
+ </textPath>
+ </text>
+ </svg>
+</body>
diff --git a/tests/wpt/web-platform-tests/svg/linking/reftests/href-use-element-ref.html b/tests/wpt/web-platform-tests/svg/linking/reftests/href-use-element-ref.html
new file mode 100644
index 00000000000..93577b7643f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/reftests/href-use-element-ref.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>href - use element reference</title>
+<body>
+ <svg style="display: none">
+ <rect id='refRect' style="fill: red" width="100" height="100" />
+ </svg>
+ <svg width="300" height="300" viewBox="0 0 300 300"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <use xlink:href="#refRect"/>
+ </svg>
+</body>
diff --git a/tests/wpt/web-platform-tests/svg/linking/reftests/href-use-element.html b/tests/wpt/web-platform-tests/svg/linking/reftests/href-use-element.html
new file mode 100644
index 00000000000..e6b37f29e51
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/reftests/href-use-element.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>href - use element</title>
+<meta name="assert" content="The use element should accept href">
+<link rel="match" href="href-use-element-ref.html">
+<body>
+ <svg style="display: none">
+ <circle id="refCircle" style="fill: orange" cx="50px" cy="50px" r="50px" />
+ <rect id='refRect' style="fill: red" width="100" height="100" />
+ </svg>
+ <svg width="300" height="300" viewBox="0 0 300 300"
+ xmlns:xlink="http://www.w3.org/1999/xlink">
+ <use href="#refRect" xlink:href="#refCircle"/>
+ </svg>
+</body>
diff --git a/tests/wpt/web-platform-tests/svg/linking/scripted/href-animate-element.html b/tests/wpt/web-platform-tests/svg/linking/scripted/href-animate-element.html
new file mode 100644
index 00000000000..f0b99209a80
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/scripted/href-animate-element.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Href - animate element tests</title>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<script src='testcommon.js'></script>
+<body>
+<div id='log'></div>
+<svg id='svg' width='100' height='100' viewBox='0 0 100 100'></svg>
+<script>
+'use strict';
+
+promise_test(function(t) {
+ var svg = document.getElementById('svg');
+ var rect1 = createSVGElement(t, 'rect', svg,
+ { 'width': '10px',
+ 'height': '10px',
+ 'id': 'rect1' });
+ var rect2 = createSVGElement(t, 'rect', svg,
+ { 'width': '10px',
+ 'height': '10px',
+ 'id': 'rect2' });
+ var animate = createSVGElement(t, 'animate', svg,
+ { 'attributeName': 'x',
+ 'from': '0',
+ 'to': '100',
+ 'dur': '10s' });
+ animate.setAttribute('href', '#rect1');
+ animate.setAttributeNS(XLINKNS, 'xlink:href', '#rect2');
+ assert_equals(animate.targetElement, rect1);
+
+ return waitEvent(animate, 'begin').then(function() {
+ svg.pauseAnimations();
+ svg.setCurrentTime(5);
+ assert_equals(rect1.x.animVal.value, 50);
+ assert_equals(rect2.x.animVal.value, 0);
+ });
+}, 'Test for animate element when setting both href and xlink:href');
+
+promise_test(function(t) {
+ var svg = document.getElementById('svg');
+ var rect1 = createSVGElement(t, 'rect', svg,
+ { 'width': '10px',
+ 'height': '10px',
+ 'id': 'rect1' });
+ var rect2 = createSVGElement(t, 'rect', svg,
+ { 'width': '10px',
+ 'height': '10px',
+ 'id': 'rect2' });
+ var transform = createSVGElement(t, 'animateTransform', svg,
+ { 'attributeName': 'transform',
+ 'type': 'translate',
+ 'from': '0',
+ 'to': '100',
+ 'dur': '10s' });
+
+ transform.setAttribute('href', '#rect1');
+ transform.setAttributeNS(XLINKNS, 'xlink:href', '#rect2');
+ assert_equals(transform.targetElement, rect1);
+
+ return waitEvent(transform, 'begin').then(function() {
+ svg.pauseAnimations();
+ svg.setCurrentTime(5);
+ assert_equals(rect1.getCTM().e, 50);
+ assert_equals(rect2.getCTM().e, 0);
+ });
+}, 'Test for animateTransform element when setting both href and xlink:href');
+
+promise_test(function(t) {
+ var svg = document.getElementById('svg');
+ var circle1 = createSVGElement(t, 'circle', svg,
+ { 'cx': '50',
+ 'cy': '50',
+ 'r': '40',
+ 'id': 'circle1' });
+ var circle2 = createSVGElement(t, 'circle', svg,
+ { 'cx': '50',
+ 'cy': '50',
+ 'r': '40',
+ 'id': 'circle2' });
+ var animate = createSVGElement(t, 'animate', svg,
+ { 'attributeName': 'cx',
+ 'from': '50',
+ 'to': '150',
+ 'dur': '10s' });
+ animate.setAttribute('href', '#circle1');
+ animate.setAttributeNS(XLINKNS, 'xlink:href', '#circle2');
+ assert_equals(animate.targetElement, circle1);
+
+ return waitEvent(animate, 'begin').then(function() {
+ svg.pauseAnimations();
+ svg.setCurrentTime(5);
+ assert_equals(circle1.cx.animVal.value, 100);
+ assert_equals(circle2.cx.animVal.value, 50);
+
+ animate.removeAttribute('href');
+ assert_equals(animate.targetElement, circle2);
+ assert_equals(circle1.cx.animVal.value, 50);
+ assert_equals(circle2.cx.animVal.value, 100);
+ });
+}, 'Test for animate element when removing href but we still have xlink:href');
+
+promise_test(function(t) {
+ var svg = document.getElementById('svg');
+ var circle1 = createSVGElement(t, 'circle', svg,
+ { 'cx': '50',
+ 'cy': '50',
+ 'r': '40',
+ 'id': 'circle1' });
+ var circle2 = createSVGElement(t, 'circle', svg,
+ { 'cx': '50',
+ 'cy': '50',
+ 'r': '40',
+ 'id': 'circle2' });
+ var animate = createSVGElement(t, 'animate', svg,
+ { 'attributeName': 'cx',
+ 'from': '50',
+ 'to': '150',
+ 'dur': '10s' });
+ animate.setAttribute('href', '#circle1');
+ animate.setAttributeNS(XLINKNS, 'xlink:href', '#circle2');
+ assert_equals(animate.targetElement, circle1);
+
+ return waitEvent(animate, 'begin').then(function() {
+ svg.pauseAnimations();
+ svg.setCurrentTime(5);
+ assert_equals(circle1.cx.animVal.value, 100);
+ assert_equals(circle2.cx.animVal.value, 50);
+
+ animate.removeAttributeNS(XLINKNS, 'href');
+ assert_equals(animate.targetElement, circle1);
+ assert_equals(circle1.cx.animVal.value, 100);
+ assert_equals(circle2.cx.animVal.value, 50);
+ });
+}, 'Test for animate element when removing xlink:href but we still have href');
+
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/svg/linking/scripted/href-mpath-element.html b/tests/wpt/web-platform-tests/svg/linking/scripted/href-mpath-element.html
new file mode 100644
index 00000000000..8fb9f0f1aed
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/scripted/href-mpath-element.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Href - mpath element tests</title>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<script src='testcommon.js'></script>
+<body>
+<div id='log'></div>
+<svg id='svg' width='100' height='100' viewBox='0 0 100 100'></svg>
+<script>
+'use strict';
+
+promise_test(function(t) {
+ var svg = document.getElementById('svg');
+ var path1 = createSVGElement(t, 'path', svg,
+ { 'id': 'MyPath1', 'd': 'M 0,0 L 100,0' });
+ var path2 = createSVGElement(t, 'path', svg,
+ { 'id': 'MyPath2', 'd': 'M 0,0 L 0,100' });
+ var rect = createSVGElement(t, 'rect', svg,
+ { 'width': '10px', 'height': '10px' });
+ var animateMotion = createSVGElement(t, 'animateMotion', rect,
+ { 'dur': '10s' });
+ var mpath = createSVGElement(t, 'mpath', animateMotion);
+ mpath.setAttribute('href', '#MyPath1');
+ mpath.setAttributeNS(XLINKNS, 'xlink:href', '#MyPath2');
+ assert_equals(mpath.href.baseVal, '#MyPath1');
+
+ return waitEvent(animateMotion, 'begin').then(function() {
+ svg.pauseAnimations();
+ svg.setCurrentTime(1);
+ var ctm = rect.getCTM();
+ assert_equals(ctm.e, 10);
+ assert_equals(ctm.f, 0);
+
+ svg.setCurrentTime(5);
+ ctm = rect.getCTM();
+ assert_equals(ctm.e, 50);
+ assert_equals(ctm.f, 0);
+ });
+}, 'Test for mpath when setting both href and xlink:href');
+
+promise_test(function(t) {
+ var svg = document.getElementById('svg');
+ var path1 = createSVGElement(t, 'path', svg,
+ { 'id': 'MyPath1', 'd': 'M 0,0 L 100,0' });
+ var path2 = createSVGElement(t, 'path', svg,
+ { 'id': 'MyPath2', 'd': 'M 0,0 L 0,100' });
+ var rect = createSVGElement(t, 'rect', svg,
+ { 'width': '10px', 'height': '10px' });
+ var animateMotion = createSVGElement(t, 'animateMotion', rect,
+ { 'dur': '10s' });
+ var mpath = createSVGElement(t, 'mpath', animateMotion);
+ mpath.setAttribute('href', '#MyPath1');
+ mpath.setAttributeNS(XLINKNS, 'xlink:href', '#MyPath2');
+
+ return waitEvent(animateMotion, 'begin').then(function() {
+ svg.pauseAnimations();
+ svg.setCurrentTime(5);
+ var ctm = rect.getCTM();
+ assert_equals(ctm.e, 50);
+ assert_equals(ctm.f, 0);
+
+ mpath.removeAttribute('href');
+ assert_equals(mpath.href.baseVal, '#MyPath2');
+
+ ctm = rect.getCTM();
+ assert_equals(ctm.e, 0);
+ assert_equals(ctm.f, 50);
+ });
+}, 'Test for mpath when removing href but we still have xlink:href');
+
+promise_test(function(t) {
+ var svg = document.getElementById('svg');
+ var path1 = createSVGElement(t, 'path', svg,
+ { 'id': 'MyPath1', 'd': 'M 0,0 L 100,0' });
+ var path2 = createSVGElement(t, 'path', svg,
+ { 'id': 'MyPath2', 'd': 'M 0,0 L 0,100' });
+ var rect = createSVGElement(t, 'rect', svg,
+ { 'width': '10px', 'height': '10px' });
+ var animateMotion = createSVGElement(t, 'animateMotion', rect,
+ { 'dur': '10s' });
+ var mpath = createSVGElement(t, 'mpath', animateMotion);
+ mpath.setAttribute('href', '#MyPath1');
+ mpath.setAttributeNS(XLINKNS, 'xlink:href', '#MyPath2');
+
+ return waitEvent(animateMotion, 'begin').then(function() {
+ svg.pauseAnimations();
+ svg.setCurrentTime(5);
+ var ctm = rect.getCTM();
+ assert_equals(ctm.e, 50);
+ assert_equals(ctm.f, 0);
+
+ mpath.removeAttributeNS(XLINKNS, 'href');
+ assert_equals(mpath.href.baseVal, '#MyPath1');
+
+ ctm = rect.getCTM();
+ assert_equals(ctm.e, 50);
+ assert_equals(ctm.f, 0);
+ });
+}, 'Test for mpath when removing xlink:href but we still have href');
+
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/svg/linking/scripted/href-script-element-markup.html b/tests/wpt/web-platform-tests/svg/linking/scripted/href-script-element-markup.html
new file mode 100644
index 00000000000..0c6eb23cb66
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/scripted/href-script-element-markup.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Href - script element tests on markup</title>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<script src='testcommon.js'></script>
+<body>
+<div id='log'></div>
+<svg id='svg' width='100' height='100' viewBox='0 0 100 100'>
+ <script id='script' href='testScripts/externalScript1.js'
+ xlink:href='testScripts/externalScript2.js'></script>
+</svg>
+<script>
+'use strict';
+
+// Use an independent test file for markup testing because it may affect other
+// tests.
+
+test(function(t) {
+ var script = document.getElementById('script');
+ assert_equals(script.href.baseVal, 'testScripts/externalScript1.js');
+ assert_equals(loadedScript(), 'externalScript1');
+}, 'Test for loading external script by markup when setting both href and ' +
+ 'xlink:href');
+
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/svg/linking/scripted/href-script-element.html b/tests/wpt/web-platform-tests/svg/linking/scripted/href-script-element.html
new file mode 100644
index 00000000000..48f49085080
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/scripted/href-script-element.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Href - script element tests</title>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<script src='testcommon.js'></script>
+<body>
+<div id='log'></div>
+<svg id='svg' width='100' height='100' viewBox='0 0 100 100'>
+</svg>
+<script>
+'use strict';
+
+// Note:
+// The order of these tests shouldn't be changed because we don't unload
+// the external script file even if we expect the <script> element will be
+// removed by childNode.remove() and Garbage Collection after a test has been
+// finished. Therefore, I intentionally make them load externalScript1 and
+// externalScript2 alternately, and we can check if the results are changed
+// after reloading the other script.
+// Throughout this test, we periodically need to verify that a script
+// *does not load* after we've made a tweak. To do that, we have to
+// wait "long enough for it to have loaded", and then make sure nothing
+// has changed. We estimate "long enough" by adding an extra dummy
+// <script> element and watching for its load event.
+
+promise_test(function(t) {
+ var svg = document.getElementById('svg');
+ var script = createSVGElement(t, 'script', svg);
+
+ script.setAttribute('type', 'text/javascript');
+ script.setAttribute('href', 'testScripts/externalScript1.js');
+ assert_equals(script.href.baseVal, 'testScripts/externalScript1.js');
+
+ return waitEvent(script, 'load').then(function() {
+ assert_equals(loadedScript(), 'externalScript1',
+ 'Link to correct external script');
+
+ script.setAttributeNS(XLINKNS, 'xlink:href',
+ 'testScripts/externalScript2.js');
+
+ // Load an dummy script to trigger a load event.
+ var dummyScript = createSVGElement(t, 'script', svg);
+ dummyScript.setAttribute('href', 'testScripts/dummyScript.js');
+ return waitEvent(dummyScript, 'load');
+ }).then(function() {
+ assert_equals(script.href.baseVal, 'testScripts/externalScript1.js');
+ assert_equals(loadedScript(), 'externalScript1',
+ 'Still link to the external script from href');
+ });
+}, 'Test for loading external script from href when setting href and ' +
+ 'then xlink:href');
+
+promise_test(function(t) {
+ var svg = document.getElementById('svg');
+ var script = createSVGElement(t, 'script', svg);
+
+ script.setAttribute('type', 'text/javascript');
+ script.setAttributeNS(XLINKNS, 'xlink:href',
+ 'testScripts/externalScript2.js');
+ assert_equals(script.href.baseVal, 'testScripts/externalScript2.js');
+
+ return waitEvent(script, 'load').then(function() {
+ assert_equals(loadedScript(), 'externalScript2',
+ 'Link to the external script from xlink:href');
+
+ script.setAttribute('href', 'testScripts/externalScript1.js');
+
+ // Load an dummy script to trigger a load event.
+ var dummyScript = createSVGElement(t, 'script', svg);
+ dummyScript.setAttribute('href', 'testScripts/dummyScript.js');
+ return waitEvent(dummyScript, 'load');
+ }).then(function() {
+ assert_equals(script.href.baseVal, 'testScripts/externalScript1.js',
+ 'href() should prefer href attribute over xlink:href');
+ assert_equals(loadedScript(), 'externalScript2',
+ 'Still link to the external script from xlink:href');
+ });
+}, 'Test for loading external script from xlnk:href by adding xlink:href and ' +
+ 'then href');
+
+promise_test(function(t) {
+ var svg = document.getElementById('svg');
+ var script = createSVGElement(t, 'script', svg);
+
+ script.setAttribute('type', 'text/javascript');
+ script.setAttribute('href', 'testScripts/externalScript1.js');
+ script.setAttributeNS(XLINKNS, 'xlink:href',
+ 'testScripts/externalScript2.js');
+ assert_equals(script.href.baseVal, 'testScripts/externalScript1.js');
+
+ return waitEvent(script, 'load').then(function() {
+ assert_equals(loadedScript(), 'externalScript1',
+ 'Link to the external script by href');
+
+ script.removeAttribute('href');
+ assert_equals(script.href.baseVal, 'testScripts/externalScript2.js',
+ 'href() returns xlink:href attribute because href was unset');
+
+ // Load an dummy script to trigger a load event.
+ var dummyScript = createSVGElement(t, 'script', svg);
+ dummyScript.setAttribute('href', 'testScripts/dummyScript.js');
+ return waitEvent(dummyScript, 'load');
+ }).then(function() {
+ assert_equals(loadedScript(), 'externalScript1',
+ 'The external script loaded from href is still loaded');
+ });
+}, 'Test for loading external script from href by adding href and ' +
+ 'then xlink:href, and then removing href');
+
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/svg/linking/scripted/testScripts/dummyScript.js b/tests/wpt/web-platform-tests/svg/linking/scripted/testScripts/dummyScript.js
new file mode 100644
index 00000000000..fbf3c34d613
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/scripted/testScripts/dummyScript.js
@@ -0,0 +1,3 @@
+function dummyScript() {
+ return "This is a dummy script";
+}
diff --git a/tests/wpt/web-platform-tests/svg/linking/scripted/testScripts/externalScript1.js b/tests/wpt/web-platform-tests/svg/linking/scripted/testScripts/externalScript1.js
new file mode 100644
index 00000000000..ba4028ca801
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/scripted/testScripts/externalScript1.js
@@ -0,0 +1,3 @@
+function loadedScript() {
+ return "externalScript1";
+}
diff --git a/tests/wpt/web-platform-tests/svg/linking/scripted/testScripts/externalScript2.js b/tests/wpt/web-platform-tests/svg/linking/scripted/testScripts/externalScript2.js
new file mode 100644
index 00000000000..db3b60a8275
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/scripted/testScripts/externalScript2.js
@@ -0,0 +1,3 @@
+function loadedScript() {
+ return "externalScript2";
+}
diff --git a/tests/wpt/web-platform-tests/svg/linking/scripted/testcommon.js b/tests/wpt/web-platform-tests/svg/linking/scripted/testcommon.js
new file mode 100644
index 00000000000..7d87923f59b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/linking/scripted/testcommon.js
@@ -0,0 +1,42 @@
+/**
+ * The const var for SVG and xlink namespaces
+ */
+const SVGNS = 'http://www.w3.org/2000/svg';
+const XLINKNS = 'http://www.w3.org/1999/xlink';
+
+/**
+ * Appends a svg element to the parent.
+ *
+ * @param test The testharness.js Test object. If provided, this will be used
+ * to register a cleanup callback to remove the div when the test
+ * finishes.
+ * @param tag The element tag name.
+ * @param parent The parent element of this new created svg element.
+ * @param attrs A dictionary object with attribute names and values to set on
+ * the div.
+ */
+function createSVGElement(test, tag, parent, attrs) {
+ var elem = document.createElementNS(SVGNS, tag);
+ if (attrs) {
+ for (var attrName in attrs) {
+ elem.setAttribute(attrName, attrs[attrName]);
+ }
+ }
+ parent.appendChild(elem);
+ test.add_cleanup(function() {
+ elem.remove();
+ });
+ return elem;
+}
+
+/**
+ * Create a Promise object which resolves when a specific event fires.
+ *
+ * @param object The event target.
+ * @param name The event name.
+ */
+function waitEvent(object, name) {
+ return new Promise(function(resolve) {
+ object.addEventListener(name, resolve, { once: true });
+ });
+}
diff --git a/tests/wpt/web-platform-tests/svg/shapes/rect-01-ref.html b/tests/wpt/web-platform-tests/svg/shapes/rect-01-ref.html
new file mode 100644
index 00000000000..5e851e37e58
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/shapes/rect-01-ref.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<div style="position: absolute; top: 10px; left: 10px; width: 50px; height: 50px; background-color: blue;"></div>
diff --git a/tests/wpt/web-platform-tests/svg/shapes/rect-01.svg b/tests/wpt/web-platform-tests/svg/shapes/rect-01.svg
new file mode 100644
index 00000000000..a580807cbe9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/shapes/rect-01.svg
@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg">
+ <metadata>
+ <link xmlns="http://www.w3.org/1999/xhtml" rel="author" title="Cameron McCormack" href="mailto:cam@mcc.id.au"/>
+ <link xmlns="http://www.w3.org/1999/xhtml" rel="help" href="http://www.w3.org/TR/SVG2/shapes.html#RectElement"/>
+ <link xmlns="http://www.w3.org/1999/xhtml" rel="match" href="rect-01-ref.html"/>
+ <meta xmlns="http://www.w3.org/1999/xhtml" name="assert" content="rect element renders correctly."/>
+ </metadata>
+ <rect x="10" y="10" width="50" height="50" fill="blue"/>
+</svg>
diff --git a/tests/wpt/web-platform-tests/svg/shapes/rect-02-ref.html b/tests/wpt/web-platform-tests/svg/shapes/rect-02-ref.html
new file mode 100644
index 00000000000..b20895255ea
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/shapes/rect-02-ref.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<div style="position: absolute; top: 8px; left: 8px; width: 46px; height: 46px; border: 4px solid blue;"></div>
diff --git a/tests/wpt/web-platform-tests/svg/shapes/rect-02.svg b/tests/wpt/web-platform-tests/svg/shapes/rect-02.svg
new file mode 100644
index 00000000000..123203e97ff
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/shapes/rect-02.svg
@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg">
+ <metadata>
+ <link xmlns="http://www.w3.org/1999/xhtml" rel="author" title="Cameron McCormack" href="mailto:cam@mcc.id.au"/>
+ <link xmlns="http://www.w3.org/1999/xhtml" rel="help" href="http://www.w3.org/TR/SVG2/shapes.html#RectElement"/>
+ <link xmlns="http://www.w3.org/1999/xhtml" rel="match" href="rect-02-ref.html"/>
+ <meta xmlns="http://www.w3.org/1999/xhtml" name="assert" content="rect element with stroke renders correctly."/>
+ </metadata>
+ <rect x="10" y="10" width="50" height="50" fill="none" stroke="blue" stroke-width="4"/>
+</svg>
diff --git a/tests/wpt/web-platform-tests/svg/shapes/rect-03-ref.html b/tests/wpt/web-platform-tests/svg/shapes/rect-03-ref.html
new file mode 100644
index 00000000000..97abb41241f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/shapes/rect-03-ref.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<div style="position: absolute; top: 10px; left: 10px; width: 50px; height: 50px; border-radius: 8px; background-color: blue;"></div>
diff --git a/tests/wpt/web-platform-tests/svg/shapes/rect-03.svg b/tests/wpt/web-platform-tests/svg/shapes/rect-03.svg
new file mode 100644
index 00000000000..f4b59c91b11
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/shapes/rect-03.svg
@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg">
+ <metadata>
+ <link xmlns="http://www.w3.org/1999/xhtml" rel="author" title="Cameron McCormack" href="mailto:cam@mcc.id.au"/>
+ <link xmlns="http://www.w3.org/1999/xhtml" rel="help" href="http://www.w3.org/TR/SVG2/shapes.html#RectElement"/>
+ <link xmlns="http://www.w3.org/1999/xhtml" rel="match" href="rect-03-ref.html"/>
+ <meta xmlns="http://www.w3.org/1999/xhtml" name="assert" content="rect element with rounded corners renders correctly."/>
+ </metadata>
+ <rect x="10" y="10" width="50" height="50" rx="8" ry="8" fill="blue"/>
+</svg>
diff --git a/tests/wpt/web-platform-tests/svg/shapes/rect-04-ref.html b/tests/wpt/web-platform-tests/svg/shapes/rect-04-ref.html
new file mode 100644
index 00000000000..f47ba82cb3c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/shapes/rect-04-ref.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<!--
+ border-radius is 10px since it measures to the outside edge of the border,
+ as opposed to SVG's rect radius attributes, which measure to the middle
+ of the stroke
+-->
+<div style="position: absolute; top: 8px; left: 8px; width: 46px; height: 46px; border-radius: 10px; border: 4px solid blue;"></div>
diff --git a/tests/wpt/web-platform-tests/svg/shapes/rect-04.svg b/tests/wpt/web-platform-tests/svg/shapes/rect-04.svg
new file mode 100644
index 00000000000..37c4c9b2ab5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/svg/shapes/rect-04.svg
@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg">
+ <metadata>
+ <link xmlns="http://www.w3.org/1999/xhtml" rel="author" title="Cameron McCormack" href="mailto:cam@mcc.id.au"/>
+ <link xmlns="http://www.w3.org/1999/xhtml" rel="help" href="http://www.w3.org/TR/SVG2/shapes.html#RectElement"/>
+ <link xmlns="http://www.w3.org/1999/xhtml" rel="match" href="rect-04-ref.html"/>
+ <meta xmlns="http://www.w3.org/1999/xhtml" name="assert" content="rect element with rounded corners and stroke renders correctly."/>
+ </metadata>
+ <rect x="10" y="10" width="50" height="50" rx="8" ry="8" fill="none" stroke="blue" stroke-width="4"/>
+</svg>
diff --git a/tests/wpt/web-platform-tests/tools/appveyor.yml b/tests/wpt/web-platform-tests/tools/appveyor.yml
new file mode 100644
index 00000000000..ceb0a5a71b8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/appveyor.yml
@@ -0,0 +1,24 @@
+environment:
+ matrix:
+ - PYTHON: 'C:\\Python27'
+ - PYTHON: 'C:\\Python35'
+
+# Needed to make py.test believe our top level can be imported (we
+# otherwise end up in a wpt-tools directory, and of course you cannot
+# import a name including a hyphen in Python, so it ignores the fact
+# we have a __init__.py at the top level).
+clone_folder: 'C:\projects\wpttools'
+
+install:
+ - 'SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%'
+ - 'git submodule update --init --recursive'
+ - 'python.exe -m pip install tox codecov'
+
+build: off
+
+test_script:
+ - 'tox -e py'
+
+on_success:
+ - 'coverage combine'
+ - 'codecov'
diff --git a/tests/wpt/web-platform-tests/tools/lint/fnmatch.py b/tests/wpt/web-platform-tests/tools/lint/fnmatch.py
new file mode 100644
index 00000000000..2fe3eb0aa9e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/lint/fnmatch.py
@@ -0,0 +1,32 @@
+from __future__ import absolute_import
+
+import fnmatch as _stdlib_fnmatch
+import os
+
+
+__all__ = ["fnmatch", "fnmatchcase", "filter", "translate"]
+
+
+def fnmatch(name, pat):
+ name = os.path.normcase(name)
+ pat = os.path.normcase(pat)
+ return fnmatchcase(name, pat)
+
+
+def fnmatchcase(name, pat):
+ if '?' not in pat and '[' not in pat:
+ wildcards = pat.count("*")
+ if wildcards == 0:
+ return name == pat
+ elif wildcards == 1 and pat[0] == "*":
+ return name.endswith(pat[1:])
+ elif wildcards == 1 and pat[-1] == "*":
+ return name.startswith(pat[:-1])
+ return _stdlib_fnmatch.fnmatchcase(name, pat)
+
+
+def filter(names, pat):
+ return [n for n in names if fnmatch(n, pat)]
+
+
+translate = _stdlib_fnmatch.translate
diff --git a/tests/wpt/web-platform-tests/tools/lint/lint.py b/tests/wpt/web-platform-tests/tools/lint/lint.py
index b05cfacfefc..c201c199f02 100644
--- a/tests/wpt/web-platform-tests/tools/lint/lint.py
+++ b/tests/wpt/web-platform-tests/tools/lint/lint.py
@@ -3,7 +3,6 @@ from __future__ import print_function, unicode_literals
import abc
import argparse
import ast
-import fnmatch
import json
import os
import re
@@ -12,6 +11,7 @@ import sys
from collections import defaultdict
+from . import fnmatch
from ..localpaths import repo_root
from manifest.sourcefile import SourceFile
@@ -65,6 +65,7 @@ def parse_whitelist(f):
parts[-1] = int(parts[-1])
error_type, file_match, line_number = parts
+ file_match = os.path.normcase(file_match)
if error_type == "*":
ignored_files.add(file_match)
@@ -79,10 +80,14 @@ def filter_whitelist_errors(data, path, errors):
Filter out those errors that are whitelisted in `data`.
"""
+ if not errors:
+ return []
+
whitelisted = [False for item in range(len(errors))]
+ normpath = os.path.normcase(path)
for file_match, whitelist_errors in iteritems(data):
- if fnmatch.fnmatch(path, file_match):
+ if fnmatch.fnmatchcase(path, file_match):
for i, (error_type, msg, path, line) in enumerate(errors):
if error_type in whitelist_errors:
allowed_lines = whitelist_errors[error_type]
diff --git a/tests/wpt/web-platform-tests/tools/lint/tests/base.py b/tests/wpt/web-platform-tests/tools/lint/tests/base.py
new file mode 100644
index 00000000000..360f13ce293
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/lint/tests/base.py
@@ -0,0 +1,11 @@
+from __future__ import unicode_literals
+
+from six import integer_types, text_type
+
+def check_errors(errors):
+ for e in errors:
+ error_type, description, path, line_number = e
+ assert isinstance(error_type, text_type)
+ assert isinstance(description, text_type)
+ assert isinstance(path, text_type)
+ assert line_number is None or isinstance(line_number, integer_types)
diff --git a/tests/wpt/web-platform-tests/tools/lint/tests/test_file_lints.py b/tests/wpt/web-platform-tests/tools/lint/tests/test_file_lints.py
index 3e3e359b0f9..7ac2221ea21 100644
--- a/tests/wpt/web-platform-tests/tools/lint/tests/test_file_lints.py
+++ b/tests/wpt/web-platform-tests/tools/lint/tests/test_file_lints.py
@@ -1,6 +1,7 @@
from __future__ import unicode_literals
from ..lint import check_file_contents
+from .base import check_errors
import os
import pytest
import six
@@ -39,6 +40,8 @@ def test_trailing_whitespace():
error_map = check_with_files(b"test; ")
for (filename, (errors, kind)) in error_map.items():
+ check_errors(errors)
+
expected = [("TRAILING WHITESPACE", "Whitespace at EOL", filename, 1)]
if kind == "web-strict":
expected.append(("PARSE-FAILED", "Unable to parse file", filename, None))
@@ -49,6 +52,8 @@ def test_indent_tabs():
error_map = check_with_files(b"def foo():\n\x09pass")
for (filename, (errors, kind)) in error_map.items():
+ check_errors(errors)
+
expected = [("INDENT TABS", "Tabs used for indentation", filename, 2)]
if kind == "web-strict":
expected.append(("PARSE-FAILED", "Unable to parse file", filename, None))
@@ -59,6 +64,8 @@ def test_cr_not_at_eol():
error_map = check_with_files(b"line1\rline2\r")
for (filename, (errors, kind)) in error_map.items():
+ check_errors(errors)
+
expected = [("CR AT EOL", "CR character in line separator", filename, 1)]
if kind == "web-strict":
expected.append(("PARSE-FAILED", "Unable to parse file", filename, None))
@@ -69,6 +76,8 @@ def test_cr_at_eol():
error_map = check_with_files(b"line1\r\nline2\r\n")
for (filename, (errors, kind)) in error_map.items():
+ check_errors(errors)
+
expected = [
("CR AT EOL", "CR character in line separator", filename, 1),
("CR AT EOL", "CR character in line separator", filename, 2),
@@ -82,6 +91,8 @@ def test_w3c_test_org():
error_map = check_with_files(b"import('http://www.w3c-test.org/')")
for (filename, (errors, kind)) in error_map.items():
+ check_errors(errors)
+
expected = [("W3C-TEST.ORG", "External w3c-test.org domain used", filename, 1)]
if kind == "python":
expected.append(("PARSE-FAILED", "Unable to parse file", filename, 1))
@@ -94,6 +105,8 @@ def test_webidl2_js():
error_map = check_with_files(b"<script src=/resources/webidl2.js>")
for (filename, (errors, kind)) in error_map.items():
+ check_errors(errors)
+
expected = [("WEBIDL2.JS", "Legacy webidl2.js script used", filename, 1)]
if kind == "python":
expected.append(("PARSE-FAILED", "Unable to parse file", filename, 1))
@@ -106,6 +119,8 @@ def test_console():
error_map = check_with_files(b"<script>\nconsole.log('error');\nconsole.error ('log')\n</script>")
for (filename, (errors, kind)) in error_map.items():
+ check_errors(errors)
+
if kind in ["web-lax", "web-strict", "js"]:
assert errors == [
("CONSOLE", "Console logging API used", filename, 2),
@@ -126,6 +141,8 @@ def test_meta_timeout():
error_map = check_with_files(code)
for (filename, (errors, kind)) in error_map.items():
+ check_errors(errors)
+
if kind in ["web-lax", "web-strict"]:
assert errors == [
("MULTIPLE-TIMEOUT", "More than one meta name='timeout'", filename, None),
@@ -148,6 +165,8 @@ def test_early_testharnessreport():
error_map = check_with_files(code)
for (filename, (errors, kind)) in error_map.items():
+ check_errors(errors)
+
if kind in ["web-lax", "web-strict"]:
assert errors == [
("EARLY-TESTHARNESSREPORT", "testharnessreport.js script seen before testharness.js script", filename, None),
@@ -168,6 +187,8 @@ def test_multiple_testharness():
error_map = check_with_files(code)
for (filename, (errors, kind)) in error_map.items():
+ check_errors(errors)
+
if kind in ["web-lax", "web-strict"]:
assert errors == [
("MULTIPLE-TESTHARNESS", "More than one <script src='/resources/testharness.js'>", filename, None),
@@ -190,6 +211,8 @@ def test_multiple_testharnessreport():
error_map = check_with_files(code)
for (filename, (errors, kind)) in error_map.items():
+ check_errors(errors)
+
if kind in ["web-lax", "web-strict"]:
assert errors == [
("MULTIPLE-TESTHARNESSREPORT", "More than one <script src='/resources/testharnessreport.js'>", filename, None),
@@ -211,6 +234,8 @@ def test_present_testharnesscss():
error_map = check_with_files(code)
for (filename, (errors, kind)) in error_map.items():
+ check_errors(errors)
+
if kind in ["web-lax", "web-strict"]:
assert errors == [
("PRESENT-TESTHARNESSCSS", "Explicit link to testharness.css present", filename, None),
@@ -233,6 +258,8 @@ def test_testharness_path():
error_map = check_with_files(code)
for (filename, (errors, kind)) in error_map.items():
+ check_errors(errors)
+
expected = [("W3C-TEST.ORG", "External w3c-test.org domain used", filename, 5)]
if kind == "python":
expected.append(("PARSE-FAILED", "Unable to parse file", filename, 1))
@@ -258,6 +285,8 @@ def test_testharnessreport_path():
error_map = check_with_files(code)
for (filename, (errors, kind)) in error_map.items():
+ check_errors(errors)
+
expected = [("W3C-TEST.ORG", "External w3c-test.org domain used", filename, 5)]
if kind == "python":
expected.append(("PARSE-FAILED", "Unable to parse file", filename, 1))
@@ -282,6 +311,8 @@ def test_not_testharness_path():
error_map = check_with_files(code)
for (filename, (errors, kind)) in error_map.items():
+ check_errors(errors)
+
if kind == "python":
assert errors == [
("PARSE-FAILED", "Unable to parse file", filename, 1),
@@ -295,6 +326,8 @@ def test_print_statement():
error_map = check_with_files(b"def foo():\n print 'statement'\n print\n")
for (filename, (errors, kind)) in error_map.items():
+ check_errors(errors)
+
if kind == "python":
assert errors == [
("PRINT STATEMENT", "Print function used", filename, 2),
@@ -312,6 +345,8 @@ def test_print_function():
error_map = check_with_files(b"def foo():\n print('function')\n")
for (filename, (errors, kind)) in error_map.items():
+ check_errors(errors)
+
if kind == "python":
assert errors == [
("PRINT STATEMENT", "Print function used", filename, 2),
@@ -346,6 +381,7 @@ def test_open_mode():
for method in ["open", "file"]:
code = open_mode_code.format(method).encode("utf-8")
errors = check_file_contents("", "test.py", six.BytesIO(code))
+ check_errors(errors)
message = ("File opened without providing an explicit mode (note: " +
"binary files must be read with 'b' in the mode flags)")
diff --git a/tests/wpt/web-platform-tests/tools/lint/tests/test_lint.py b/tests/wpt/web-platform-tests/tools/lint/tests/test_lint.py
index ebca206c816..2e4e6847604 100644
--- a/tests/wpt/web-platform-tests/tools/lint/tests/test_lint.py
+++ b/tests/wpt/web-platform-tests/tools/lint/tests/test_lint.py
@@ -59,7 +59,8 @@ CONSOLE:streams/resources/test-utils.js: 12
'CR AT EOL': {None},
},
}
- expected_ignored = {"*.pdf", "resources/*"}
+ expected_data = {os.path.normcase(p): e for p, e in expected_data.items()}
+ expected_ignored = {os.path.normcase(x) for x in {"*.pdf", "resources/*"}}
data, ignored = parse_whitelist(input_buffer)
assert data == expected_data
assert ignored == expected_ignored
diff --git a/tests/wpt/web-platform-tests/tools/lint/tests/test_path_lints.py b/tests/wpt/web-platform-tests/tools/lint/tests/test_path_lints.py
index 83cb8aaa634..d2795a0b15c 100644
--- a/tests/wpt/web-platform-tests/tools/lint/tests/test_path_lints.py
+++ b/tests/wpt/web-platform-tests/tools/lint/tests/test_path_lints.py
@@ -1,6 +1,7 @@
from __future__ import unicode_literals
from ..lint import check_path
+from .base import check_errors
import pytest
import six
@@ -11,6 +12,7 @@ def test_allowed_path_length():
filename = basename + idx * "a"
errors = check_path("/foo/", filename)
+ check_errors(errors)
assert errors == []
@@ -22,4 +24,5 @@ def test_forbidden_path_length():
message = "/%s longer than maximum path length (%s > 150)" % (filename, 146 + idx)
errors = check_path("/foo/", filename)
- assert errors == [("PATH LENGTH", message, None)]
+ check_errors(errors)
+ assert errors == [("PATH LENGTH", message, filename, None)]
diff --git a/tests/wpt/web-platform-tests/tools/manifest/sourcefile.py b/tests/wpt/web-platform-tests/tools/manifest/sourcefile.py
index c2ac783c482..794f2568627 100644
--- a/tests/wpt/web-platform-tests/tools/manifest/sourcefile.py
+++ b/tests/wpt/web-platform-tests/tools/manifest/sourcefile.py
@@ -1,4 +1,3 @@
-import imp
import os
from six.moves.urllib.parse import urljoin
from fnmatch import fnmatch
@@ -57,7 +56,7 @@ class SourceFile(object):
self.type_flag = None
if "-" in self.name:
- self.type_flag = self.name.rsplit("-", 1)[1]
+ self.type_flag = self.name.rsplit("-", 1)[1].split(".")[0]
self.meta_flags = self.name.split(".")[1:]
@@ -97,7 +96,7 @@ class SourceFile(object):
if self.contents is not None:
file_obj = ContextManagerBytesIO(self.contents)
elif self.use_committed:
- git = vcs.get_git_func(os.path.dirname(__file__))
+ git = vcs.get_git_func(os.path.dirname(self.tests_root))
blob = git("show", "HEAD:%s" % self.rel_path)
file_obj = ContextManagerBytesIO(blob)
else:
@@ -328,11 +327,11 @@ class SourceFile(object):
elif self.name_is_multi_global:
rv = [
TestharnessTest(self, replace_end(self.url, ".any.js", ".any.html")),
- TestharnessTest(self, replace_end(self.url, ".any.js", ".any.worker")),
+ TestharnessTest(self, replace_end(self.url, ".any.js", ".any.worker.html")),
]
elif self.name_is_worker:
- rv = [TestharnessTest(self, replace_end(self.url, ".worker.js", ".worker"))]
+ rv = [TestharnessTest(self, replace_end(self.url, ".worker.js", ".worker.html"))]
elif self.name_is_webdriver:
rv = [WebdriverSpecTest(self, self.url)]
diff --git a/tests/wpt/web-platform-tests/tools/manifest/tests/test_sourcefile.py b/tests/wpt/web-platform-tests/tools/manifest/tests/test_sourcefile.py
index 19fdddfb5eb..c34d8678860 100644
--- a/tests/wpt/web-platform-tests/tools/manifest/tests/test_sourcefile.py
+++ b/tests/wpt/web-platform-tests/tools/manifest/tests/test_sourcefile.py
@@ -36,6 +36,8 @@ def test_name_is_manual():
manual_tests = [
"html/test-manual.html",
"html/test-manual.xhtml",
+ "html/test-manual.https.html",
+ "html/test-manual.https.xhtml"
]
for rel_path in manual_tests:
@@ -58,7 +60,7 @@ def test_worker():
assert not s.content_is_testharness
- assert items(s) == [("testharness", "/html/test.worker")]
+ assert items(s) == [("testharness", "/html/test.worker.html")]
def test_multi_global():
@@ -73,7 +75,7 @@ def test_multi_global():
assert items(s) == [
("testharness", "/html/test.any.html"),
- ("testharness", "/html/test.any.worker"),
+ ("testharness", "/html/test.any.worker.html"),
]
diff --git a/tests/wpt/web-platform-tests/tools/manifest/tests/test_utils.py b/tests/wpt/web-platform-tests/tools/manifest/tests/test_utils.py
new file mode 100644
index 00000000000..a95bd47e944
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/manifest/tests/test_utils.py
@@ -0,0 +1,28 @@
+import pytest
+
+from ..utils import is_blacklisted
+
+
+@pytest.mark.parametrize("url", [
+ "/foo",
+ "/tools/foo",
+ "/common/foo",
+ "/conformance-checkers/foo",
+ "/_certs/foo",
+ "/resources/foo",
+ "/support/foo",
+ "/foo/resources/bar",
+ "/foo/support/bar"
+])
+def test_is_blacklisted(url):
+ assert is_blacklisted(url) is True
+
+
+@pytest.mark.parametrize("url", [
+ "/foo/tools/bar",
+ "/foo/common/bar",
+ "/foo/conformance-checkers/bar",
+ "/foo/_certs/bar"
+])
+def test_not_is_blacklisted(url):
+ assert is_blacklisted(url) is False
diff --git a/tests/wpt/web-platform-tests/tools/manifest/utils.py b/tests/wpt/web-platform-tests/tools/manifest/utils.py
index 6ef35c653f9..c6b27229c54 100644
--- a/tests/wpt/web-platform-tests/tools/manifest/utils.py
+++ b/tests/wpt/web-platform-tests/tools/manifest/utils.py
@@ -1,7 +1,8 @@
import os
from six import BytesIO
-blacklist = ["/", "/tools/", "/resources/", "/common/", "/conformance-checkers/", "_certs"]
+blacklist = ["/tools/", "/resources/", "/common/", "/conformance-checkers/", "/_certs/"]
+blacklist_in = ["/resources/", "/support/"]
def rel_path_to_url(rel_path, url_base="/"):
assert not os.path.isabs(rel_path)
@@ -12,11 +13,13 @@ def rel_path_to_url(rel_path, url_base="/"):
return url_base + rel_path.replace(os.sep, "/")
def is_blacklisted(url):
+ if "/" not in url[1:]:
+ return True
for item in blacklist:
- if item == "/":
- if "/" not in url[1:]:
- return True
- elif url.startswith(item):
+ if url.startswith(item):
+ return True
+ for item in blacklist_in:
+ if item in url:
return True
return False
diff --git a/tests/wpt/web-platform-tests/tools/serve/serve.py b/tests/wpt/web-platform-tests/tools/serve/serve.py
index 4977a6bf6f5..f3d5c56432d 100644
--- a/tests/wpt/web-platform-tests/tools/serve/serve.py
+++ b/tests/wpt/web-platform-tests/tools/serve/serve.py
@@ -5,7 +5,6 @@ from __future__ import print_function
import argparse
import json
import os
-import signal
import socket
import sys
import threading
@@ -41,7 +40,7 @@ class WorkersHandler(object):
return self.handler(request, response)
def handle_request(self, request, response):
- worker_path = replace_end(request.url_parts.path, ".worker", ".worker.js")
+ worker_path = replace_end(request.url_parts.path, ".worker.html", ".worker.js")
return """<!doctype html>
<meta charset=utf-8>
<script src="/resources/testharness.js"></script>
@@ -118,7 +117,7 @@ class RoutesBuilder(object):
("*", "/serve.py", handlers.ErrorHandler(404))]
self.static = [
- ("GET", "*.worker", WorkersHandler()),
+ ("GET", "*.worker.html", WorkersHandler()),
("GET", "*.any.html", AnyHtmlHandler()),
("GET", "*.any.worker.js", AnyWorkerHandler()),
]
@@ -155,9 +154,25 @@ class RoutesBuilder(object):
b"%s%s" % (str(url_base) if url_base != "/" else "", str(suffix)),
handler_cls(base_path=path, url_base=url_base)))
+ def add_file_mount_point(self, file_url, base_path):
+ assert file_url.startswith("/")
+ url_base = file_url[0:file_url.rfind("/") + 1]
+ self.mountpoint_routes[file_url] = [("GET", file_url, handlers.FileHandler(base_path=base_path, url_base=url_base))]
-def default_routes():
- return RoutesBuilder().get_routes()
+
+def build_routes(aliases):
+ builder = RoutesBuilder()
+ for alias in aliases:
+ url = alias["url-path"]
+ directory = alias["local-dir"]
+ if not url.startswith("/") or len(directory) == 0:
+ logger.error("\"url-path\" value must start with '/'.")
+ continue
+ if url.endswith("/"):
+ builder.add_mount_point(url, directory)
+ else:
+ builder.add_file_mount_point(url, directory)
+ return builder.get_routes()
def setup_logger(level):
@@ -235,12 +250,12 @@ class ServerProc(object):
return self.proc.is_alive()
-def check_subdomains(host, paths, bind_hostname, ssl_config):
+def check_subdomains(host, paths, bind_hostname, ssl_config, aliases):
port = get_port()
subdomains = get_subdomains(host)
wrapper = ServerProc()
- wrapper.start(start_http_server, host, port, paths, default_routes(), bind_hostname,
+ wrapper.start(start_http_server, host, port, paths, build_routes(aliases), bind_hostname,
None, ssl_config)
connected = False
@@ -469,7 +484,7 @@ def start(config, ssl_environment, routes, **kwargs):
ssl_config = get_ssl_config(config, external_config["domains"].values(), ssl_environment)
if config["check_subdomains"]:
- check_subdomains(host, paths, bind_hostname, ssl_config)
+ check_subdomains(host, paths, bind_hostname, ssl_config, config["aliases"])
servers = start_servers(host, ports, paths, routes, bind_hostname, external_config,
ssl_config, **kwargs)
@@ -499,6 +514,9 @@ def set_computed_defaults(config):
root = get_value_or_default(config, "doc_root", default=repo_root)
config["ws_doc_root"] = os.path.join(root, "websockets", "handlers")
+ if not value_set(config, "aliases"):
+ config["aliases"] = []
+
def merge_json(base_obj, override_obj):
rv = {}
@@ -585,7 +603,7 @@ def main():
with stash.StashServer((config["host"], get_port()), authkey=str(uuid.uuid4())):
with get_ssl_environment(config) as ssl_env:
- config_, servers = start(config, ssl_env, default_routes(), **kwargs)
+ config_, servers = start(config, ssl_env, build_routes(config["aliases"]), **kwargs)
try:
while any(item.is_alive() for item in iter_procs(servers)):
diff --git a/tests/wpt/web-platform-tests/tools/tox.ini b/tests/wpt/web-platform-tests/tools/tox.ini
index 6638cc7cbdc..a5edd70ad78 100644
--- a/tests/wpt/web-platform-tests/tools/tox.ini
+++ b/tests/wpt/web-platform-tests/tools/tox.ini
@@ -5,10 +5,7 @@ skipsdist=True
[testenv]
deps =
flake8
- {toxinidir}/py
- {toxinidir}/pytest
- {toxinidir}/html5lib
- pytest-travis-fold
+ pytest
coverage
mock
diff --git a/tests/wpt/web-platform-tests/tools/webdriver/COPYING b/tests/wpt/web-platform-tests/tools/webdriver/COPYING
new file mode 100644
index 00000000000..14e2f777f6c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/webdriver/COPYING
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+ means each individual or legal entity that creates, contributes to
+ the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+ means the combination of the Contributions of others (if any) used
+ by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+ means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+ means Source Code Form to which the initial Contributor has attached
+ the notice in Exhibit A, the Executable Form of such Source Code
+ Form, and Modifications of such Source Code Form, in each case
+ including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+ means
+
+ (a) that the initial Contributor has attached the notice described
+ in Exhibit B to the Covered Software; or
+
+ (b) that the Covered Software was made available under the terms of
+ version 1.1 or earlier of the License, but not also under the
+ terms of a Secondary License.
+
+1.6. "Executable Form"
+ means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+ means a work that combines Covered Software with other material, in
+ a separate file or files, that is not Covered Software.
+
+1.8. "License"
+ means this document.
+
+1.9. "Licensable"
+ means having the right to grant, to the maximum extent possible,
+ whether at the time of the initial grant or subsequently, any and
+ all of the rights conveyed by this License.
+
+1.10. "Modifications"
+ means any of the following:
+
+ (a) any file in Source Code Form that results from an addition to,
+ deletion from, or modification of the contents of Covered
+ Software; or
+
+ (b) any new file in Source Code Form that contains any Covered
+ Software.
+
+1.11. "Patent Claims" of a Contributor
+ means any patent claim(s), including without limitation, method,
+ process, and apparatus claims, in any patent Licensable by such
+ Contributor that would be infringed, but for the grant of the
+ License, by the making, using, selling, offering for sale, having
+ made, import, or transfer of either its Contributions or its
+ Contributor Version.
+
+1.12. "Secondary License"
+ means either the GNU General Public License, Version 2.0, the GNU
+ Lesser General Public License, Version 2.1, the GNU Affero General
+ Public License, Version 3.0, or any later versions of those
+ licenses.
+
+1.13. "Source Code Form"
+ means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, "You" includes any entity that
+ controls, is controlled by, or is under common control with You. For
+ purposes of this definition, "control" means (a) the power, direct
+ or indirect, to cause the direction or management of such entity,
+ whether by contract or otherwise, or (b) ownership of more than
+ fifty percent (50%) of the outstanding shares or beneficial
+ ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or
+ as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+ for sale, have made, import, and otherwise transfer either its
+ Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+ or
+
+(b) for infringements caused by: (i) Your and any other third party's
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+ its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+ Form, as described in Section 3.1, and You must inform recipients of
+ the Executable Form how they can obtain a copy of such Source Code
+ Form by reasonable means in a timely manner, at a charge no more
+ than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+ License, or sublicense it under different terms, provided that the
+ license for the Executable Form does not attempt to limit or alter
+ the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+* *
+* 6. Disclaimer of Warranty *
+* ------------------------- *
+* *
+* Covered Software is provided under this License on an "as is" *
+* basis, without warranty of any kind, either expressed, implied, or *
+* statutory, including, without limitation, warranties that the *
+* Covered Software is free of defects, merchantable, fit for a *
+* particular purpose or non-infringing. The entire risk as to the *
+* quality and performance of the Covered Software is with You. *
+* Should any Covered Software prove defective in any respect, You *
+* (not any Contributor) assume the cost of any necessary servicing, *
+* repair, or correction. This disclaimer of warranty constitutes an *
+* essential part of this License. No use of any Covered Software is *
+* authorized under this License except under this disclaimer. *
+* *
+************************************************************************
+
+************************************************************************
+* *
+* 7. Limitation of Liability *
+* -------------------------- *
+* *
+* Under no circumstances and under no legal theory, whether tort *
+* (including negligence), contract, or otherwise, shall any *
+* Contributor, or anyone who distributes Covered Software as *
+* permitted above, be liable to You for any direct, indirect, *
+* special, incidental, or consequential damages of any character *
+* including, without limitation, damages for lost profits, loss of *
+* goodwill, work stoppage, computer failure or malfunction, or any *
+* and all other commercial damages or losses, even if such party *
+* shall have been informed of the possibility of such damages. This *
+* limitation of liability shall not apply to liability for death or *
+* personal injury resulting from such party's negligence to the *
+* extent applicable law prohibits such limitation. Some *
+* jurisdictions do not allow the exclusion or limitation of *
+* incidental or consequential damages, so this exclusion and *
+* limitation may not apply to You. *
+* *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+ This Source Code Form is subject to the terms of the Mozilla Public
+ License, v. 2.0. If a copy of the MPL was not distributed with this
+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+ This Source Code Form is "Incompatible With Secondary Licenses", as
+ defined by the Mozilla Public License, v. 2.0.
diff --git a/tests/wpt/web-platform-tests/tools/webdriver/README.md b/tests/wpt/web-platform-tests/tools/webdriver/README.md
index f5be793a8bb..194009f8a04 100644
--- a/tests/wpt/web-platform-tests/tools/webdriver/README.md
+++ b/tests/wpt/web-platform-tests/tools/webdriver/README.md
@@ -1,9 +1,10 @@
# WebDriver client for Python
-This package provides a WebDriver client compatible with
- the [W3C browser automation specification](https://w3c.github.io/webdriver/webdriver-spec.html).
+This package provides Python bindings
+that conform to the [W3C WebDriver standard](https://w3c.github.io/webdriver/webdriver-spec.html),
+which specifies a remote control protocol for web browsers.
-The client is written with determining
+These bindings are written with determining
implementation compliance to the specification in mind,
so that different remote end drivers
can determine whether they meet the recognised standard.
@@ -13,13 +14,21 @@ in the [Web Platform Tests](https://github.com/w3c/web-platform-tests).
## Installation
To install the package individually
-in your virtualenv or system-wide::
+in your virtualenv or system-wide:
% python setup.py install
-Or if you want to contribute patches::
+Since this package does not have any external dependencies,
+you can also use the client directly from the checkout directory,
+which is useful if you want to contribute patches back:
- % python setup.py develop
+ % cd /path/to/wdclient
+ % python
+ Python 2.7.12+ (default, Aug 4 2016, 20:04:34)
+ [GCC 6.1.1 20160724] on linux2
+ Type "help", "copyright", "credits" or "license" for more information.
+ >>> import webdriver
+ >>>
If you are writing WebDriver specification tests for
[WPT](https://github.com/w3c/web-platform-tests),
@@ -30,10 +39,28 @@ that is checked out in `./tools`.
## Usage
+You can use the built-in
+[context manager](https://docs.python.org/2/reference/compound_stmts.html#the-with-statement)
+to manage the lifetime of the session.
+The session is started implicitly
+at the first call to a command if it has not already been started,
+and will implicitly be ended when exiting the context:
+
+```py
+import webdriver
+
+with webdriver.Session("127.0.0.1", 4444) as session:
+ session.url = "https://mozilla.org"
+ print "The current URL is %s" % session.url
+```
+
+The following is functionally equivalent to the above,
+but giving you manual control of the session:
+
```py
import webdriver
-session = webdriver.Session("127.0.0.1", "4444")
+session = webdriver.Session("127.0.0.1", 4444)
session.start()
session.url = "https://mozilla.org"
diff --git a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py
index 49c7b280a9e..b7d37b92545 100644
--- a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py
+++ b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py
@@ -4,6 +4,7 @@
import urlparse
+import error
import transport
@@ -76,15 +77,26 @@ class Window(object):
@property
@command
def size(self):
- return self.session.send_command("GET", "window/size")
+ resp = self.session.send_command("GET", "window/size")
+ return (resp["width"], resp["height"])
@size.setter
@command
- def size(self, (height, width)):
- body = {"width": width,
- "height": height}
+ def size(self, (width, height)):
+ body = {"width": width, "height": height}
+ self.session.send_command("POST", "window/size", body)
- return self.session.send_command("POST", "window/size", body)
+ @property
+ @command
+ def position(self):
+ resp = self.session.send_command("GET", "window/position")
+ return (resp["x"], resp["y"])
+
+ @position.setter
+ @command
+ def position(self, (x, y)):
+ body = {"x": x, "y": y}
+ self.session.send_command("POST", "window/position", body)
@property
@command
@@ -134,9 +146,34 @@ class Cookies(object):
self.session.send_command("POST", "cookie/%s" % name, {}, key="value")
+class UserPrompt(object):
+ def __init__(self, session):
+ self.session = session
+
+ @command
+ def dismiss(self):
+ self.session.send_command("POST", "alert/dismiss")
+
+ @command
+ def accept(self):
+ self.session.send_command("POST", "alert/accept")
+
+ @property
+ @command
+ def text(self):
+ return self.session.send_command("GET", "alert/text", key="value")
+
+ @text.setter
+ @command
+ def text(self, value):
+ body = {"value": list(value)}
+ self.session.send_command("POST", "alert/text", body=body)
+
+
class Session(object):
- def __init__(self, host, port, url_prefix="", desired_capabilities=None,
- required_capabilities=None, timeout=60, extension=None):
+ def __init__(self, host, port, url_prefix="/", desired_capabilities=None,
+ required_capabilities=None, timeout=transport.HTTP_TIMEOUT,
+ extension=None):
self.transport = transport.HTTPWireProtocol(
host, port, url_prefix, timeout=timeout)
self.desired_capabilities = desired_capabilities
@@ -149,6 +186,21 @@ class Session(object):
self.extension = None
self.extension_cls = extension
+ self.timeouts = Timeouts(self)
+ self.window = Window(self)
+ self.find = Find(self)
+ self.alert = UserPrompt(self)
+
+ def __enter__(self):
+ self.start()
+ return self
+
+ def __exit__(self, *args, **kwargs):
+ self.end()
+
+ def __del__(self):
+ self.end()
+
def start(self):
if self.session_id is not None:
return
@@ -160,14 +212,12 @@ class Session(object):
caps["desiredCapabilities"] = self.desired_capabilities
if self.required_capabilities is not None:
caps["requiredCapabilities"] = self.required_capabilities
- body["capabilities"] = caps
+ #body["capabilities"] = caps
+ body = caps
resp = self.transport.send("POST", "session", body=body)
self.session_id = resp["sessionId"]
- self.timeouts = Timeouts(self)
- self.window = Window(self)
- self.find = Find(self)
if self.extension_cls:
self.extension = self.extension_cls(self)
@@ -185,20 +235,10 @@ class Session(object):
self.window = None
self.find = None
self.extension = None
- self.transport.disconnect()
-
- def __enter__(self):
- resp = self.start()
- if resp.error:
- raise Exception(resp)
- return self
-
- def __exit__(self, *args, **kwargs):
- resp = self.end()
- if resp.error:
- raise Exception(resp)
def send_command(self, method, url, body=None, key=None):
+ if self.session_id is None:
+ raise error.SessionNotCreatedException()
url = urlparse.urljoin("session/%s/" % self.session_id, url)
return self.transport.send(method, url, body, key=key)
diff --git a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/transport.py b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/transport.py
index d4b0adfda05..f3c1ed536f0 100644
--- a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/transport.py
+++ b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/transport.py
@@ -2,12 +2,8 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.
-
-import errno
import httplib
import json
-import socket
-import time
import urlparse
import error
@@ -30,20 +26,9 @@ class HTTPWireProtocol(object):
self.host = host
self.port = port
- self.path_prefix = url_prefix
+ self.url_prefix = url_prefix
self._timeout = timeout
- self._connection = None
-
- def connect(self):
- wait_for_port(self.host, self.port, self._timeout)
- self._connection = httplib.HTTPConnection(
- self.host, self.port, timeout=self._timeout)
-
- def disconnect(self):
- if self._connection:
- self._connection.close()
- self._connection = None
def url(self, suffix):
return urlparse.urljoin(self.path_prefix, suffix)
@@ -59,9 +44,6 @@ class HTTPWireProtocol(object):
the remote.
"""
- if not self._connection:
- self.connect()
-
if body is None and method == "POST":
body = {}
@@ -74,16 +56,20 @@ class HTTPWireProtocol(object):
if headers is None:
headers = {}
- url = self.path_prefix + url
- self._connection.request(method, url, body, headers)
+ url = self.url_prefix + url
- resp = self._connection.getresponse()
+ conn = httplib.HTTPConnection(
+ self.host, self.port, strict=True, timeout=self._timeout)
+ conn.request(method, url, body, headers)
+
+ resp = conn.getresponse()
resp_body = resp.read()
+ conn.close()
try:
data = json.loads(resp_body)
except:
- raise IOError("Could not parse response body as JSON: %s" % body)
+ raise IOError("Could not parse response body as JSON: '%s'" % resp_body)
if resp.status != 200:
cls = error.get(data.get("error"))
@@ -95,23 +81,3 @@ class HTTPWireProtocol(object):
data = None
return data
-
-
-def wait_for_port(host, port, timeout=HTTP_TIMEOUT):
- """Wait for a given host/port to be available."""
- starttime = time.time()
- poll_interval = 0.1
- while time.time() - starttime < timeout:
- sock = None
- try:
- sock = socket.socket()
- sock.connect((host, port))
- return True
- except socket.error as e:
- if e[0] != errno.ECONNREFUSED:
- raise
- finally:
- if sock:
- sock.close()
- time.sleep(poll_interval)
- return False
diff --git a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/with_headers.txt.sub.headers b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/with_headers.txt.sub.headers
index 4826221f55c..71494fccf10 100644
--- a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/with_headers.txt.sub.headers
+++ b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/docroot/with_headers.txt.sub.headers
@@ -3,3 +3,4 @@ Another-Header: {{$id:uuid()}}
Same-Value-Header: {{$id}}
Double-Header: PA
Double-Header: SS
+Content-Type: text/html
diff --git a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_handlers.py b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_handlers.py
index 5974b85566e..9189725cb25 100644
--- a/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_handlers.py
+++ b/tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_handlers.py
@@ -18,6 +18,7 @@ class TestFileHandler(TestUsingServer):
def test_headers(self):
resp = self.request("/with_headers.txt")
self.assertEqual(200, resp.getcode())
+ self.assertEqual("text/html", resp.info()["Content-Type"])
self.assertEqual("PASS", resp.info()["Custom-Header"])
# This will fail if it isn't a valid uuid
uuid.UUID(resp.info()["Another-Header"])
diff --git a/tests/wpt/web-platform-tests/touch-events/touch-touchevent-constructor.html b/tests/wpt/web-platform-tests/touch-events/touch-touchevent-constructor.html
index 01775a23191..15b2db735fd 100644
--- a/tests/wpt/web-platform-tests/touch-events/touch-touchevent-constructor.html
+++ b/tests/wpt/web-platform-tests/touch-events/touch-touchevent-constructor.html
@@ -10,9 +10,38 @@
<div id="target0"></div>
<script>
test(function() {
- assert_throws(new TypeError(), function() {new Touch();}, "Touch constructor requires initialize dictionary");
- assert_throws(new TypeError(), function() {new Touch({});}, "Touch constructor requires identifier and target");
-}, "Create a Touch object with insufficient properties");
+ var testIdentifier = 0;
+ var testTarget = document.getElementById('target0');
+
+ assert_throws(new TypeError(), function() {new Touch();}, "Touch constructor with no argument");
+ assert_throws(new TypeError(), function() {new Touch(null);}, "Touch constructor with null argument");
+ assert_throws(new TypeError(), function() {new Touch(undefined);}, "Touch constructor with undefined argument");
+ assert_throws(new TypeError(), function() {new Touch({});}, "Touch constructor with empty object");
+ assert_throws(new TypeError(), function() {new Touch({
+ identifier: testIdentifier
+ });}, "Touch constructor with only identifier");
+ assert_throws(new TypeError(), function() {new Touch({
+ target: testTarget
+ });}, "Touch constructor with only target");
+}, "Touch constructor with insufficient properties");
+
+test(function() {
+ var testIdentifier = 0;
+ var testTarget = document.getElementById('target0');
+
+ assert_throws(new TypeError(), function() {new Touch({
+ identifier: testIdentifier,
+ target: null
+ });}, "Touch constructor with null target");
+ assert_throws(new TypeError(), function() {new Touch({
+ identifier: testIdentifier,
+ target: undefined
+ });}, "Touch constructor with undefined target");
+ assert_throws(new TypeError(), function() {new Touch({
+ identifier: testIdentifier,
+ target: location
+ });}, "Touch constructor with Location target");
+}, "Touch constructor with non-EventTarget target");
test(function() {
var testIdentifier = 74;
diff --git a/tests/wpt/web-platform-tests/uievents/keyboard/key-101en-us-manual.html b/tests/wpt/web-platform-tests/uievents/keyboard/key-101en-us-manual.html
index 6fa00c929c8..8b9cb46d0c7 100644
--- a/tests/wpt/web-platform-tests/uievents/keyboard/key-101en-us-manual.html
+++ b/tests/wpt/web-platform-tests/uievents/keyboard/key-101en-us-manual.html
@@ -73,11 +73,11 @@ var KeyTable101 = [
["ShiftRight", 3, 3, 4, "Shift", "Shift", "Shift"],
["ControlLeft", 4, 3, 1, "Control", "Control", "Control"],
- ["OSLeft", 4, 3, 1, "Meta", "Meta", "Meta"],
+ ["MetaLeft", 4, 3, 1, "Meta", "Meta", "Meta"],
["AltLeft", 4, 3, 1, "Alt", "Alt", "Alt"],
["Space", 4, 0, 5, "Space", " ", " "],
["AltRight", 4, 3, 1, "Alt", "Alt", "Alt"],
- ["OSRight", 4, 3, 1, "Meta", "Meta", "Meta"],
+ ["MetaRight", 4, 3, 1, "Meta", "Meta", "Meta"],
["ContextMenu", 4, 0, 1, "Menu", "", ""],
["ControlRight", 4, 3, 1, "Control", "Control", "Control"],
diff --git a/tests/wpt/web-platform-tests/uievents/keyboard/key-102fr-fr-manual.html b/tests/wpt/web-platform-tests/uievents/keyboard/key-102fr-fr-manual.html
index 7ef1ce295ab..6521681a73c 100644
--- a/tests/wpt/web-platform-tests/uievents/keyboard/key-102fr-fr-manual.html
+++ b/tests/wpt/web-platform-tests/uievents/keyboard/key-102fr-fr-manual.html
@@ -75,11 +75,11 @@ var KeyTable102 = [
["ShiftRight", 3, 3, 4, "Shift", "Shift", "Shift"],
["ControlLeft", 4, 3, 1, "Control", "Control", "Control"],
- ["OSLeft", 4, 3, 1, "Meta", "Meta", "Meta"],
+ ["MetaLeft", 4, 3, 1, "Meta", "Meta", "Meta"],
["AltLeft", 4, 3, 1, "Alt", "Alt", "Alt"],
["Space", 4, 0, 5, "Space", " ", " "],
["AltRight", 4, 3, 1, "Alt", "Alt", "Alt"],
- ["OSRight", 4, 3, 1, "Meta", "Meta", "Meta"],
+ ["MetaRight", 4, 3, 1, "Meta", "Meta", "Meta"],
["ContextMenu", 4, 0, 1, "Menu", "", ""],
["ControlRight", 4, 3, 1, "Control", "Control", "Control"],
diff --git a/tests/wpt/web-platform-tests/uievents/order-of-events/focus-events/focus-contained-manual.html b/tests/wpt/web-platform-tests/uievents/order-of-events/focus-events/focus-contained-manual.html
new file mode 100644
index 00000000000..3f6e584d1ea
--- /dev/null
+++ b/tests/wpt/web-platform-tests/uievents/order-of-events/focus-events/focus-contained-manual.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Focus-related events should fire in the correct order</title>
+ <link rel="help" href="https://w3c.github.io/uievents/#events-focusevent-event-order">
+ <meta name="flags" content="interact">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/uievents/resources/eventrecorder.js"></script>
+</head>
+
+<body>
+ <ol>
+ <li>Click into the text input.</li>
+ <li>Click just below the text input.</li>
+ <li>Click into the text input again.</li>
+ <li>Click the "Done" button.</li>
+ </ol>
+ <div id="a" tabindex="1" style="width:400px; height:300px">
+ <br /><br /><br />
+ <input type="text", id="b"></div>
+ </div>
+ <button type="button" id="done">Done</button>
+</body>
+
+<script>
+setup({explicit_timeout: true});
+function stopPropagation(e) {
+ e.stopPropagation();
+}
+var relevantEvents = [
+ "focus",
+ "blur",
+ "focusin",
+ "focusout"
+];
+window.onload = function () {
+ var a = document.getElementById("a");
+ var b = document.getElementById("b");
+ var inputs = [a, b];
+ EventRecorder.configure({
+ objectMap: {
+ "a": a,
+ "b": b,
+ }
+ });
+
+ EventRecorder.addEventListenersForNodes(relevantEvents, inputs, stopPropagation);
+ var expected = [
+ {type: "focusin", target: "b"},
+ {type: "focus", target: "b"},
+ {type: "focusout", target: "b"},
+ {type: "focusin", target: "a"},
+ {type: "blur", target: "b"},
+ {type: "focus", target: "a"},
+ {type: "focusout", target: "a"},
+ {type: "focusin", target: "b"},
+ {type: "blur", target: "a"},
+ {type: "focus", target: "b"},
+ {type: "focusout", target: "b"},
+ {type: "blur", target: "b"}
+ ];
+
+ async_test(function(t) {
+ document.getElementById("done").addEventListener("click", function () {
+ t.step(function () {
+ assert_true(EventRecorder.checkRecords(expected));
+ t.done();
+ });
+ }, false);
+ }, "Focus-related events should fire in the correct order");
+ EventRecorder.start();
+};
+</script>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/uievents/order-of-events/focus-events/focus-manual.html b/tests/wpt/web-platform-tests/uievents/order-of-events/focus-events/focus-manual.html
index c91f790e21e..391daf7028c 100644
--- a/tests/wpt/web-platform-tests/uievents/order-of-events/focus-events/focus-manual.html
+++ b/tests/wpt/web-platform-tests/uievents/order-of-events/focus-events/focus-manual.html
@@ -1,81 +1,74 @@
<!DOCTYPE html>
<html>
- <head>
- <meta charset="utf-8">
- <title>Focus-related events should fire in the correct order</title>
- <link rel="author" title="Chris Rebert" href="http://chrisrebert.com">
- <link rel="help" href="https://w3c.github.io/uievents/#events-focusevent-event-order">
- <meta name="flags" content="interact">
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <ol>
- <li>Click into the first text input.</li>
- <li>Click into the second text input.</li>
- <li>Click the "Done" button.</li>
- </ol>
+<head>
+ <meta charset="utf-8">
+ <title>Focus-related events should fire in the correct order</title>
+ <link rel="author" title="Chris Rebert" href="http://chrisrebert.com">
+ <link rel="help" href="https://w3c.github.io/uievents/#events-focusevent-event-order">
+ <meta name="flags" content="interact">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/uievents/resources/eventrecorder.js"></script>
+</head>
- <input type="text" id="a" value="First">
- <br>
- <input type="text" id="b" value="Second">
- <br>
- <button type="button" id="done">Done</button>
+<body>
+ <ol>
+ <li>Click into the first text input.</li>
+ <li>Click into the second text input.</li>
+ <li>Click the "Done" button.</li>
+ </ol>
+ <input type="text" id="a" value="First">
+ <br>
+ <input type="text" id="b" value="Second">
+ <br>
+ <button type="button" id="done">Done</button>
+</body>
- <script>
+<script>
setup({explicit_timeout: true});
-var done = false;
-var events = [];
-var targets = [];
-function record(e) {
- if (done) {
- return;
- }
- events.push(e.type);
- targets.push(e.target.id);
-}
-function finish() {
- done = true;
+function stopPropagation(e) {
+ if (event.type == "focusin" || event.type == "focusout")
+ assert_true(event.bubbles);
+ e.stopPropagation();
}
var relevantEvents = [
- 'focus',
- 'blur',
- 'focusin',
- 'focusout'
+ "focus",
+ "blur",
+ "focusin",
+ "focusout"
];
window.onload = function () {
- var a = document.getElementById('a');
- var b = document.getElementById('b');
+ var a = document.getElementById("a");
+ var b = document.getElementById("b");
var inputs = [a, b];
+ EventRecorder.configure({
+ objectMap: {
+ "a": a,
+ "b": b,
+ }
+ });
- b.addEventListener('blur', finish, false);
- b.addEventListener('focusout', finish, false);
-
- for (var i = 0; i < inputs.length; i++) {
- for (var k = 0; k < relevantEvents.length; k++) {
- inputs[i].addEventListener(relevantEvents[k], record, false);
- }
- }
+ EventRecorder.addEventListenersForNodes(relevantEvents, inputs, stopPropagation);
+ var expected = [
+ {type: "focusin", target: "a"},
+ {type: "focus", target: "a"},
+ {type: "focusout", target: "a"},
+ {type: "focusin", target: "b"},
+ {type: "blur", target: "a"},
+ {type: "focus", target: "b"},
+ {type: "focusout", target: "b"},
+ {type: "blur", target: "b"}
+ ];
async_test(function(t) {
- document.getElementById('done').addEventListener('click', function () {
- finish();
+ document.getElementById("done").addEventListener("click", function () {
t.step(function () {
- assert_array_equals(
- events,
- ['focusin', 'focus', 'focusout', 'focusin', 'blur', 'focus'],
- 'Focus-related events should fire in this order: focusin, focus, focusout, focusin, blur, focus'
- );
- assert_array_equals(
- targets,
- [ 'a', 'a', 'a', 'b', 'a', 'b'],
- 'Focus-related events should fire at the correct targets'
- );
+ assert_true(EventRecorder.checkRecords(expected));
t.done();
});
}, false);
- }, 'Focus-related events should fire in the correct order');
+ }, "Focus-related events should fire in the correct order");
+ EventRecorder.start();
};
- </script>
- </body>
+</script>
</html>
diff --git a/tests/wpt/web-platform-tests/uievents/order-of-events/mouse-events/click-cancel-manual.html b/tests/wpt/web-platform-tests/uievents/order-of-events/mouse-events/click-cancel-manual.html
new file mode 100644
index 00000000000..d845237526b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/uievents/order-of-events/mouse-events/click-cancel-manual.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>Default action is canceled if the click event is canceled.</title>
+ <link rel="help" href="https://w3c.github.io/uievents/#events-clickevent-event-order">
+ <meta name="flags" content="interact">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <ol>
+ <li>Check the following item.</li>
+ <li>Hover over the button.</li>
+ </ol>
+ <input type="checkbox" id="checkbox">Check me!<br>
+ <button type="button" id="done">Button</button>
+</body>
+<script>
+setup({explicit_timeout: true});
+
+window.onload = function () {
+ var box = document.getElementById("checkbox");
+ box.addEventListener("click", function(event) {
+ event.preventDefault();
+ })
+
+ async_test(function(t) {
+ document.getElementById("done").addEventListener("mouseover", function () {
+ t.step(function () {
+ assert_false(box.checked);
+ t.done();
+ });
+ }, false);
+ }, "Default event is canceled if the click event is canceled");
+};
+ </script>
+</html>
diff --git a/tests/wpt/web-platform-tests/uievents/order-of-events/mouse-events/click-order-manual.html b/tests/wpt/web-platform-tests/uievents/order-of-events/mouse-events/click-order-manual.html
new file mode 100644
index 00000000000..7d31a5f8dbb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/uievents/order-of-events/mouse-events/click-order-manual.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>Click-related events should fire in the correct order</title>
+ <link rel="help" href="https://w3c.github.io/uievents/#events-clickevent-event-order">
+ <meta name="flags" content="interact">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/uievents/resources/eventrecorder.js"></script>
+ </head>
+ <body>
+ <ol>
+ <li>Double-click into the blue area.</li>
+ <li>Click the "Done" button.</li>
+ </ol>
+ <div id="blue" style="width:400px; height:300px; background-color: blue;"></div>
+ <button type="button" id="done">Done</button>
+</body>
+<script>
+setup({explicit_timeout: true});
+
+function bubbles(e) {
+ assert_true(e.bubbles);
+}
+
+var relevantEvents = [
+ "mousedown",
+ "mouseup",
+ "mousemove",
+ "click",
+ "dblclick"
+];
+
+window.onload = function () {
+ var blue = document.getElementById("blue");
+ var inputs = [blue];
+ EventRecorder.configure({
+ mergeEventTypes: ["mousemove"],
+ objectMap: {
+ "blue": blue
+ }
+ });
+
+ EventRecorder.addEventListenersForNodes(relevantEvents, inputs, bubbles);
+ var expected = [
+ {type: "mousemove", target: "blue", optional: true},
+ {type: "mousedown", target: "blue"},
+ {type: "mousemove", target: "blue", optional: true},
+ {type: "mouseup", target: "blue"},
+ {type: "click", target: "blue"},
+ {type: "mousemove", target: "blue", optional: true},
+ {type: "mousedown", target: "blue"},
+ {type: "mousemove", target: "blue", optional: true},
+ {type: "mouseup", target: "blue"},
+ {type: "click", target: "blue"},
+ {type: "dblclick", target: "blue"},
+ {type: "mousemove", target: "blue", optional: true}
+ ];
+
+ async_test(function(t) {
+ document.getElementById("done").addEventListener("click", function () {
+ t.step(function () {
+ assert_true(EventRecorder.checkRecords(expected));
+ t.done();
+ });
+ }, false);
+ }, "Click-related events should fire in the correct order");
+ EventRecorder.start();
+};
+ </script>
+</html>
diff --git a/tests/wpt/web-platform-tests/uievents/order-of-events/mouse-events/mousemove-across-manual.html b/tests/wpt/web-platform-tests/uievents/order-of-events/mouse-events/mousemove-across-manual.html
new file mode 100644
index 00000000000..8b0e7171a54
--- /dev/null
+++ b/tests/wpt/web-platform-tests/uievents/order-of-events/mouse-events/mousemove-across-manual.html
@@ -0,0 +1,134 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Mousemove handling across elements</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/uievents/resources/eventrecorder.js"></script>
+<style>
+#a {
+ background: red;
+ height: 120px;
+ width: 200px;
+}
+#b {
+ margin: 100px;
+ height: 120px;
+ width: 200px;
+ background: green;
+}
+#c {
+ height: 120px;
+ width: 200px;
+ background: yellow;
+}
+
+#a1 {
+ background: blue;
+ height: 120px;
+ width: 200px;
+}
+#b1 {
+ padding: 1px;
+ margin: 100px;
+ height: 120px;
+ width: 200px;
+ background: green;
+}
+#c1 {
+ height: 120px;
+ width: 200px;
+ background: black;
+}
+</style>
+<p>
+ Steps:
+ <ol>
+ <li>Move your mouse across the yellow/red <code>&lt;div&gt;</code> element quickly from right to left.
+ <li>Move your mouse across the black/blue <code>&lt;div&gt;</code> element quickly from right to left.
+ <li>If the test fails, redo it again and move faster on the black/blue <code>&lt;div&gt;</code> element next time.
+ </ol>
+</p>
+
+<div id="c">
+ <div id="b">
+ <div id="a" align="center"></div>
+ </div>
+</div>
+<br />
+<div id="c1">
+ <div id="b1">
+ <div id="a1" align="center"></div>
+ </div>
+</div>
+
+<script>
+setup({explicit_timeout: true});
+var relevantEvents = [
+ "mousemove",
+ "mouseover",
+ "mouseenter",
+ "mouseout",
+ "mouseleave"
+];
+
+function stopPropagation(e) {
+ event.stopPropagation();
+}
+
+window.onload = function() {
+ var a = document.getElementById("a");
+ var b = document.getElementById("b");
+ var c = document.getElementById("c");
+ var a1 = document.getElementById("a1");
+ var b1 = document.getElementById("b1");
+ var c1 = document.getElementById("c1");
+ var inputs = [a, b, c, a1, b1, c1];
+ EventRecorder.configure({
+ mergeEventTypes: ["mousemove"],
+ objectMap: {
+ "a": a,
+ "b": b,
+ "c": c,
+ "a1": a1,
+ "b1": b1,
+ "c1": c1
+ }
+ });
+ EventRecorder.addEventListenersForNodes(relevantEvents, inputs, stopPropagation);
+ var expected = [
+ {type: "mouseover", target: "a"},
+ {type: "mouseenter", target: "c"},
+ {type: "mouseenter", target: "b"},
+ {type: "mouseenter", target: "a"},
+ {type: "mousemove", target: "a", optional: true},
+ {type: "mouseout", target: "a"},
+ {type: "mouseleave", target: "a"},
+ {type: "mouseleave", target: "b"},
+ {type: "mouseover", target: "c"},
+ {type: "mousemove", target: "c", optional: true},
+ {type: "mouseout", target: "c"},
+ {type: "mouseleave", target: "c"},
+ {type: "mouseover", target: "a1"},
+ {type: "mouseenter", target: "c1"},
+ {type: "mouseenter", target: "b1"},
+ {type: "mouseenter", target: "a1"},
+ {type: "mousemove", target: "a1", optional: true},
+ {type: "mouseout", target: "a1"},
+ {type: "mouseleave", target: "a1"},
+ {type: "mouseleave", target: "b1"},
+ {type: "mouseover", target: "c1"},
+ {type: "mousemove", target: "c1", optional: true},
+ {type: "mouseout", target: "c1"},
+ {type: "mouseleave", target: "c1"},
+ ];
+ async_test(function(t) {
+ c1.addEventListener("mouseleave", function() {
+ t.step(function() {
+ assert_true(EventRecorder.checkRecords(expected));
+ t.done();
+ });
+ }, false);
+ }, "Mousemove events across elements should fire in the correct order.");
+ EventRecorder.start();
+};
+</script>
diff --git a/tests/wpt/web-platform-tests/uievents/order-of-events/mouse-events/mousemove-between-manual.html b/tests/wpt/web-platform-tests/uievents/order-of-events/mouse-events/mousemove-between-manual.html
new file mode 100644
index 00000000000..89b5db92ca9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/uievents/order-of-events/mouse-events/mousemove-between-manual.html
@@ -0,0 +1,106 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Mousemove handling between elements</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/uievents/resources/eventrecorder.js"></script>
+<style>
+#a {
+ height: 120px;
+ width: 200px;
+ background: blue;
+ display: flex;
+ justify-content: center;
+}
+#b {
+ height: 60px;
+ width: 100px;
+ margin: auto;
+ background: green;
+}
+#c {
+ height: 120px;
+ width: 200px;
+ background: yellow;
+}
+</style>
+<p>
+ Steps:
+
+ <ol>
+ <li>Move your mouse over the blue <code>&lt;div&gt;</code> element, later
+ over the green one, later back to the blue one.
+ <li>Move the mouse from the blue element to the yellow one, later to the
+ white background.
+ </ol>
+</p>
+
+
+<div id="a">
+ <div id="b" align="center"></div>
+</div>
+<div id="c"></div>
+
+<script>
+setup({explicit_timeout: true});
+
+var relevantEvents = [
+ "mousemove",
+ "mouseover",
+ "mouseenter",
+ "mouseout",
+ "mouseleave"
+];
+
+function stopPropagation(e) {
+ if (e.type != "mouseenter" && e.type != "mouseleave")
+ assert_true(e.bubbles);
+ event.stopPropagation();
+}
+
+window.onload = function() {
+ var a = document.getElementById("a");
+ var b = document.getElementById("b");
+ var c = document.getElementById("c");
+ var inputs = [a, b, c];
+ EventRecorder.configure({
+ mergeEventTypes: ["mousemove"],
+ objectMap: {
+ "a": a,
+ "b": b,
+ "c": c
+ }
+ });
+ EventRecorder.addEventListenersForNodes(relevantEvents, inputs, stopPropagation);
+ var expected = [
+ {type: "mouseover", target: "a"},
+ {type: "mouseenter", target: "a"},
+ {type: "mousemove", target: "a", optional: true},
+ {type: "mouseout", target: "a"},
+ {type: "mouseover", target: "b"},
+ {type: "mouseenter", target: "b"},
+ {type: "mousemove", target: "b", optional: true},
+ {type: "mouseout", target: "b"},
+ {type: "mouseleave", target: "b"},
+ {type: "mouseover", target: "a"},
+ {type: "mousemove", target: "a", optional: true},
+ {type: "mouseout", target: "a"},
+ {type: "mouseleave", target: "a"},
+ {type: "mouseover", target: "c"},
+ {type: "mouseenter", target: "c"},
+ {type: "mousemove", target: "c", optional: true},
+ {type: "mouseout", target: "c"},
+ {type: "mouseleave", target: "c"}
+ ];
+ async_test(function(t) {
+ c.addEventListener("mouseleave", function() {
+ EventRecorder.stop();
+ t.step(function() {
+ assert_true(EventRecorder.checkRecords(expected));
+ t.done();
+ });
+ }, false);
+ }, "Mousemove events between elements should fire in the correct order.");
+ EventRecorder.start();
+};
+</script>
diff --git a/tests/wpt/web-platform-tests/uievents/resources/eventrecorder.js b/tests/wpt/web-platform-tests/uievents/resources/eventrecorder.js
index 936b136d8b3..649930b42cb 100644
--- a/tests/wpt/web-platform-tests/uievents/resources/eventrecorder.js
+++ b/tests/wpt/web-platform-tests/uievents/resources/eventrecorder.js
@@ -140,6 +140,31 @@
getRecords: {
enumerable: true, configurable: true, writable: true, value: function getRecords() { return allRecords; }
},
+ checkRecords: {
+ enumerable: true, configurable: true, writable: true, value: function checkRecords(expected) {
+ if (expected.length < allRecords.length) {
+ return false;
+ }
+ var j = 0;
+ for (var i = 0; i < expected.length; ++i) {
+ if (j >= allRecords.length) {
+ if (expected[i].optional) {
+ continue;
+ }
+ return false;
+ }
+ if (expected[i].type == allRecords[j].event.type && expected[i].target == allRecords[j].event.currentTarget) {
+ ++j;
+ continue;
+ }
+ if (expected[i].optional) {
+ continue;
+ }
+ return false;
+ }
+ return true;
+ }
+ },
configure: {
enumerable: true, configurable: true, writable: true, value: function configure(options) {
if (allRecords.length > 0)
@@ -168,6 +193,15 @@
}
}
}
+ },
+ addEventListenersForNodes: {
+ enumerable: true, configurable: true, writable: true, value: function addEventListenersForNodes(events, nodes, handler) {
+ for (var i = 0; i < nodes.length; ++i) {
+ for (var j = 0; j < events.length; ++j) {
+ nodes[i].addRecordedEventListener(events[j], handler);
+ }
+ }
+ }
}
})
});
diff --git a/tests/wpt/web-platform-tests/url/setters_tests.json b/tests/wpt/web-platform-tests/url/setters_tests.json
index a62210ec6b3..4d650e64bb1 100644
--- a/tests/wpt/web-platform-tests/url/setters_tests.json
+++ b/tests/wpt/web-platform-tests/url/setters_tests.json
@@ -346,14 +346,14 @@
}
},
{
- "comment": "Port number is removed if empty in the new value",
+ "comment": "Port number is unchanged if not specified",
"href": "http://example.net:8080",
"new_value": "example.com:",
"expected": {
- "href": "http://example.com/",
- "host": "example.com",
+ "href": "http://example.com:8080/",
+ "host": "example.com:8080",
"hostname": "example.com",
- "port": ""
+ "port": "8080"
}
},
{
@@ -761,7 +761,7 @@
}
},
{
- "comment": "Port number is removed if empty in the new value",
+ "comment": "Port number is removed if empty is the new value",
"href": "http://example.net:8080",
"new_value": "",
"expected": {
@@ -973,6 +973,15 @@
"href": "http://example.net/..%c3%89t%C3%A9",
"pathname": "/..%c3%89t%C3%A9"
}
+ },
+ {
+ "comment": "? needs to be encoded",
+ "href": "http://example.net",
+ "new_value": "?",
+ "expected": {
+ "href": "http://example.net/%3F",
+ "pathname": "/%3F"
+ }
}
],
"search": [
diff --git a/tests/wpt/web-platform-tests/url/url-setters.html b/tests/wpt/web-platform-tests/url/url-setters.html
index 32f52ee79a6..b8b8ee5c769 100644
--- a/tests/wpt/web-platform-tests/url/url-setters.html
+++ b/tests/wpt/web-platform-tests/url/url-setters.html
@@ -37,7 +37,23 @@ function runURLSettersTests(all_test_cases) {
for (var attribute in test_case.expected) {
assert_equals(url[attribute], test_case.expected[attribute])
}
- }, name)
+ }, "URL: " + name)
+ test(function() {
+ var url = document.createElement("a");
+ url.href = test_case.href;
+ url[attribute_to_be_set] = test_case.new_value;
+ for (var attribute in test_case.expected) {
+ assert_equals(url[attribute], test_case.expected[attribute])
+ }
+ }, "<a>: " + name)
+ test(function() {
+ var url = document.createElement("area");
+ url.href = test_case.href;
+ url[attribute_to_be_set] = test_case.new_value;
+ for (var attribute in test_case.expected) {
+ assert_equals(url[attribute], test_case.expected[attribute])
+ }
+ }, "<area>: " + name)
}
}
}
diff --git a/tests/wpt/web-platform-tests/url/urltestdata.json b/tests/wpt/web-platform-tests/url/urltestdata.json
index f5a915f874b..ed7c1de379d 100644
--- a/tests/wpt/web-platform-tests/url/urltestdata.json
+++ b/tests/wpt/web-platform-tests/url/urltestdata.json
@@ -841,6 +841,36 @@
"hash": ""
},
{
+ "input": "http://[::127.0.0.1]",
+ "base": "http://example.org/foo/bar",
+ "href": "http://[::7f00:1]/",
+ "origin": "http://[::7f00:1]",
+ "protocol": "http:",
+ "username": "",
+ "password": "",
+ "host": "[::7f00:1]",
+ "hostname": "[::7f00:1]",
+ "port": "",
+ "pathname": "/",
+ "search": "",
+ "hash": ""
+ },
+ {
+ "input": "http://[0:0:0:0:0:0:13.1.68.3]",
+ "base": "http://example.org/foo/bar",
+ "href": "http://[::d01:4403]/",
+ "origin": "http://[::d01:4403]",
+ "protocol": "http:",
+ "username": "",
+ "password": "",
+ "host": "[::d01:4403]",
+ "hostname": "[::d01:4403]",
+ "port": "",
+ "pathname": "/",
+ "search": "",
+ "hash": ""
+ },
+ {
"input": "http://[2001::1]:80",
"base": "http://example.org/foo/bar",
"href": "http://[2001::1]/",
diff --git a/tests/wpt/web-platform-tests/web-animations/animation-model/keyframe-effects/spacing-keyframes.html b/tests/wpt/web-platform-tests/web-animations/animation-model/keyframe-effects/spacing-keyframes.html
index 14dc32bf57e..90e26d276d8 100644
--- a/tests/wpt/web-platform-tests/web-animations/animation-model/keyframe-effects/spacing-keyframes.html
+++ b/tests/wpt/web-platform-tests/web-animations/animation-model/keyframe-effects/spacing-keyframes.html
@@ -322,7 +322,70 @@ test(function(t) {
'and falling back to distribute spacing for the reset with some specific ' +
'offsets');
-// Bug 1276193: Test for mixing percent and pixel values.
+// Tests for setting spacing by KeyframeEffect.spacing.
+
+test(function(t) {
+ var anim = createDiv(t).animate([ { marginLeft: '0px' },
+ { marginLeft: '-20px' },
+ { marginLeft: '100px' },
+ { marginLeft: '50px' } ],
+ { duration: 100 * MS_PER_SEC });
+
+ anim.effect.spacing = 'paced(margin-left)';
+
+ var frames = anim.effect.getKeyframes();
+ var cumDist = [0, 20, 140, 190];
+ assert_equals(frames[0].computedOffset, 0.0,
+ '1st frame offset');
+ assert_equals(frames[1].computedOffset, cumDist[1] / cumDist[3],
+ '2nd frame offset');
+ assert_equals(frames[2].computedOffset, cumDist[2] / cumDist[3],
+ '3rd frame offset');
+ assert_equals(frames[3].computedOffset, 1.0,
+ 'last frame offset');
+}, 'Test paced spacing by setter');
+
+test(function(t) {
+ var anim = createDiv(t).animate([ { marginLeft: '0px' },
+ { marginLeft: '-20px' },
+ { marginLeft: '100px' },
+ { marginLeft: '50px' } ],
+ { duration: 100 * MS_PER_SEC,
+ spacing: 'paced(margin-left)' });
+
+ anim.effect.spacing = 'distribute';
+
+ var frames = anim.effect.getKeyframes();
+ var slots = frames.length - 1;
+ assert_equals(frames[0].computedOffset, 0.0, '1st frame offset');
+ assert_equals(frames[1].computedOffset, 1.0 / slots, '2nd frame offset');
+ assert_equals(frames[2].computedOffset, 2.0 / slots, '3rd frame offset');
+ assert_equals(frames[3].computedOffset, 1.0, 'last frame offset');
+}, 'Test distribute spacing by setter');
+
+test(function(t) {
+ var anim =
+ createDiv(t).animate([ { marginLeft: '0px', borderRadius: '0%' },
+ { marginLeft: '-20px', borderRadius: '50%' },
+ { marginLeft: '100px', borderRadius: '25%' },
+ { marginLeft: '50px', borderRadius: '100%' } ],
+ { duration: 100 * MS_PER_SEC,
+ spacing: 'paced(margin-left)' });
+
+ anim.effect.spacing = 'paced(border-radius)';
+
+ var frames = anim.effect.getKeyframes();
+ var cumDist = [0, 50, 50 + 25, 50 + 25 + 75];
+
+ assert_equals(frames[0].computedOffset, 0.0,
+ '1st frame offset');
+ assert_equals(frames[1].computedOffset, cumDist[1] / cumDist[3],
+ '2nd frame offset');
+ assert_equals(frames[2].computedOffset, cumDist[2] / cumDist[3],
+ '3rd frame offset');
+ assert_equals(frames[3].computedOffset, 1.0,
+ 'last frame offset');
+}, 'Test paced spacing by changing the paced property');
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/web-animations/interfaces/Animation/effect.html b/tests/wpt/web-platform-tests/web-animations/interfaces/Animation/effect.html
new file mode 100644
index 00000000000..d881a96a7dc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-animations/interfaces/Animation/effect.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Animation.effect tests</title>
+<link rel="help" href="https://w3c.github.io/web-animations/#dom-animation-effect">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../testcommon.js"></script>
+<body>
+<div id="log"></div>
+<script>
+"use strict";
+
+test(function(t) {
+ var anim = new Animation();
+ assert_equals(anim.effect, null, "initial effect is null");
+
+ var newEffect = new KeyframeEffectReadOnly(createDiv(t), null);
+ anim.effect = newEffect;
+ assert_equals(anim.effect, newEffect, "new effect is set");
+}, "effect is set correctly.");
+
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/web-animations/interfaces/Animation/id.html b/tests/wpt/web-platform-tests/web-animations/interfaces/Animation/id.html
index 9d293733756..2fadd562369 100644
--- a/tests/wpt/web-platform-tests/web-animations/interfaces/Animation/id.html
+++ b/tests/wpt/web-platform-tests/web-animations/interfaces/Animation/id.html
@@ -13,11 +13,16 @@
test(function(t) {
var div = createDiv(t);
var animation = div.animate({}, 100 * MS_PER_SEC);
- assert_equals(animation.id, '', 'id for CSS Animation is initially empty');
- animation.id = 'anim'
+ assert_equals(animation.id, '', 'id for Animation is initially empty');
+}, 'Animation.id initial value');
+
+test(function(t) {
+ var div = createDiv(t);
+ var animation = div.animate({}, 100 * MS_PER_SEC);
+ animation.id = 'anim';
assert_equals(animation.id, 'anim', 'animation.id reflects the value set');
-}, 'Animation.id for CSS Animations');
+}, 'Animation.id setter');
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/web-animations/interfaces/AnimationEffectTiming/getComputedStyle.html b/tests/wpt/web-platform-tests/web-animations/interfaces/AnimationEffectTiming/getComputedStyle.html
index 6ab4f14d7df..d6503a4314c 100644
--- a/tests/wpt/web-platform-tests/web-animations/interfaces/AnimationEffectTiming/getComputedStyle.html
+++ b/tests/wpt/web-platform-tests/web-animations/interfaces/AnimationEffectTiming/getComputedStyle.html
@@ -107,12 +107,8 @@ test(function(t) {
assert_equals(getComputedStyle(div).opacity, '0.5',
'set currentTime same as endTime');
- anim.currentTime = 9999;
- assert_equals(getComputedStyle(div).opacity, '0.5',
- 'set currentTime during duration');
-
anim.currentTime = 10000;
- assert_equals(getComputedStyle(div).opacity, '0.5',
+ assert_equals(getComputedStyle(div).opacity, '0',
'set currentTime after endTime');
}, 'change currentTime when fill forwards and endDelay is negative');
diff --git a/tests/wpt/web-platform-tests/web-animations/interfaces/AnimationTimeline/idlharness.html b/tests/wpt/web-platform-tests/web-animations/interfaces/AnimationTimeline/idlharness.html
index 04afcada07a..29c89140772 100644
--- a/tests/wpt/web-platform-tests/web-animations/interfaces/AnimationTimeline/idlharness.html
+++ b/tests/wpt/web-platform-tests/web-animations/interfaces/AnimationTimeline/idlharness.html
@@ -12,7 +12,10 @@ interface AnimationTimeline {
};
</script>
<script type="text/plain" id="DocumentTimeline-IDL">
-[Constructor (DOMHighResTimeStamp originTime)]
+dictionary DocumentTimelineOptions {
+ DOMHighResTimeStamp originTime = 0;
+};
+[Constructor (optional DocumentTimelineOptions options)]
interface DocumentTimeline : AnimationTimeline {
};
</script>
diff --git a/tests/wpt/web-platform-tests/web-animations/interfaces/DocumentTimeline/constructor.html b/tests/wpt/web-platform-tests/web-animations/interfaces/DocumentTimeline/constructor.html
index efdf1118e2e..8968ff4ce8e 100644
--- a/tests/wpt/web-platform-tests/web-animations/interfaces/DocumentTimeline/constructor.html
+++ b/tests/wpt/web-platform-tests/web-animations/interfaces/DocumentTimeline/constructor.html
@@ -11,24 +11,32 @@
"use strict";
test(function(t) {
- var timeline = new DocumentTimeline(0);
+ var timeline = new DocumentTimeline();
assert_times_equal(timeline.currentTime, document.timeline.currentTime);
-}, 'zero origin time');
+}, 'An origin time of zero is used when none is supplied');
test(function(t) {
- var timeline = new DocumentTimeline(10 * MS_PER_SEC);
+ var timeline = new DocumentTimeline({ originTime: 0 });
+ assert_times_equal(timeline.currentTime, document.timeline.currentTime);
+}, 'A zero origin time produces a document timeline with a current time ' +
+ 'identical to the default document timeline');
+
+test(function(t) {
+ var timeline = new DocumentTimeline({ originTime: 10 * MS_PER_SEC });
assert_times_equal(timeline.currentTime,
(document.timeline.currentTime - 10 * MS_PER_SEC));
-}, 'positive origin time');
+}, 'A positive origin time makes the document timeline\'s current time lag ' +
+ 'behind the default document timeline');
test(function(t) {
- var timeline = new DocumentTimeline(-10 * MS_PER_SEC);
+ var timeline = new DocumentTimeline({ originTime: -10 * MS_PER_SEC });
assert_times_equal(timeline.currentTime,
(document.timeline.currentTime + 10 * MS_PER_SEC));
-}, 'negative origin time');
+}, 'A negative origin time makes the document timeline\'s current time run ' +
+ 'ahead of the default document timeline');
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/getComputedTiming.html b/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/getComputedTiming.html
index f3370aabd7c..4d799272b9a 100644
--- a/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/getComputedTiming.html
+++ b/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/getComputedTiming.html
@@ -189,10 +189,10 @@ var gEndTimeTests = [
{ desc: "an non-zero duration and negative delay greater than active " +
"duration",
input: { duration: 1000, iterations: 2, delay: -3000 },
- expected: -1000 },
+ expected: 0 },
{ desc: "a zero duration and negative delay",
input: { duration: 0, iterations: 2, delay: -1000 },
- expected: -1000 }
+ expected: 0 }
];
gEndTimeTests.forEach(function(stest) {
diff --git a/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/iterationComposite.html b/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/iterationComposite.html
new file mode 100644
index 00000000000..743d1088783
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/iterationComposite.html
@@ -0,0 +1,693 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>KeyframeEffect.iterationComposite tests</title>
+<link rel="help" href="https://w3c.github.io/web-animations/#effect-accumulation-section">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="../../testcommon.js"></script>
+<div id="log"></div>
+<script>
+'use strict';
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim =
+ div.animate({ marginLeft: ['0px', '10px'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).marginLeft, '5px',
+ 'Animated margin-left style at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).marginLeft, '20px',
+ 'Animated margin-left style at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).marginLeft, '25px',
+ 'Animated margin-left style at 50s of the third iteration');
+}, 'iterationComposite of <length> type animation');
+
+test(function(t) {
+ var parent = createDiv(t);
+ parent.style.width = '100px';
+ var div = createDiv(t);
+ parent.appendChild(div);
+
+ var anim =
+ div.animate({ width: ['0%', '50%'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).width, '25px',
+ 'Animated width style at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).width, '100px',
+ 'Animated width style at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).width, '125px',
+ 'Animated width style at 50s of the third iteration');
+}, 'iterationComposite of <percentage> type animation');
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim =
+ div.animate({ color: ['rgb(0, 0, 0)', 'rgb(120, 120, 120)'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).color, 'rgb(60, 60, 60)',
+ 'Animated color style at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).color, 'rgb(240, 240, 240)',
+ 'Animated color style at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).color, 'rgb(255, 255, 255)',
+ 'Animated color style at 50s of the third iteration');
+}, 'iterationComposite of <color> type animation');
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim =
+ div.animate({ color: ['rgb(0, 120, 0)', 'rgb(60, 60, 60)'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).color, 'rgb(30, 90, 30)',
+ 'Animated color style at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).color, 'rgb(120, 240, 120)',
+ 'Animated color style at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ // The green color is (240 + 180) / 2 = 210
+ assert_equals(getComputedStyle(div).color, 'rgb(150, 210, 150)',
+ 'Animated color style at 50s of the third iteration');
+}, 'iterationComposite of <color> type animation that green component is ' +
+ 'decreasing');
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim =
+ div.animate({ flexGrow: [0, 10] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).flexGrow, '5',
+ 'Animated flex-grow style at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).flexGrow, '20',
+ 'Animated flex-grow style at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).flexGrow, '25',
+ 'Animated flex-grow style at 50s of the third iteration');
+}, 'iterationComposite of <number> type animation');
+
+test(function(t) {
+ var div = createDiv(t);
+ div.style.position = 'absolute';
+ var anim =
+ div.animate({ clip: ['rect(0px, 0px, 0px, 0px)',
+ 'rect(10px, 10px, 10px, 10px)'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).clip, 'rect(5px, 5px, 5px, 5px)',
+ 'Animated clip style at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).clip, 'rect(20px, 20px, 20px, 20px)',
+ 'Animated clip style at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).clip, 'rect(25px, 25px, 25px, 25px)',
+ 'Animated clip style at 50s of the third iteration');
+}, 'iterationComposite of <shape> type animation');
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim =
+ div.animate({ width: ['calc(0vw + 0px)', 'calc(0vw + 10px)'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).width, '5px',
+ 'Animated calc width style at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).width, '20px',
+ 'Animated calc width style at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).width, '25px',
+ 'Animated calc width style at 50s of the third iteration');
+}, 'iterationComposite of <calc()> value animation');
+
+test(function(t) {
+ var parent = createDiv(t);
+ parent.style.width = '100px';
+ var div = createDiv(t);
+ parent.appendChild(div);
+
+ var anim =
+ div.animate({ width: ['calc(0% + 0px)', 'calc(10% + 10px)'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).width, '10px',
+ // 100px * 5% + 5px
+ 'Animated calc width style at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).width,
+ '40px', // 100px * (10% + 10%) + (10px + 10px)
+ 'Animated calc width style at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).width,
+ '50px', // (40px + 60px) / 2
+ 'Animated calc width style at 50s of the third iteration');
+}, 'iterationComposite of <calc()> value animation that the values can\'t' +
+ 'be reduced');
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim =
+ div.animate({ opacity: [0, 0.4] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).opacity, '0.2',
+ 'Animated opacity style at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).opacity, '0.8',
+ 'Animated opacity style at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).opacity, '1', // (0.8 + 1.2) * 0.5
+ 'Animated opacity style at 50s of the third iteration');
+}, 'iterationComposite of opacity animation');
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim =
+ div.animate({ boxShadow: ['rgb(0, 0, 0) 0px 0px 0px 0px',
+ 'rgb(120, 120, 120) 10px 10px 10px 0px'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).boxShadow,
+ 'rgb(60, 60, 60) 5px 5px 5px 0px',
+ 'Animated box-shadow style at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).boxShadow,
+ 'rgb(240, 240, 240) 20px 20px 20px 0px',
+ 'Animated box-shadow style at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).boxShadow,
+ 'rgb(255, 255, 255) 25px 25px 25px 0px',
+ 'Animated box-shadow style at 50s of the third iteration');
+}, 'iterationComposite of box-shadow animation');
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim =
+ div.animate({ filter: ['blur(0px)', 'blur(10px)'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).filter, 'blur(5px)',
+ 'Animated filter blur style at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).filter, 'blur(20px)',
+ 'Animated filter blur style at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).filter, 'blur(25px)',
+ 'Animated filter blur style at 50s of the third iteration');
+}, 'iterationComposite of filter blur animation');
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim =
+ div.animate({ filter: ['brightness(1)',
+ 'brightness(180%)'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).filter,
+ 'brightness(1.4)',
+ 'Animated filter brightness style at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).filter,
+ 'brightness(2.6)', // brightness(1) + brightness(0.8) + brightness(0.8)
+ 'Animated filter brightness style at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).filter,
+ 'brightness(3)', // (brightness(2.6) + brightness(3.4)) * 0.5
+ 'Animated filter brightness style at 50s of the third iteration');
+}, 'iterationComposite of filter brightness for different unit animation');
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim =
+ div.animate({ filter: ['brightness(0)',
+ 'brightness(1)'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).filter,
+ 'brightness(0.5)',
+ 'Animated filter brightness style at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).filter,
+ 'brightness(0)', // brightness(1) is an identity element, not accumulated.
+ 'Animated filter brightness style at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).filter,
+ 'brightness(0.5)', // brightness(1) is an identity element, not accumulated.
+ 'Animated filter brightness style at 50s of the third iteration');
+}, 'iterationComposite of filter brightness animation');
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim =
+ div.animate({ filter: ['drop-shadow(rgb(0, 0, 0) 0px 0px 0px)',
+ 'drop-shadow(rgb(120, 120, 120) 10px 10px 10px)'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).filter,
+ 'drop-shadow(rgb(60, 60, 60) 5px 5px 5px)',
+ 'Animated filter drop-shadow style at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).filter,
+ 'drop-shadow(rgb(240, 240, 240) 20px 20px 20px)',
+ 'Animated filter drop-shadow style at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).filter,
+ 'drop-shadow(rgb(255, 255, 255) 25px 25px 25px)',
+ 'Animated filter drop-shadow style at 50s of the third iteration');
+}, 'iterationComposite of filter drop-shadow animation');
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim =
+ div.animate({ filter: ['brightness(1) contrast(1)',
+ 'brightness(2) contrast(2)'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).filter,
+ 'brightness(1.5) contrast(1.5)',
+ 'Animated filter list at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).filter,
+ 'brightness(3) contrast(3)',
+ 'Animated filter list at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).filter,
+ 'brightness(3.5) contrast(3.5)',
+ 'Animated filter list at 50s of the third iteration');
+}, 'iterationComposite of same filter list animation');
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim =
+ div.animate({ filter: ['brightness(1) contrast(1)',
+ 'contrast(2) brightness(2)'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).filter,
+ 'contrast(2) brightness(2)', // discrete
+ 'Animated filter list at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).filter,
+ // We can't accumulate 'contrast(2) brightness(2)' onto
+ // the first list 'brightness(1) contrast(1)' because of
+ // mismatch of the order.
+ 'brightness(1) contrast(1)',
+ 'Animated filter list at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).filter,
+ // We *can* accumulate 'contrast(2) brightness(2)' onto
+ // the same list 'contrast(2) brightness(2)' here.
+ 'contrast(4) brightness(4)', // discrete
+ 'Animated filter list at 50s of the third iteration');
+}, 'iterationComposite of discrete filter list because of mismatch ' +
+ 'of the order');
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim =
+ div.animate({ filter: ['sepia(0)',
+ 'sepia(1) contrast(2)'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).filter,
+ 'sepia(0.5) contrast(1.5)',
+ 'Animated filter list at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).filter,
+ 'sepia(2) contrast(3)',
+ 'Animated filter list at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).filter,
+ 'sepia(2.5) contrast(3.5)',
+ 'Animated filter list at 50s of the third iteration');
+}, 'iterationComposite of different length filter list animation');
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim =
+ div.animate({ transform: ['rotate(0deg)', 'rotate(180deg)'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).transform,
+ 'matrix(0, 1, -1, 0, 0, 0)', // rotate(90deg)
+ 'Animated transform(rotate) style at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).transform,
+ 'matrix(1, 0, 0, 1, 0, 0)', // rotate(360deg)
+ 'Animated transform(rotate) style at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).transform,
+ 'matrix(0, 1, -1, 0, 0, 0)', // rotate(450deg)
+ 'Animated transform(rotate) style at 50s of the third iteration');
+}, 'iterationComposite of transform(rotate) animation');
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim =
+ div.animate({ transform: ['scale(0)', 'scale(1)'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).transform,
+ 'matrix(0.5, 0, 0, 0.5, 0, 0)', // scale(0.5)
+ 'Animated transform(scale) style at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).transform,
+ 'matrix(0, 0, 0, 0, 0, 0)', // scale(0); scale(1) is an identity element,
+ // not accumulated.
+ 'Animated transform(scale) style at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).transform,
+ 'matrix(0.5, 0, 0, 0.5, 0, 0)', // scale(0.5); scale(1) an identity
+ // element, not accumulated.
+ 'Animated transform(scale) style at 50s of the third iteration');
+}, 'iterationComposite of transform: [ scale(0), scale(1) ] animation');
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim =
+ div.animate({ transform: ['scale(1)', 'scale(2)'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).transform,
+ 'matrix(1.5, 0, 0, 1.5, 0, 0)', // scale(1.5)
+ 'Animated transform(scale) style at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).transform,
+ 'matrix(3, 0, 0, 3, 0, 0)', // scale(1 + (2 -1) + (2 -1))
+ 'Animated transform(scale) style at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).transform,
+ 'matrix(3.5, 0, 0, 3.5, 0, 0)', // (scale(3) + scale(4)) * 0.5
+ 'Animated transform(scale) style at 50s of the third iteration');
+}, 'iterationComposite of transform: [ scale(1), scale(2) ] animation');
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim =
+ div.animate({ transform: ['scale(0)', 'scale(2)'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).transform,
+ 'matrix(1, 0, 0, 1, 0, 0)', // scale(1)
+ 'Animated transform(scale) style at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).transform,
+ 'matrix(2, 0, 0, 2, 0, 0)', // (scale(0) + scale(2-1)*2)
+ 'Animated transform(scale) style at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).transform,
+ 'matrix(3, 0, 0, 3, 0, 0)', // (scale(2) + scale(4)) * 0.5
+ 'Animated transform(scale) style at 50s of the third iteration');
+}, 'iterationComposite of transform: scale(2) animation');
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim =
+ div.animate({ transform: ['rotate(0deg) translateX(0px)',
+ 'rotate(180deg) translateX(10px)'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).transform,
+ 'matrix(0, 1, -1, 0, 0, 5)', // rotate(90deg) translateX(5px)
+ 'Animated transform list at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).transform,
+ 'matrix(1, 0, 0, 1, 20, 0)', // rotate(360deg) translateX(20px)
+ 'Animated transform list at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).transform,
+ 'matrix(0, 1, -1, 0, 0, 25)', // rotate(450deg) translateX(25px)
+ 'Animated transform list at 50s of the third iteration');
+}, 'iterationComposite of transform list animation');
+
+test(function(t) {
+ var div = createDiv(t);
+ // The transform list whose order is mismatched is compounded,
+ // so below animation is the same as;
+ // from matrix(2, 0, 0, 2, 0, 0) to matrix(3, 0, 0, 3, 30, 0)
+ var anim =
+ div.animate({ transform: ['translateX(0px) scale(2)',
+ 'scale(3) translateX(10px)'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).transform,
+ 'matrix(2.5, 0, 0, 2.5, 15, 0)', // scale(2.5) (0px + 30px*2) / 2
+ 'Animated transform list at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).transform,
+ 'matrix(4, 0, 0, 4, 60, 0)', // scale(2+(3-2)*2) (0px + 30px*2)
+ 'Animated transform list at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).transform,
+ 'matrix(5.5, 0, 0, 5.5, 135, 0)', // scale(4+7)/2 (60px + 210px)
+ 'Animated transform list at 50s of the third iteration');
+}, 'iterationComposite of transform list animation whose order is mismatched');
+
+test(function(t) {
+ var div = createDiv(t);
+ // Even if each transform list does not have functions which exist in
+ // other pair of the list, we don't fill any missing functions at all,
+ // it's just computed as compounded matrices
+ // Below animation is the same as;
+ // from matrix(1, 0, 0, 1, 0, 0) to matrix(2, 0, 0, 2, 20, 0)
+ var anim =
+ div.animate({ transform: ['translateX(0px)',
+ 'scale(2) translateX(10px)'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).transform,
+ 'matrix(1.5, 0, 0, 1.5, 10, 0)', // scale(1.5) (0px + 10px*2) / 2
+ 'Animated transform list at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).transform,
+ 'matrix(3, 0, 0, 3, 40, 0)', // scale(1+(2-1)*2) (0px + 20px*2)
+ 'Animated transform list at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).transform,
+ 'matrix(3.5, 0, 0, 3.5, 80, 0)', // scale(3+4)/2 (40px + 20px)
+ 'Animated transform list at 50s of the third iteration');
+}, 'iterationComposite of transform list animation whose order is mismatched');
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim =
+ div.animate({ marginLeft: ['10px', '20px'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).marginLeft, '15px',
+ 'Animated margin-left style at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).marginLeft, '50px', // 10px + 20px + 20px
+ 'Animated margin-left style at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).marginLeft, '55px', // (50px + 60px) * 0.5
+ 'Animated margin-left style at 50s of the third iteration');
+}, 'iterationComposite starts with non-zero value animation');
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim =
+ div.animate({ marginLeft: ['10px', '-10px'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime = anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).marginLeft,
+ '0px',
+ 'Animated margin-left style at 50s of the first iteration');
+ anim.currentTime = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).marginLeft,
+ '-10px', // 10px + -10px + -10px
+ 'Animated margin-left style at 0s of the third iteration');
+ anim.currentTime += anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).marginLeft,
+ '-20px', // (-10px + -30px) * 0.5
+ 'Animated margin-left style at 50s of the third iteration');
+}, 'iterationComposite with negative final value animation');
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim = div.animate({ marginLeft: ['0px', '10px'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime =
+ anim.effect.timing.duration * 2 + anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).marginLeft, '25px',
+ 'Animated style at 50s of the third iteration');
+
+ anim.effect.iterationComposite = 'replace';
+ assert_equals(getComputedStyle(div).marginLeft, '5px',
+ 'Animated style at 50s of the third iteration');
+
+ anim.effect.iterationComposite = 'accumulate';
+ assert_equals(getComputedStyle(div).marginLeft, '25px',
+ 'Animated style at 50s of the third iteration');
+}, 'interationComposite changes');
+
+test(function(t) {
+ var div = createDiv(t);
+ var anim = div.animate({ marginLeft: ['0px', '10px'] },
+ { duration: 100 * MS_PER_SEC,
+ easing: 'linear',
+ iterations: 10,
+ iterationComposite: 'accumulate' });
+ anim.pause();
+
+ anim.currentTime =
+ anim.effect.timing.duration * 2 + anim.effect.timing.duration / 2;
+ assert_equals(getComputedStyle(div).marginLeft, '25px',
+ 'Animated style at 50s of the third iteration');
+
+ // double its duration.
+ anim.effect.timing.duration = anim.effect.timing.duration * 2;
+ assert_equals(getComputedStyle(div).marginLeft, '12.5px',
+ 'Animated style at 25s of the first iteration');
+
+ // half of original.
+ anim.effect.timing.duration = anim.effect.timing.duration / 4;
+ assert_equals(getComputedStyle(div).marginLeft, '50px',
+ 'Animated style at 50s of the fourth iteration');
+}, 'duration changes with iterationComposite(accumulate)');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/spacing.html b/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/spacing.html
new file mode 100644
index 00000000000..612a3af8d9e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/spacing.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>KeyframeEffect spacing attribute tests</title>
+<link rel="help"
+ href="https://w3c.github.io/web-animations/#dom-keyframeeffect-spacing">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../testcommon.js"></script>
+<body>
+<div id="log"></div>
+<script>
+"use strict";
+
+test(function(t) {
+ var anim = createDiv(t).animate(null);
+ assert_throws(new TypeError, function() {
+ anim.effect.spacing = '';
+ });
+}, 'Test throwing TypeError if using empty string');
+
+test(function(t) {
+ var anim = createDiv(t).animate(null);
+ assert_throws(new TypeError, function() {
+ anim.effect.spacing = 'dist';
+ });
+}, 'Test throwing TypeError if not using the correct keyword');
+
+test(function(t) {
+ var anim = createDiv(t).animate(null);
+ anim.effect.spacing = 'paced(A)';
+ assert_equals(anim.effect.spacing, 'distribute', 'spacing mode');
+}, 'Test falling back to distribute spacing if using a unrecognized property');
+
+test(function(t) {
+ var anim = createDiv(t).animate(null);
+ anim.effect.spacing = 'paced(--bg-color)';
+ assert_equals(anim.effect.spacing, 'distribute', 'spacing mode');
+}, 'Test falling back to distribute spacing if using CSS variables');
+
+test(function(t) {
+ var anim = createDiv(t).animate(null);
+ anim.effect.spacing = 'paced(animation-duration)';
+ assert_equals(anim.effect.spacing, 'distribute', 'spacing mode');
+}, 'Test falling back to distribute spacing if using a non-animatable ' +
+ 'property');
+
+test(function(t) {
+ var anim = createDiv(t).animate(null);
+ anim.effect.spacing = 'distribute';
+ assert_equals(anim.effect.spacing, 'distribute', 'spacing mode');
+}, 'Test spacing value if setting distribute');
+
+test(function(t) {
+ var anim = createDiv(t).animate(null);
+ anim.effect.spacing = 'paced(transform)';
+ assert_equals(anim.effect.spacing, 'paced(transform)', 'spacing mode');
+}, 'Test spacing value if setting paced');
+
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/web-animations/testcommon.js b/tests/wpt/web-platform-tests/web-animations/testcommon.js
index e375a0f8741..31ebdfaf279 100644
--- a/tests/wpt/web-platform-tests/web-animations/testcommon.js
+++ b/tests/wpt/web-platform-tests/web-animations/testcommon.js
@@ -158,3 +158,19 @@ function waitForAnimationFrames(frameCount) {
window.requestAnimationFrame(handleFrame);
});
}
+
+// Continually calls requestAnimationFrame until |minDelay| has elapsed
+// as recorded using document.timeline.currentTime (i.e. frame time not
+// wall-clock time).
+function waitForAnimationFramesWithDelay(minDelay) {
+ var startTime = document.timeline.currentTime;
+ return new Promise(function(resolve) {
+ (function handleFrame() {
+ if (document.timeline.currentTime - startTime >= minDelay) {
+ resolve();
+ } else {
+ window.requestAnimationFrame(handleFrame);
+ }
+ }());
+ });
+}
diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animation-effects/active-time.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animation-effects/active-time.html
index 37b7f8abae2..bdaad08edd4 100644
--- a/tests/wpt/web-platform-tests/web-animations/timing-model/animation-effects/active-time.html
+++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animation-effects/active-time.html
@@ -100,7 +100,7 @@ test(function(t) {
var anim = createDiv(t).animate(null, { duration: 1000,
iterations: 2.3,
delay: 500,
- endDelay: -3000,
+ endDelay: -2500,
fill: 'forwards' });
anim.finish();
assert_equals(anim.effect.getComputedTiming().currentIteration, 0);
diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animation-effects/phases-and-states.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animation-effects/phases-and-states.html
index 22d4eb3bd37..5dc32066fea 100644
--- a/tests/wpt/web-platform-tests/web-animations/timing-model/animation-effects/phases-and-states.html
+++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animation-effects/phases-and-states.html
@@ -73,7 +73,7 @@ test(function(t) {
var animation = createDiv(t).animate(null, { duration: 1, delay: -1 });
[ { currentTime: -2, phase: 'before' },
- { currentTime: -1, phase: 'active' },
+ { currentTime: -1, phase: 'before' },
{ currentTime: 0, phase: 'after' } ]
.forEach(function(test) {
assert_phase_at_time(animation, test.phase, test.currentTime);
@@ -121,7 +121,8 @@ test(function(t) {
var animation = createDiv(t).animate(null, { duration: 1, endDelay: -2 });
[ { currentTime: -2, phase: 'before' },
- { currentTime: -1, phase: 'after' } ]
+ { currentTime: -1, phase: 'before' },
+ { currentTime: 0, phase: 'after' } ]
.forEach(function(test) {
assert_phase_at_time(animation, test.phase, test.currentTime);
});
@@ -133,8 +134,8 @@ test(function(t) {
delay: 1,
endDelay: -1 });
- [ { currentTime: 0, phase: 'before' },
- { currentTime: 1, phase: 'active' },
+ [ { currentTime: 0, phase: 'before' },
+ { currentTime: 1, phase: 'active' },
{ currentTime: 2, phase: 'after' } ]
.forEach(function(test) {
assert_phase_at_time(animation, test.phase, test.currentTime);
@@ -147,8 +148,9 @@ test(function(t) {
delay: -1,
endDelay: -1 });
- [ { currentTime: -2, phase: 'before' },
- { currentTime: -1, phase: 'after' } ]
+ [ { currentTime: -2, phase: 'before' },
+ { currentTime: -1, phase: 'before' },
+ { currentTime: 0, phase: 'after' } ]
.forEach(function(test) {
assert_phase_at_time(animation, test.phase, test.currentTime);
});
@@ -160,8 +162,10 @@ test(function(t) {
delay: -1,
endDelay: -2 });
- [ { currentTime: -3, phase: 'before' },
- { currentTime: -2, phase: 'after' } ]
+ [ { currentTime: -3, phase: 'before' },
+ { currentTime: -2, phase: 'before' },
+ { currentTime: -1, phase: 'before' },
+ { currentTime: 0, phase: 'after' } ]
.forEach(function(test) {
assert_phase_at_time(animation, test.phase, test.currentTime);
});
diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/set-the-target-effect-of-an-animation.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/set-the-target-effect-of-an-animation.html
new file mode 100644
index 00000000000..4c51f0141c3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/set-the-target-effect-of-an-animation.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Setting the target effect tests</title>
+<link rel='help' href='https://w3c.github.io/web-animations/#setting-the-target-effect'>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<script src='../../testcommon.js'></script>
+<body>
+<div id='log'></div>
+<script>
+'use strict';
+
+promise_test(function(t) {
+ var anim = createDiv(t).animate({ marginLeft: [ '0px', '100px' ] },
+ 100 * MS_PER_SEC);
+ assert_equals(anim.playState, 'pending');
+
+ var retPromise = anim.ready.then(function() {
+ assert_unreached('ready promise is fulfilled');
+ }).catch(function(err) {
+ assert_equals(err.name, 'AbortError',
+ 'ready promise is rejected with AbortError');
+ });
+
+ anim.effect = null;
+ assert_equals(anim.playState, 'paused');
+
+ return retPromise;
+}, 'If new effect is null and old effect is not null, we reset the pending ' +
+ 'tasks and ready promise is rejected');
+
+promise_test(function(t) {
+ var anim = new Animation();
+ anim.pause();
+ assert_equals(anim.playState, 'pending');
+
+ anim.effect = new KeyframeEffectReadOnly(createDiv(t),
+ { marginLeft: [ '0px', '100px' ] },
+ 100 * MS_PER_SEC);
+ assert_equals(anim.playState, 'pending');
+
+ return anim.ready.then(function() {
+ assert_equals(anim.playState, 'paused');
+ });
+}, 'If animation has a pending pause task, reschedule that task to run ' +
+ 'as soon as animation is ready.');
+
+promise_test(function(t) {
+ var anim = new Animation();
+ anim.play();
+ assert_equals(anim.playState, 'pending');
+
+ anim.effect = new KeyframeEffectReadOnly(createDiv(t),
+ { marginLeft: [ '0px', '100px' ] },
+ 100 * MS_PER_SEC);
+ assert_equals(anim.playState, 'pending');
+
+ return anim.ready.then(function() {
+ assert_equals(anim.playState, 'running');
+ });
+}, 'If animation has a pending play task, reschedule that task to run ' +
+ 'as soon as animation is ready to play new effect.');
+
+promise_test(function(t) {
+ var animA = createDiv(t).animate({ marginLeft: [ '0px', '100px' ] },
+ 100 * MS_PER_SEC);
+ var animB = new Animation();
+
+ return animA.ready.then(function() {
+ animB.effect = animA.effect;
+ assert_equals(animA.effect, null);
+ assert_equals(animA.playState, 'finished');
+ });
+}, 'When setting the effect of an animation to the effect of an existing ' +
+ 'animation, the existing animation\'s target effect should be set to null.');
+
+test(function(t) {
+ var animA = createDiv(t).animate({ marginLeft: [ '0px', '100px' ] },
+ 100 * MS_PER_SEC);
+ var animB = new Animation();
+ var effect = animA.effect;
+ animA.currentTime = 50 * MS_PER_SEC;
+ animB.currentTime = 20 * MS_PER_SEC;
+ assert_equals(effect.getComputedTiming().progress, 0.5,
+ 'Original timing comes from first animation');
+ animB.effect = effect;
+ assert_equals(effect.getComputedTiming().progress, 0.2,
+ 'After setting the effect on a different animation, ' +
+ 'it uses the new animation\'s timing');
+}, 'After setting the target effect of animation to the target effect of an ' +
+ 'existing animation, the target effect\'s timing is updated to reflect ' +
+ 'the current time of the new animation.');
+
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/updating-the-finished-state.html b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/updating-the-finished-state.html
index fc83e1e3590..7b9efedbf63 100644
--- a/tests/wpt/web-platform-tests/web-animations/timing-model/animations/updating-the-finished-state.html
+++ b/tests/wpt/web-platform-tests/web-animations/timing-model/animations/updating-the-finished-state.html
@@ -10,27 +10,11 @@
<script>
'use strict';
+// --------------------------------------------------------------------
//
-// NOTE TO THE POOR PERSON WHO HAS TO MERGE THIS WITH THE TEST OF THE SAME
-// NAME FROM BLINK
+// TESTS FOR UPDATING THE HOLD TIME
//
-// There is a pull request from Blink at:
-//
-// https://github.com/w3c/web-platform-tests/pull/3328
-//
-// which this file will surely conflict with.
-//
-// However, those tests cover a different part of the same algorithm. They
-// are mostly concerned with testing events and promises rather than the
-// timing part of the algorithm.
-//
-// The tests below cover the first part of the algorithm. So, please keep both
-// sets of tests and delete this comment. Preferably put the tests in this
-// file first.
-//
-// Thank you!
-//
-
+// --------------------------------------------------------------------
// CASE 1: playback rate > 0 and current time >= target effect end
// (Also the start time is resolved and there is pending task)
@@ -43,9 +27,9 @@ promise_test(function(t) {
// otherwise we don't have a resolved start time. We test the case
// where the start time is unresolved in a subsequent test.
return anim.ready.then(function() {
- // Seek to 1ms before the target end and wait a frame (> 16ms)
+ // Seek to 1ms before the target end and then wait 1ms
anim.currentTime = 100 * MS_PER_SEC - 1;
- return waitForAnimationFrames(1);
+ return waitForAnimationFramesWithDelay(1);
}).then(function() {
assert_equals(anim.currentTime, 100 * MS_PER_SEC,
'Hold time is set to target end clamping current time');
@@ -96,9 +80,9 @@ promise_test(function(t) {
anim.playbackRate = -1;
anim.play(); // Make sure animation is not initially finished
return anim.ready.then(function() {
- // Seek to 1ms before 0 end and wait a frame (> 16ms)
+ // Seek to 1ms before 0 and then wait 1ms
anim.currentTime = 1;
- return waitForAnimationFrames(1);
+ return waitForAnimationFramesWithDelay(1);
}).then(function() {
assert_equals(anim.currentTime, 0 * MS_PER_SEC,
'Hold time is set to zero clamping current time');
@@ -327,5 +311,100 @@ test(function(t) {
}, 'Updating the finished state when start time is unresolved and'
+ ' did seek = true');
+// --------------------------------------------------------------------
+//
+// TESTS FOR RUNNING FINISH NOTIFICATION STEPS
+//
+// --------------------------------------------------------------------
+
+function waitForFinishEventAndPromise(animation) {
+ var eventPromise = new Promise(function(resolve) {
+ animation.onfinish = function() { resolve(); }
+ });
+ return Promise.all([eventPromise, animation.finished]);
+}
+
+promise_test(function(t) {
+ var animation = createDiv(t).animate(null, 1);
+ animation.onfinish =
+ t.unreached_func('Seeking to finish should not fire finish event');
+ animation.finished.then(
+ t.unreached_func('Seeking to finish should not resolve finished promise'));
+ animation.currentTime = 1;
+ animation.currentTime = 0;
+ animation.pause();
+ return waitForAnimationFrames(3);
+}, 'Finish notification steps don\'t run when the animation seeks to finish'
+ + ' and then seeks back again');
+
+promise_test(function(t) {
+ var animation = createDiv(t).animate(null, 1);
+ return animation.ready.then(function() {
+ return waitForFinishEventAndPromise(animation);
+ });
+}, 'Finish notification steps run when the animation completes normally');
+
+promise_test(function(t) {
+ var animation = createDiv(t).animate(null, 1);
+ return animation.ready.then(function() {
+ animation.currentTime = 10;
+ return waitForFinishEventAndPromise(animation);
+ });
+}, 'Finish notification steps run when the animation seeks past finish');
+
+promise_test(function(t) {
+ var animation = createDiv(t).animate(null, 1);
+ return animation.ready.then(function() {
+ // Register for notifications now since once we seek away from being
+ // finished the 'finished' promise will be replaced.
+ var finishNotificationSteps = waitForFinishEventAndPromise(animation);
+ animation.finish();
+ animation.currentTime = 0;
+ animation.pause();
+ return finishNotificationSteps;
+ });
+}, 'Finish notification steps run when the animation completes with .finish(),'
+ + ' even if we then seek away');
+
+promise_test(function(t) {
+ var animation = createDiv(t).animate(null, 1);
+ var initialFinishedPromise = animation.finished;
+
+ return animation.finished.then(function(target) {
+ animation.currentTime = 0;
+ assert_not_equals(initialFinishedPromise, animation.finished);
+ });
+}, 'Animation finished promise is replaced after seeking back to start');
+
+promise_test(function(t) {
+ var animation = createDiv(t).animate(null, 1);
+ var initialFinishedPromise = animation.finished;
+
+ return animation.finished.then(function(target) {
+ animation.play();
+ assert_not_equals(initialFinishedPromise, animation.finished);
+ });
+}, 'Animation finished promise is replaced after replaying from start');
+
+async_test(function(t) {
+ var animation = createDiv(t).animate(null, 1);
+ animation.onfinish = function(event) {
+ animation.currentTime = 0;
+ animation.onfinish = function(event) {
+ t.done();
+ };
+ };
+}, 'Animation finish event is fired again after seeking back to start');
+
+async_test(function(t) {
+ var animation = createDiv(t).animate(null, 1);
+ animation.onfinish = function(event) {
+ animation.play();
+ animation.onfinish = function(event) {
+ t.done();
+ };
+ };
+}, 'Animation finish event is fired again after replaying from start');
+
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-constantsourcenode-interface/test-constantsourcenode.html b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-constantsourcenode-interface/test-constantsourcenode.html
new file mode 100644
index 00000000000..a49ae875b23
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-constantsourcenode-interface/test-constantsourcenode.html
@@ -0,0 +1,135 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Test the ConstantSourceNode Interface</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+test(function(t) {
+ var ac = new AudioContext();
+
+ var csn = ac.createConstantSource();
+ assert_true(csn.offset.value == 1.0, "Default offset is 1.0");
+
+ csn = new ConstantSourceNode(ac);
+ assert_true(csn.offset.value == 1.0, "Default offset is 1.0");
+
+ csn = new ConstantSourceNode(ac, {offset: -0.25});
+ assert_true(csn.offset.value == -0.25, "Offset can be set during construction");
+}, "ConstantSourceNode can be constructed");
+
+test(function(t) {
+ var ac = new AudioContext();
+
+ var csn = ac.createConstantSource();
+
+ assert_throws("InvalidStateError", function() {
+ csn.stop(1);
+ }, "Start must be called before stop");
+
+ assert_throws("NotSupportedError", function() {
+ csn.start(-1);
+ }, "When can not be negative");
+
+ csn.start(0);
+ assert_throws("NotSupportedError", function() {
+ csn.stop(-1);
+ }, "When can not be negative");
+}, "ConstantSourceNode stop and start");
+
+async_test(function(t) {
+ var ac = new OfflineAudioContext(1, 2048, 44100);
+ var csn = ac.createConstantSource();
+ csn.connect(ac.destination);
+ csn.start()
+ csn.stop(1024/44100)
+ csn.onended = function(e) {
+ t.step(function() {
+ assert_true(e.type == "ended", "Event type should be 'ended', received: " + e.type);
+ });
+ t.done();
+ }
+ ac.startRendering();
+}, "ConstantSourceNode onended event");
+
+async_test(function(t) {
+ var ac = new OfflineAudioContext(1, 2048, 44100);
+ var csn = ac.createConstantSource();
+ csn.connect(ac.destination);
+ csn.start(512/44100)
+ csn.stop(1024/44100)
+
+ ac.oncomplete = function(e) {
+ t.step(function() {
+ var result = e.renderedBuffer.getChannelData(0);
+ for (var i = 0; i < 2048; ++i) {
+ if (i >= 512 && i < 1024) {
+ assert_true(result[i] == 1.0, "sample " + i + " should equal 1.0");
+ } else {
+ assert_true(result[i] == 0.0, "sample " + i + " should equal 0.0");
+ }
+ }
+ });
+ t.done();
+ }
+
+ ac.startRendering();
+}, "ConstantSourceNode start and stop when work");
+
+async_test(function(t) {
+ var ac = new OfflineAudioContext(1, 2048, 44100);
+ var csn = ac.createConstantSource();
+ csn.offset.value = 0.25;
+ csn.connect(ac.destination);
+ csn.start()
+
+ ac.oncomplete = function(e) {
+ t.step(function() {
+ var result = e.renderedBuffer.getChannelData(0);
+ for (var i = 0; i < 2048; ++i) {
+ assert_true(result[i] == 0.25, "sample " + i + " should equal 0.25");
+ }
+ });
+ t.done();
+ }
+
+ ac.startRendering();
+}, "ConstantSourceNode with no automation");
+
+async_test(function(t) {
+ var ac = new OfflineAudioContext(1, 2048, 44100);
+
+ var timeConstant = 2.0;
+ var offsetStart = 0.25;
+ var offsetEnd = 0.1;
+
+ var csn = ac.createConstantSource();
+ csn.offset.value = offsetStart;
+ csn.offset.setTargetAtTime(offsetEnd, 1024/ac.sampleRate, timeConstant);
+ csn.connect(ac.destination);
+ csn.start()
+
+ ac.oncomplete = function(e) {
+ t.step(function() {
+ // create buffer with expected values
+ var buffer = ac.createBuffer(1, 2048, ac.sampleRate);
+ for (var i = 0; i < 2048; ++i) {
+ if (i < 1024) {
+ buffer.getChannelData(0)[i] = offsetStart;
+ } else {
+ time = (i-1024)/ac.sampleRate;
+ buffer.getChannelData(0)[i] = offsetEnd + (offsetStart - offsetEnd)*Math.exp(-time/timeConstant);
+ }
+ }
+
+ var result = e.renderedBuffer.getChannelData(0);
+ var expected = buffer.getChannelData(0);
+ for (var i = 0; i < 2048; ++i) {
+ assert_true(Math.abs(result[i] - expected[i]) < 1e-6, "sample " + i + " should equal " + expected[i]);
+ }
+ });
+ t.done();
+ }
+
+ ac.startRendering();
+}, "ConstantSourceNode with automation");
+</script>
diff --git a/tests/wpt/web-platform-tests/webauthn/interfaces.https.html b/tests/wpt/web-platform-tests/webauthn/interfaces.https.html
new file mode 100644
index 00000000000..36254ee8952
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webauthn/interfaces.https.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>WebAuthn WebIDL Tests</title>
+<link rel="author" title="Adam Powers" href="mailto:adam@fidoalliance.org">
+<link rel="help" href="https://w3c.github.io/webauthn/#iface-credential">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<!-- for testing WebIDL -->
+<script src=/resources/WebIDLParser.js></script>
+<script src=/resources/idlharness.js></script>
+<body></body>
+<script>
+// IIFE for namespace cleanliness
+(function() {
+ "use strict";
+
+
+ //************* BEGIN DELETE AFTER 1/1/2017 *************** //
+ // XXX for development mode only!!
+ // debug() for debugging purposes... we can drop this later if it is considered ugly
+ // note that debug is currently an empty function (i.e. - prints no output)
+ // and debug only prints output if the polyfill is loaded
+ var debug = function() {};
+ // if the WebAuthn API doesn't exist load a polyfill for testing
+ // note that the polyfill only gets loaded if navigator.authentication doesn't exist
+ // AND if the polyfill script is found at the right path (i.e. - the polyfill is opt-in)
+ function ensureInterface() {
+ return new Promise(function(resolve, reject) {
+ if (typeof navigator.authentication !== "object") {
+ debug = console.log;
+
+ // dynamic loading of polyfill script by creating new <script> tag and seeing the src=
+ var scriptElem = document.createElement("script");
+ if (typeof scriptElem !== "object") {
+ debug("ensureInterface: Error creating script element while attempting loading polyfill");
+ return reject(new Error("ensureInterface: Error creating script element while loading polyfill"));
+ }
+ scriptElem.type = "application/javascript";
+ scriptElem.onload = function() {
+ debug("!!! XXX - LOADING POLYFILL FOR WEBAUTHN TESTING - XXX !!!");
+ return resolve();
+ };
+ scriptElem.onerror = function() {
+ return reject(new Error("navigator.authentication does not exist"));
+ };
+ scriptElem.src = "/webauthn/webauthn-polyfill/webauthn-polyfill.js";
+ if (document.body) {
+ document.body.appendChild(scriptElem);
+ } else {
+ debug("ensureInterface: DOM has no body");
+ return reject(new Error("ensureInterface: DOM has no body"));
+ }
+ }
+ });
+ }
+ //************* END DELETE AFTER 1/1/2017 *************** //
+
+ // loads an IDL file from the webserver
+ function fetchIdl(idlUrl) {
+ return new Promise(function(resolve, reject) {
+ if (typeof idlUrl !== "string") {
+ return reject("fetchIdl: expected argument to be URL string");
+ }
+ var request = new XMLHttpRequest();
+ request.open("GET", idlUrl);
+ request.send();
+ request.onload = function() {
+ var idls = request.responseText;
+ return resolve(idls);
+ };
+ });
+ }
+
+ // this does the real work of running the IDL tests
+ function runIdlTests(idls) {
+ return new Promise(function(resolve, reject) {
+ var idlArray = new window.IdlArray();
+
+ // static IDL tests
+ idlArray.add_untested_idls("interface Navigator { };");
+ // TODO: change to "tested" for real browsers?
+ idlArray.add_untested_idls("partial interface Navigator { readonly attribute WebAuthentication authentication; };");
+ idlArray.add_objects({
+ WebAuthentication: ["navigator.authentication"]
+ });
+
+ // run test WebIDL tests loaded from the idls file
+ idlArray.add_idls(idls);
+ return resolve(idlArray.test());
+ });
+ }
+
+ // test harness function
+ window.promise_test(function() {
+ return ensureInterface() // ensure we have navigator.authentication ...
+ .then(function() { // ... then load the IDL file ...
+ return fetchIdl("interfaces.idl");
+ })
+ .then(function(idls) { // ... then run the tests.
+ return runIdlTests(idls);
+ });
+ }, "Validate WebAuthn IDL");
+}());
+</script>
diff --git a/tests/wpt/web-platform-tests/webauthn/interfaces.idl b/tests/wpt/web-platform-tests/webauthn/interfaces.idl
new file mode 100644
index 00000000000..a42ac1e37cc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webauthn/interfaces.idl
@@ -0,0 +1,14 @@
+[SecureContext, NoInterfaceObject] interface WebAuthentication {
+ Promise < ScopedCredentialInfo > makeCredential (
+ Account accountInformation,
+ sequence < ScopedCredentialParameters > cryptoParameters,
+ BufferSource attestationChallenge,
+ optional ScopedCredentialOptions options
+ );
+
+ Promise < WebAuthnAssertion > getAssertion (
+ BufferSource assertionChallenge,
+ optional AssertionOptions options
+ );
+};
+
diff --git a/tests/wpt/web-platform-tests/webdriver/README.md b/tests/wpt/web-platform-tests/webdriver/README.md
index ef0f1d2b511..bc863c47f9c 100644
--- a/tests/wpt/web-platform-tests/webdriver/README.md
+++ b/tests/wpt/web-platform-tests/webdriver/README.md
@@ -6,3 +6,95 @@ known as [WebDriver](http://w3c.github.io/webdriver/webdriver-spec.html).
The purpose of these tests is determine implementation compliance
so that different driver implementations can determine
whether they meet the recognised standard.
+
+## Chapters of the Spec that still need tests
+
+Note: Sections that are currently we believe are not quite stable enough for tests yet are in <span style="color:red;">red</span>.
+Note: Sections that likely have enough tests for now are marked in <span style="color:green;">green</span>.
+
+* Routing Requests
+* List of Endpoints (existance tests)
+* List of Error Codes (Description is NON Normative)
+* Capabilities
+* Sessions
+* Delete Session
+* Set Timeouts
+* Navigation
+** Get Current URL
+** Back
+** Forward
+** Refresh
+** Get Title
+* Command Contexts
+** Get Window Handle
+** Close Window
+** Switch To Window
+** Get Window Handles
+** Switch To Frame
+** Switch To Parent Frame
+* Resizing and Positioning Windows
+** Get Window Size
+** Set Window Size
+** Get Window Position
+** Set Window Position
+** Maximize Window
+** Minimize Window
+** Fullscreen Window
+* Elements
+** Element Interactability
+** Get Active Element
+* Element Retrieval
+** Locator Strategies
+*** CSS Selectors
+*** Link Text
+*** Partial Link Text
+*** XPath
+** Find Element
+** Find Elements
+** Find Element from Element
+** Find Elements from Element
+* Element State
+** Is Element Selected
+** Get Element Attribute
+** Get Element Property
+** Get Element CSS value
+** Get Element Text
+** Get Element Tag name
+** Get Element Rect
+** Is Element Enabled
+* Element Interaction
+** Element Click
+** Element Clear
+** Element Send Keys
+* Document Handling
+** Getting Page Source
+** Executing Script
+** Execute Script
+** Execute Async Script
+* Cookies
+** Get All Cookies
+** Get Named Cookies
+** Add Cookie
+** Delete Cookie
+** Delete All Cookies
+* <span style="color:red;">Actions
+** Input State
+** Processing Actions Requests
+** Dispatching Actions
+** General Actions
+** Keyboard Actions
+** Pointer Actions
+** Perform Actions
+** Remote End Steps (non-Normative)
+** Releasing Actions</span>
+* User Prompts
+** Dismiss Alert
+** Accept Alert
+** Get Alert Text
+** Send Alert Text
+* Screen Capture
+** Take Screenshot
+** Take Element Screenshot
+* <span style="color:green;">Privacy</span>
+* <span style="color:green;">Security</span>
+* Element Displayedness \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/webdriver/contexts.py b/tests/wpt/web-platform-tests/webdriver/contexts.py
index 9bbf97d4696..c49f85b4635 100644
--- a/tests/wpt/web-platform-tests/webdriver/contexts.py
+++ b/tests/wpt/web-platform-tests/webdriver/contexts.py
@@ -1,27 +1,75 @@
-def test_resize(session):
+import json
+import pytest
+import webdriver
+
+
+@pytest.mark.xfail(raises=webdriver.UnsupportedOperationException)
+def test_window_size_types(http, session):
+ session.start()
+ with http.get("/session/%s/window/size" % session.session_id) as resp:
+ assert resp.status == 200
+ body = json.load(resp)
+ assert "width" in body
+ assert "height" in body
+ assert isinstance(body["width"], int)
+ assert isinstance(body["height"], int)
+
+ size = session.window.size
+ assert isinstance(size, tuple)
+ assert isinstance(size[0], int)
+ assert isinstance(size[1], int)
+
+
+@pytest.mark.xfail(raises=webdriver.UnsupportedOperationException)
+def test_window_resize(session):
# setting the window size by webdriver is synchronous
# so we should see the results immediately
- session.window.size = (200, 100)
- assert session.window.size == {"width": 100, "height": 200}
+ session.window.size = (400, 500)
+ assert session.window.size == (400, 500)
- session.window.size = (100, 200)
- assert session.window.size == {"width": 200, "height": 100}
+ session.window.size = (500, 600)
+ assert session.window.size == (500, 600)
-def test_resize_by_script(session):
+
+"""
+TODO(ato):
+
+ Disable test because the while statements are wrong.
+ To fix this properly we need to write an explicit wait utility.
+
+def test_window_resize_by_script(session):
# setting the window size by JS is asynchronous
# so we poll waiting for the results
size0 = session.window.size
- session.execute_script("window.resizeTo(100, 200)")
+ session.execute_script("window.resizeTo(700, 800)")
size1 = session.window.size
while size0 == size1:
size1 = session.window.size
- assert size1 == {"width": 100, "height": 200}
+ assert size1 == (700, 800)
- session.execute_script("window.resizeTo(200, 100)")
+ session.execute_script("window.resizeTo(800, 900)")
size2 = session.window.size
while size1 == size2:
size2 = session.window.size
+ assert size2 == (800, 900)
assert size2 == {"width": 200, "height": 100}
+"""
+
+@pytest.mark.xfail(raises=webdriver.UnsupportedOperationException)
+def test_window_position_types(http, session):
+ session.start()
+ with http.get("/session/%s/window/position" % session.session_id) as resp:
+ assert resp.status == 200
+ body = json.load(resp)
+ assert "x" in body
+ assert "y" in body
+ assert isinstance(body["x"], int)
+ assert isinstance(body["y"], int)
+
+ size = session.window.position
+ assert isinstance(size, tuple)
+ assert isinstance(size[0], int)
+ assert isinstance(size[1], int)
diff --git a/tests/wpt/web-platform-tests/webdriver/navigation.py b/tests/wpt/web-platform-tests/webdriver/navigation.py
index 1b39aa44a6e..74f4ef9f709 100644
--- a/tests/wpt/web-platform-tests/webdriver/navigation.py
+++ b/tests/wpt/web-platform-tests/webdriver/navigation.py
@@ -1,5 +1,3 @@
-import contextlib
-import httplib
import json
import pytest
import types
@@ -18,32 +16,6 @@ one_frame_doc = inline("<iframe src='%s'></iframe>" % frame_doc)
two_frames_doc = inline("<iframe src='%s'></iframe>" % one_frame_doc)
-class HTTPRequest(object):
- def __init__(self, host, port):
- self.host = host
- self.port = port
-
- def head(self, path):
- return self._request("HEAD", path)
-
- def get(self, path):
- return self._request("GET", path)
-
- @contextlib.contextmanager
- def _request(self, method, path):
- conn = httplib.HTTPConnection(self.host, self.port)
- try:
- conn.request(method, path)
- yield conn.getresponse()
- finally:
- conn.close()
-
-
-@pytest.fixture
-def http(request, session):
- return HTTPRequest(session.transport.host, session.transport.port)
-
-
@pytest.fixture
def new_window(session):
"""Open new window and return the window handle."""
diff --git a/tests/wpt/web-platform-tests/webmessaging/OWNERS b/tests/wpt/web-platform-tests/webmessaging/OWNERS
index bff9fad87de..94f8bf98eb4 100644
--- a/tests/wpt/web-platform-tests/webmessaging/OWNERS
+++ b/tests/wpt/web-platform-tests/webmessaging/OWNERS
@@ -1,5 +1,4 @@
@zqzhang
-@sideshowbarker
@plehegar
@aogilvie
@Ms2ger
diff --git a/tests/wpt/web-platform-tests/webrtc/OWNERS b/tests/wpt/web-platform-tests/webrtc/OWNERS
index 1deb98d49c9..f1e332cff7e 100644
--- a/tests/wpt/web-platform-tests/webrtc/OWNERS
+++ b/tests/wpt/web-platform-tests/webrtc/OWNERS
@@ -1,4 +1,3 @@
@dontcallmedom
-@tidoust
@alvestrand
@phoglund
diff --git a/tests/wpt/web-platform-tests/webrtc/rtcpeerconnection/rtcpeerconnection-constructor.html b/tests/wpt/web-platform-tests/webrtc/rtcpeerconnection/rtcpeerconnection-constructor.html
new file mode 100644
index 00000000000..ee352ac84f3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/rtcpeerconnection/rtcpeerconnection-constructor.html
@@ -0,0 +1,156 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCPeerConnection constructor</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+test(function() {
+ assert_equals(RTCPeerConnection.length, 0);
+}, 'RTCPeerConnection.length');
+
+// These are used for string and number dictionary members to see if they are
+// being accessed at all.
+const toStringThrows = { toString: function() { throw new Error; } };
+const toNumberThrows = Symbol();
+
+// Test the first argument of the constructor. The key is the argument itself,
+// and the value is the first argument for assert_throws, or false if no
+// exception should be thrown.
+const testArgs = {
+ // No argument or equivalent.
+ '': false,
+ 'null': false,
+ 'undefined': false,
+ '{}': false,
+
+ // iceServers
+ '{ iceServers: null }': new TypeError,
+ '{ iceServers: undefined }': false,
+ '{ iceServers: [] }': false,
+ '{ iceServers: [{}] }': new TypeError,
+ '{ iceServers: [null] }': new TypeError,
+ '{ iceServers: [undefined] }': new TypeError,
+ '{ iceServers: [{ urls: "stun:stun1.example.net" }] }': false,
+ '{ iceServers: [{ urls: [] }] }': false,
+ '{ iceServers: [{ urls: ["stun:stun1.example.net"] }] }': false,
+ '{ iceServers: [{ urls: ["stun:stun1.example.net", "stun:stun2.example.net"] }] }': false,
+ // username and password required for turn: and turns:
+ '{ iceServers: [{ urls: "turns:turn.example.org", username: "user", credential: "cred" }] }': false,
+ '{ iceServers: [{ urls: "turn:turn.example.net", username: "user", credential: "cred" }] }': false,
+ '{ iceServers: [{ urls: "turns:turn.example.org", username: "", credential: "" }] }': false,
+ '{ iceServers: [{ urls: "turn:turn.example.net", username: "", credential: "" }] }': false,
+ '{ iceServers: [{ urls: ["turns:turn.example.org", "turn:turn.example.net"], username: "user", credential: "cred" }] }': false,
+ '{ iceServers: [{ urls: "stun:stun1.example.net", credentialType: "password" }] }': false,
+ '{ iceServers: [{ urls: "stun:stun1.example.net", credentialType: "token" }] }': false,
+ '{ iceServers: [{ urls: "turn:turn.example.net" }] }': 'InvalidAccessError',
+ '{ iceServers: [{ urls: "turn:turn.example.net", username: "user" }] }': 'InvalidAccessError',
+ '{ iceServers: [{ urls: "turn:turn.example.net", credential: "cred" }] }': 'InvalidAccessError',
+ '{ iceServers: [{ urls: "turns:turn.example.org" }] }': 'InvalidAccessError',
+ '{ iceServers: [{ urls: "turns:turn.example.org", username: "user" }] }': 'InvalidAccessError',
+ '{ iceServers: [{ urls: "turns:turn.example.org", credential: "cred" }] }': 'InvalidAccessError',
+ '{ iceServers: [{ urls: "relative-url" }] }': 'SyntaxError',
+ '{ iceServers: [{ urls: "http://example.com" }] }': 'SyntaxError',
+ // credentialType
+ '{ iceServers: [{ urls: [] }] }': false,
+ '{ iceServers: [{ urls: [], credentialType: "password" }] }': false,
+ '{ iceServers: [{ urls: [], credentialType: "token" }] }': false,
+ '{ iceServers: [{ urls: [], credentialType: "invalid" }] }': new TypeError,
+ // Blink and Gecko fall back to url, but it's not in the spec.
+ '{ iceServers: [{ url: "stun:stun1.example.net" }] }': new TypeError,
+
+ // iceTransportPolicy
+ '{ iceTransportPolicy: null }': new TypeError,
+ '{ iceTransportPolicy: undefined }': false,
+ '{ iceTransportPolicy: "relay" }': false,
+ '{ iceTransportPolicy: "all" }': false,
+ '{ iceTransportPolicy: "invalid" }': new TypeError,
+ // "none" is in Blink and Gecko's IDL, but not in the spec.
+ '{ iceTransportPolicy: "none" }': new TypeError,
+ // iceTransportPolicy is called iceTransports in Blink.
+ '{ iceTransports: "invalid" }': false,
+ '{ iceTransports: "none" }': false,
+
+ // bundlePolicy
+ '{ bundlePolicy: null }': new TypeError,
+ '{ bundlePolicy: undefined }': false,
+ '{ bundlePolicy: "balanced" }': false,
+ '{ bundlePolicy: "max-compat" }': false,
+ '{ bundlePolicy: "max-bundle" }': false,
+ '{ bundlePolicy: "invalid" }': new TypeError,
+
+ // rtcpMuxPolicy
+ '{ rtcpMuxPolicy: null }': new TypeError,
+ '{ rtcpMuxPolicy: undefined }': false,
+ '{ rtcpMuxPolicy: "negotiate" }': false,
+ '{ rtcpMuxPolicy: "require" }': false,
+ '{ rtcpMuxPolicy: "invalid" }': new TypeError,
+
+ // peerIdentity
+ '{ peerIdentity: toStringThrows }': new Error,
+
+ // certificates
+ '{ certificates: null }': new TypeError,
+ '{ certificates: undefined }': false,
+ '{ certificates: [] }': false,
+ '{ certificates: [null] }': new TypeError,
+ '{ certificates: [undefined] }': new TypeError,
+
+ // iceCandidatePoolSize
+ '{ iceCandidatePoolSize: toNumberThrows }': new TypeError,
+}
+
+for (const arg in testArgs) {
+ const expr = 'new RTCPeerConnection(' + arg + ')';
+ test(function() {
+ const throws = testArgs[arg];
+ if (throws) {
+ assert_throws(throws, function() {
+ eval(expr);
+ });
+ } else {
+ eval(expr);
+ }
+ }, expr);
+}
+
+promise_test(function() {
+ return RTCPeerConnection.generateCertificate({ name: "ECDSA", namedCurve: "P-256" })
+ .then(certificate => new RTCPeerConnection({ certificates: [certificate] }));
+}, 'new RTCPeerConnection({ certificates: [certificate] })');
+
+promise_test(function() {
+ return RTCPeerConnection.generateCertificate({ name: "ECDSA", namedCurve: "P-256", expires: 0 })
+ .then(certificate => {
+ assert_less_than_equal(certificate.expires, Date.now());
+ assert_throws('InvalidAccessError', function() {
+ new RTCPeerConnection({ certificates: [certificate] });
+ });
+ });
+}, 'new RTCPeerConnection({ certificates: [expiredCertificate] })');
+
+// The initial values of attributes of RTCPeerConnection.
+const initialState = {
+ 'localDescription': null,
+ 'currentLocalDescription': null,
+ 'pendingLocalDescription': null,
+ 'remoteDescription': null,
+ 'currentRemoteDescription': null,
+ 'pendingRemoteDescription': null,
+ 'signalingState': 'stable',
+ 'iceGatheringState': 'new',
+ 'iceConnectionState': 'new',
+ 'connectionState': 'new',
+ 'canTrickleIceCandidates': null,
+ // TODO: defaultIceServers
+};
+
+for (const attr in initialState) {
+ test(function() {
+ // Use one RTCPeerConnection instance for all initial value tests.
+ if (!window.pc) {
+ window.pc = new RTCPeerConnection;
+ }
+ assert_equals(pc[attr], initialState[attr]);
+ }, attr + ' initial value');
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/simplecall.html b/tests/wpt/web-platform-tests/webrtc/simplecall.html
index 69858689409..94d5ea6f761 100644
--- a/tests/wpt/web-platform-tests/webrtc/simplecall.html
+++ b/tests/wpt/web-platform-tests/webrtc/simplecall.html
@@ -1,9 +1,11 @@
<!doctype html>
<!--
-To quickly iterate when developing this test, use --use-fake-ui-for-media-stream
-for Chrome and set the media.navigator.permission.disabled property to true in
-Firefox. You must either have a webcam/mic available on the system or use for
-instance --use-fake-device-for-media-stream for Chrome.
+To run this test, you must have a webcam and a microphone or use
+fake devices by specifying
+ --use-fake-device-for-media-stream --use-fake-ui-for-media-stream
+for Chrome or by setting the
+ media.navigator.streams.fake
+property to true in Firefox.
-->
<html>
@@ -108,9 +110,8 @@ instance --use-fake-device-for-media-stream for Chrome.
// This function starts the test.
test.step(function() {
- navigator.getUserMedia({ video: true, audio: true },
- getUserMediaOkCallback,
- failed('getUserMedia'));
+ navigator.mediaDevices.getUserMedia({ video: true, audio: true })
+ .then(getUserMediaOkCallback, failed('getUserMedia'));
});
</script>
diff --git a/tests/wpt/web-platform-tests/websockets/OWNERS b/tests/wpt/web-platform-tests/websockets/OWNERS
index de8d614a7c8..a2cbe188a5c 100644
--- a/tests/wpt/web-platform-tests/websockets/OWNERS
+++ b/tests/wpt/web-platform-tests/websockets/OWNERS
@@ -2,7 +2,6 @@
@zcorpan
@plehegar
@zqzhang
-@sideshowbarker
@Jxck
@jdm
@Ms2ger
diff --git a/tests/wpt/web-platform-tests/websockets/multi-globals/message-received.html b/tests/wpt/web-platform-tests/websockets/multi-globals/message-received.html
new file mode 100644
index 00000000000..58d8d84c6ea
--- /dev/null
+++ b/tests/wpt/web-platform-tests/websockets/multi-globals/message-received.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<title>"A WebSocket message has been received", with multiple globals in play</title>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/comms.html#feedback-from-the-protocol">
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../websocket.sub.js"></script>
+
+<!-- This is the entry global -->
+
+<iframe src="support/incumbent.sub.html"></iframe>
+
+<script>
+"use strict";
+setup({ explicit_done: true });
+
+window.onload = function() {
+ async_test(function(t) {
+ frames[0].setupWebSocket("arraybuffer", t.step_func_done(function(relevantWindow, event) {
+ assert_equals(event.constructor, relevantWindow.MessageEvent);
+ assert_equals(event.data.constructor, relevantWindow.ArrayBuffer);
+ }));
+ }, "ArrayBuffer should be created in the relevant realm of the WebSocket");
+
+ async_test(function(t) {
+ frames[0].setupWebSocket("blob", t.step_func_done(function(relevantWindow, event) {
+ assert_equals(event.constructor, relevantWindow.MessageEvent);
+ assert_equals(event.data.constructor, relevantWindow.Blob);
+ }));
+ }, "Blob should be created in the relevant realm of the WebSocket");
+
+ done();
+};
+</script>
diff --git a/tests/wpt/web-platform-tests/websockets/multi-globals/support/incumbent.sub.html b/tests/wpt/web-platform-tests/websockets/multi-globals/support/incumbent.sub.html
new file mode 100644
index 00000000000..a138b702357
--- /dev/null
+++ b/tests/wpt/web-platform-tests/websockets/multi-globals/support/incumbent.sub.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<title>Incumbent page used as a test helper</title>
+
+<iframe src="relevant.html" id="r"></iframe>
+
+<script>
+"use strict";
+
+const relevant = document.querySelector("#r").contentWindow;
+
+window.setupWebSocket = (binaryType, fn) => {
+ const wsocket = new relevant.WebSocket("ws://{{host}}:{{ports[ws][0]}}/echo");
+
+ wsocket.addEventListener("open", () => {
+ wsocket.binaryType = binaryType;
+ wsocket.send(new ArrayBuffer(15));
+ });
+
+ wsocket.addEventListener("message", ev => {
+ fn(relevant, ev);
+ });
+};
+
+</script>
diff --git a/tests/wpt/web-platform-tests/websockets/multi-globals/support/relevant.html b/tests/wpt/web-platform-tests/websockets/multi-globals/support/relevant.html
new file mode 100644
index 00000000000..44f42eda493
--- /dev/null
+++ b/tests/wpt/web-platform-tests/websockets/multi-globals/support/relevant.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<title>Relevant page used as a test helper</title>
diff --git a/tests/wpt/web-platform-tests/workers/Worker_ErrorEvent_error.htm b/tests/wpt/web-platform-tests/workers/Worker_ErrorEvent_error.htm
new file mode 100644
index 00000000000..1c1257d1bd2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/Worker_ErrorEvent_error.htm
@@ -0,0 +1,29 @@
+<!doctype html>
+<meta charset=utf-8>
+<title></title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+var t1 = async_test("Error handler outside the worker should not see the error value");
+var t2 = async_test("Error handlers inside a worker should see the error value");
+
+test(function() {
+ var worker = new Worker("support/ErrorEvent-error.js");
+ worker.onerror = t1.step_func_done(function(e) {
+ assert_true(/hello/.test(e.message));
+ assert_equals(e.error, null);
+ });
+
+ var messages = 0;
+ worker.onmessage = t2.step_func(function(e) {
+ ++messages;
+ var data = e.data;
+ assert_true(data.source == "onerror" ||
+ data.source == "event listener");
+ assert_equals(data.value, "hello");
+ if (messages == 2) {
+ t2.done();
+ }
+ });
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/URLMismatchError.htm b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/URLMismatchError.htm
index e74e6607210..258eed05bf8 100644
--- a/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/URLMismatchError.htm
+++ b/tests/wpt/web-platform-tests/workers/constructors/SharedWorker/URLMismatchError.htm
@@ -1,19 +1,30 @@
<!DOCTYPE html>
<meta charset="utf-8">
-<title>Web Workers: SharedWorker - throw URLMismatchError</title>
+<title>Web Workers: SharedWorker - same name, different URL</title>
<link rel="author" title="Intel" href="http://www.intel.com">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<script>
+var counter = 0
+function maybeDone() {
+ if(counter) {
+ done()
+ }
+ counter++
+}
- test(function() {
- var worker = new SharedWorker('shared-worker.js', 'name');
-
- assert_throws("URLMismatchError", function() {
- new SharedWorker('some-other-url.js', 'name');
- });
-
- }, "Create SharedWorker with different URLs but same name");
+var worker = new SharedWorker('shared-worker.js', 'name');
+worker.port.postMessage("trigger a response")
+worker.port.onmessage = (e) => {
+ assert_equals(e.data, "ping")
+ maybeDone()
+}
+// This used to throw "URLMismatchError", but the standard changed
+var worker2 = new SharedWorker('1', 'name');
+worker2.port.onmessage = (e) => {
+ assert_array_equals(e.data, ["1", "name"])
+ maybeDone()
+}
</script>
diff --git a/tests/wpt/web-platform-tests/workers/data-url-shared.html b/tests/wpt/web-platform-tests/workers/data-url-shared.html
new file mode 100644
index 00000000000..64aacf26527
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/data-url-shared.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<title>data URL shared worker</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id=log></div>
+<script>
+async_test(t => {
+ var worker = new SharedWorker("data:,onconnect = (e) => { fetch('/').then(() => e.ports[0].postMessage('fail'), () => e.ports[0].postMessage('pass')) }") // not same-origin
+ worker.port.onmessage = t.step_func_done(e => {
+ assert_equals(e.data, "pass")
+ })
+})
+</script>
diff --git a/tests/wpt/web-platform-tests/workers/data-url.html b/tests/wpt/web-platform-tests/workers/data-url.html
new file mode 100644
index 00000000000..c212a699ec6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/data-url.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<title>data URL worker</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id=log></div>
+<script>
+async_test(t => {
+ var worker = new Worker("data:,fetch('/').then(() => self.postMessage('fail'), () => self.postMessage('pass'))") // not same-origin
+ worker.onmessage = t.step_func_done(e => {
+ assert_equals(e.data, "pass")
+ })
+})
+</script>
diff --git a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/window-only.worker.js b/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/window-only.worker.js
deleted file mode 100644
index 7095281ecd3..00000000000
--- a/tests/wpt/web-platform-tests/workers/interfaces/WorkerUtils/navigator/window-only.worker.js
+++ /dev/null
@@ -1,22 +0,0 @@
-importScripts("/resources/testharness.js");
-
-var properties = [
- "appCodeName",
- "product",
- "productSub",
- "vendor",
- "vendorSub",
-
- // Only exist in Window scopes if navigator compatibility mode is Gecko;
- // never exist in workers.
- "taintEnabled",
- "oscpu",
-];
-
-properties.forEach(function(property) {
- test(function() {
- assert_false(property in navigator);
- }, "NavigatorID properties exposed only for Window: " + property);
-});
-
-done();
diff --git a/tests/wpt/web-platform-tests/workers/support/ErrorEvent-error.js b/tests/wpt/web-platform-tests/workers/support/ErrorEvent-error.js
new file mode 100644
index 00000000000..930b54c0d58
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/support/ErrorEvent-error.js
@@ -0,0 +1,9 @@
+onerror = function(message, location, line, col, error) {
+ postMessage({ source: "onerror", value: error });
+}
+
+addEventListener("error", function(e) {
+ postMessage({ source: "event listener", value: e.error });
+});
+
+throw "hello";